【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください

商品管理にマクロを使用しています。W列に仕入日、X列に仕入れ品名、Y、Z、AAには内容物の個数を入力しています。AL列には販売済み品名、AM,AN,AOには数字が入っていますが基本1に想定しています。仕入れ品は1箱に複数個のものもあり、便宜上個々としてバラす(AA列の数)必要があります。X:AAは仕入れ品名と日付で昇順し、販売済み品は同一の品名を統合し、数字は合算した形からAAをバラさずにApplication.Matchを実行すると完璧に走ってくれることは確認できています。つぎにAAをバラすため 、別シートからX1に貼り付けたのちに
Dim i As Variant
For i = Cells(Rows.Count, "AA").End(xlUp).Row To 1 Step -1
If Cells(i, "AA").Value > 1 Then
Range(Cells(i, "W"), Cells(i, "AA")).Copy
Range(Cells(i + 1, "W"), Cells(i + 1, "AA")).Resize(Cells(i, "AA").Value - 1).Insert
End If
Next
Application.CutCopyMode = False
を追加すると、X列の途中(AL列の統合前の最終行?)までしか見に行かずに”見当たりません”のメッセージが返ってきます。
あらかじめ別シートでバラしてから本シートのX1に貼り付けてVBAを走らせても結果は同じで止まります。
バラにしなければ走る、VBAを追加すると止まるのはなぜでしょうか?どこかを修正すればX列を最後まで検索してくれるようになるのでしょうか。
さほど知識がないので何日も考え、試しています。
是非ともご教授お願いいたします。

質問者からの補足コメント

  • 断片的で申し訳ないのですが
    Dim valLMNO() As Variant
    ReDim valLMNO(1 To dicAH.Count, 1 To 4)
    For i = 1 To Cells(Rows.Count, "AM").End(xlUp).Row
    If Cells(i, "AL") <> "" Then
    Dim rowX As Variant
    rowX = Application.Match(Cells(i, "AL"), Columns("X"), 0)
    If Not IsError(rowX) Then
    Else
    MsgBox "入庫履歴が見当たりません:" & Cells(i, "AL"), vbExclamation

    No.1の回答に寄せられた補足コメントです。 補足日時:2024/11/25 15:57
  • X列の最終行を取得して走らせようとすると、今度はApplication.Matchを実行しない感じなんです。
    Dim i As Variant
    For i = Cells(Rows.Count, "AA").End(xlUp).Row To 1 Step -1
    If Cells(i, "AA").Value > 1 Then
    Range(Cells(i, "W"), Cells(i, "AA")).Copy
    Range(Cells(i + 1, "W"), Cells(i + 1, "AA")).Resize(Cells(i, "AA").Value - 1).Insert
    End If
    Next
    Application.CutCopyMode = False
    なぜに上記を走らせると止まるのか。考えられることだけでもお聞かせ願いたいです。

      補足日時:2024/11/25 16:09
  • つらい・・・

    アドバイスありがとうございます。”見当たらない”とされた行以降については、ソートをかけて検索範囲をシャッフルし走らせても、同様に最終検索値の行までを検索範囲とされてしまいます。しかしながら先に検索しなかった値については検索値よりも若い行にある値はマッチしましたので記入ミスではないと考えます。
    また、正常に走ったシートの検索範囲の一行を複製し、再度走らせると同様に最終検索値の行までを検索範囲とされてしまいます。
    意味不明なことを記述していると思われる方もいらっしゃると思いますが、VBAにたけてないなりに本当に悩んでおりますので、解釈いただきご名答を願うばかりです。
    検索範囲の同行にある特定列の数字の分を複製する作業はmustで、複製しなければ正常動作、複製すると最終検索値の行までしか検索範囲としなくなります。
    対策があればご教授願いたいです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2024/11/27 11:00

A 回答 (4件)

No1です。



補足ありがとうございます。
>rowX = Application.Match(Cells(i, "AL"), Columns("X"), 0)
が問題のセンテンスということだと解釈しました。

エラー処理がされているので、その際にAL列の値が表示されていると思いますが、その値がX列に存在しているように見えるのに、エラー扱いになってしまっているという主旨のご質問であろうと推測しました。


>どこかを修正すればX列を最後まで検索してくれるように~~
検索範囲の指定はX列全体になっていますので、列全体を検索しているはずです。
それでも「見つからない」ということは、列全体を検索しても見つからないということを意味します。
考えられるのは、「見た目には同じ値だけれど、エクセル上は異なるものと認識されている」ということでしょう。

例えば、文字列検索の場合なら、一方の文字列の前後にスペース等の見えない文字が付いているとか。
数値の検索であれば、一方が文字列になっているとか。
数値の123と文字列の"123"は異なるものと見做されます。


