- ベストアンサー
Excel2007のVBAで特定行を検索する方法
- Excel2007のVBAを使用して、特定の列の文字列を検索する方法について教えてください。Application.Match関数を使用して、「Sheet1」ワークシートの9列目(I列)に特定の文字列が入っている行数を取得したいのですが、エラー(エラー2042)が発生してしまいます。
- 特定の文字列を検索するために、Excel2007のVBAでApplication.Match関数を使用しています。具体的には、「Sheet1」ワークシートの9列目(I列)に特定の文字列が入っている行数を取得したいです。しかし、エラー(エラー2042)が発生してしまいます。正しい使い方について教えていただけないでしょうか?
- Excel2007のVBAで特定の文字列を検索するために、Application.Match関数を使用しています。具体的には、「Sheet1」ワークシートの9列目(I列)に特定の文字列が入っている行数を取得したいですが、エラー(エラー2042)が表示されてしまいます。正しい使用方法を教えていただけないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.1・2です。 >実コードは >KeyIdValue = jpWS.Cells(jpWsRow, JANCol).Value >m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0) >という感じでセルを参照しています。。。 文字列ではうまくいって、数値でエラーになるというコトですね? 変数 KeyIdValue の型は何で宣言しているのか不明ですので、いっそのこと 変数に代入せず、MATCH関数の中に直接セルを入れてみてはどうでしょうか? 仮に参照セルが B3セルだとすると >m = Application.Match(Range("B3"), usWS.Columns(JANCol), 0) のような感じで・・・ 他の変数の型も念のため確認した方が良いと思います。 部分的なコードだけでの回答ですので、これでもダメならごめんなさいね。m(_ _)m
その他の回答 (4)
- yaritsusozai
- ベストアンサー率59% (50/84)
再です。 このような時は、うまくいかない原因の絞り込みをするために、簡単なテストを実施します。 考えられる原因: A:Matchの使い方が間違っているのでは? B:文字列と数値の違い? C:質問者が説明してない部分に何か問題があり、そこからの連鎖 検証手順: [1]新規ワークシートを用意する。テストのため、必ずまっさらな状態から始める。 [2]シート1のA5にhogehoge、A6に123と入力する。 [3]VBAを開き、次のコードを実行する。 Sub test() MsgBox (Application.Match("hogehoge", Worksheets("Sheet1").[A:A], 0)) MsgBox (Application.Match(123, Worksheets("Sheet1").[A:A], 0)) End Sub これが正常に走れば、AとBのセンは消えます。 あとはCですが、これ以上は、実際にそのシートを使っている本人にしかわかりません。 hogehogeをどこからどんなふうに引っ張って来ていて、そのセルにはどんな式が入ってるのか、元表があるならそれはどんな体裁なのか、そうした詳しい内容がわからなければ、こちらで判断できません。 文字列を加工している間に、目に見えない半角スペースが付いたりしてないか、等、色々調べてみてください。
お礼
ありがとうございました。 解決しました。一度String型の変数に置き換えているのが問題でした。 よく考えれば、そこが一番怪しかったです。 いろいろアドバイスありがとうございました。 何とか解決できて先に勧めそうです。 ありがとうございました。
- yaritsusozai
- ベストアンサー率59% (50/84)
9列目(I列)を検索したいのなら、9列目(I列)だけをセットすれば良い話と思われます。 Set usWs = Worksheets("Sheet1").[I:I] KeyIdValue = "hogehoge" m = Application.Match(keyIdValue, usWs, 0) MsgBox m
お礼
情報ありがとうございます。 数字ではうまくいかず、文字列では動作しています。 書式なども”文字列”に変更してみましたが、変わりませんでした。 セルに"123"と入れると検索できなくて"123a"と入れると合致していました??? (123だと右寄せでセルに入りますが、123aだと左寄りでセルに入力されますが数字と認識しているかだけなので関係ないですよね。) 基本的な何かが問題があるのだと思います。 おなじ数字かは何回も見直しましたが。。。 何かわかればご教授方よろしくお願いします。
- tom04
- ベストアンサー率49% (2537/5117)
No.1です。 >数字はマッチしないように見えます。。。 >文字列ならOKでした 前回のコードの >Set c = Range("I:I").Find(what:="hogehoge", LookIn:=xlValues, lookat:=xlWhole) の "hogehoge" 部分は文字列となりますので、 数値の場合、ダブルクォーテーションを付けないようにしなければなりません。 エラーの原因はこの辺では? 他の原因ならごめんなさいね。m(_ _)m
お礼
またまた、連絡ありがとうございます。 実コードは KeyIdValue = jpWS.Cells(jpWsRow, JANCol).Value m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0) という感じでセルを参照しています。。。 正直、何かが問題だと思いますが、私の知識では歯が立ちません。。。 数字と文字列で何が違うんでしょう??? セルに"123"と入れると検索できなくて"123a"と入れると合致していました??? (123だと右寄せでセルに入りますが、123aだと左寄りでセルに入力されますが数字と認識しているかだけなので関係ないですよね。) 頂いたコードでも同じような結果になっているように見えました。。。 (こっちは、しっかり見ていないので確認してみます。)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! エラー2042は #N/A みたいですので、I列に「hogehoge」というデータがないのでは? 今回は敢えてMATCH関数を使いたい!というコトですので、 IF ~ Then などでエラー回避をしてみてはどうでしょうか? 余計なお世話かもしれませんが、私であれば Sub Sample1() Dim c As Range Set c = Range("I:I").Find(what:="hogehoge", LookIn:=xlValues, lookat:=xlWhole) If c Is Nothing Then MsgBox "該当データなし" Else MsgBox c.Row End If End Sub といった感じにします。m(_ _)m
お礼
プログラムのコードまで大変ありがとうございます。 こちらに変更してみましたが、結果は同じでした。。。た ぶん、基本的なことが理解していません。 また、きちんと見ていないので、移植が間違っていたら、すみません。 ただ、今、試していたんですが、数字はマッチしないように見えます。。。 文字列ならOKでした。 セルの書式などの指定など問題もありますでしょうか? こういうものでしょうか?回避策はありますか??? はっきり言ってよくわかりません。ご教授頂きたいです。 よろしくお願いします。
お礼
ありがとうございました。 解決しました。一度String型の変数に置き換えているのが問題でした。 ドンピシャで正解でした。 そうですよね。よく考えれば、そこが一番怪しかったです。 ご指摘のとおり、直接比較するようにしたらきちんと解決されました。 いろいろアドバイスありがとうございました。 何とか解決できて先に勧めそうです。 ありがとうございました。