例えば、エラーになった時点での該当行はわかるでしょうから、その際のAL列のセルに対して、どこかの空きセルに
 =Match(検索セル, X:X, 0)
の関数を入れても、エラー表示になりませんか?
あるいは、該当しているはずのセルを「該当セル」とするなら、空きセルに
 =検索セル=該当セル
の式を入力しても、結果はFalseになるだろうと推測します。
(↑は値が同じではないという意味になります。同じなら結果はTrue)

原因は上記だと推測しますので、検索値と該当しているはずのセルの値との相違を詳しく調べてみれば解決するのではないかと思います。
この回答への補足あり
    • good
    • 0

No3です。



>意味不明なことを記述していると思われる方もいらっしゃると思いますが
はい意味不明です。
質問者様にしかわからないことを、質問者様にしかわからない言葉で説明しているので、サッパリわかりません。

最初のご質問文からは、「Matchで検索しても、(ヒットするはずなのに)ヒットしない」というご質問だと思っていましたが・・
>最終検索値の行までを検索範囲とされてしまいます。
のように、いつの間にか検索範囲の問題かのようになっています。

検索範囲を制御したければ、検索範囲を制御する必要があります。
ご提示のコードでは、検索範囲はX列となってるだけで、何の制御もされていません。
あるいは、「検索範囲」という文言を「検索するループの範囲」の意味で使っているのなら、ご提示のコードから読み取れる範囲では、検索値はAL列の値であるのに対して、ループ範囲を決めているのはAM列の最終行としているので、データがどのように入力されているかによっては、期待と異なる結果になるのかも知れません。


いずれにしろ、いくらや取りをしても実体は不明そうですし、ご質問の内容すらわからないままなので、残念ながらお力にはなれそうにありません。
退散いたします。
    • good
    • 0

こんにちは


示されているコードを見る限り(変数関連を除き)問題が見えません

>AAをバラさずにApplication.Matchを実行すると完璧に走ってくれることは確認できています。
という事は、手作業で行っている操作(内容)に問題があると思います

関係ないところだと思いますが一応、範囲における条件(全部が見えていないのであくまで軽いバグ要素)
For i = 1 To Cells(Rows.Count, "AM").End(xlUp).Row
Cells(i, "AL") 対象列の違いによる未処理または無駄なループ

あと
If Not IsError(rowX) Then エラーが無ければの否定で
MsgBox "入庫履歴が見当たりません

ここも対象エラーを特定されていないにで
Application.Match以前のエラーでもMsgBox が出てしまいます
(条件がありますが
WorksheetFunctionを変えた時の残骸や他のエラー処理のための
On Error Resume Next など)

続かないことで終わるというのであれば・・・書いてあるかもですが

MsgBox "入庫履歴が見当たりません:" & Cells(i, "AL"), vbExclamation
On Error GoTo 0

問題の確認
>バラすため
独特な表現で具体的に分かりません
>品名を統合し
同様にどのような操作、セルの値になっているかわかりません

Cells(i, "AL") の値がX列に必ずあるという想定で良いのでしょうか・・

>X列の途中(AL列の統合前の最終行?)までしか見に行かず
もし、統合しがセルの結合を指しているのなら
結合セルで値が見えている値と違っているのではないでしょうか
(#2様が回答されているような)


結合だったりOn Error GoTo 0だったりの気もしますが

エラーにならない関数で値を調べてみるとか・・・
Sub test()
Dim i As Long
Dim countX As Long
For i = 1 To Cells(Rows.Count, "AM").End(xlUp).Row
If Cells(i, "AL") <> "" Then
countX = Application.CountIf(Columns("X"), Cells(i, "AL"))
Debug.Print Cells(i, "AL").Value; "**"; countX
End If
Next
End Sub

AL列対処セルの値がXにあるかどうかを数値でイミディエイトウィンドウに出力します 0は無し1は1つ・・該当セル数

参考になるかわかりませんがとりあえず
    • good
    • 0

こんにちは



ご質問文が、質問者様にしかわからないような用語を用いて説明しているのでさっぱりわかりませんし、エラーになるコードも提示されていないので更にわかりません。

>X列の途中(AL列の統合前の最終行?)までしか見に行かずに
>”見当たりません”のメッセージが返ってきます。
という文章だけからの推測ですが、検索対象範囲の設定が悪いだけではないでしょうか?
「Application.Match」で「見当たりません」のエラーが出ているという事らしいと思いますので、多少冗長ではありますが、Matchの検索範囲を列全体に設定しておけばすむのではないでしょうか?
あるいは、エラーの出る状態で、検索値が存在しないのならエラーになるのは当然ですので、検索値が正しい値になっているのかについてもご確認ください。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A