あなたの「必」の書き順を教えてください

Excel2007のVBAについてご教授ください。

Application.Matchで特定列の文字列検索を使いたいんですが以下のような構文で使えますでしょうか?

-----------------
Set usWS = Worksheets("Sheet1")
KeyIdValue = "hogehoge"
JANCol = 9
m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0)
-----------------

Sheet1のワークシートの9(I列)列目に"hogehoge"が入っている行数をmに入れたいです。
(最初に見つかった行数で構いません。複数は見つかりません。)
検索されません?というようなエラー(エラー2042)が出るのですが、使い方が誤っていないかご教授させて頂きたいです。
変数の宣言はコンパイルエラーが出ないので問題ありません。
Application.Matchの使い方に問題ないか教えて頂けませんでしょうか?

よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決しました。一度String型の変数に置き換えているのが問題でした。
ドンピシャで正解でした。
そうですよね。よく考えれば、そこが一番怪しかったです。

ご指摘のとおり、直接比較するようにしたらきちんと解決されました。

いろいろアドバイスありがとうございました。
何とか解決できて先に勧めそうです。

ありがとうございました。

お礼日時:2014/03/06 20:34

再です。


このような時は、うまくいかない原因の絞り込みをするために、簡単なテストを実施します。
考えられる原因:
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をどこからどんなふうに引っ張って来ていて、そのセルにはどんな式が入ってるのか、元表があるならそれはどんな体裁なのか、そうした詳しい内容がわからなければ、こちらで判断できません。

文字列を加工している間に、目に見えない半角スペースが付いたりしてないか、等、色々調べてみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決しました。一度String型の変数に置き換えているのが問題でした。
よく考えれば、そこが一番怪しかったです。

いろいろアドバイスありがとうございました。
何とか解決できて先に勧めそうです。

ありがとうございました。

お礼日時:2014/03/06 20:33

9列目(I列)を検索したいのなら、9列目(I列)だけをセットすれば良い話と思われます。




Set usWs = Worksheets("Sheet1").[I:I]
KeyIdValue = "hogehoge"
m = Application.Match(keyIdValue, usWs, 0)
MsgBox m
    • good
    • 0
この回答へのお礼

情報ありがとうございます。

数字ではうまくいかず、文字列では動作しています。
書式なども”文字列”に変更してみましたが、変わりませんでした。
セルに"123"と入れると検索できなくて"123a"と入れると合致していました???
(123だと右寄せでセルに入りますが、123aだと左寄りでセルに入力されますが数字と認識しているかだけなので関係ないですよね。)

基本的な何かが問題があるのだと思います。
おなじ数字かは何回も見直しましたが。。。

何かわかればご教授方よろしくお願いします。

お礼日時:2014/03/06 08:09

No.1です。



>数字はマッチしないように見えます。。。
>文字列ならOKでした

前回のコードの
>Set c = Range("I:I").Find(what:="hogehoge", LookIn:=xlValues, lookat:=xlWhole)

"hogehoge"
部分は文字列となりますので、
数値の場合、ダブルクォーテーションを付けないようにしなければなりません。

エラーの原因はこの辺では?

他の原因ならごめんなさいね。m(_ _)m
    • good
    • 0
この回答へのお礼

またまた、連絡ありがとうございます。

実コードは

KeyIdValue = jpWS.Cells(jpWsRow, JANCol).Value
m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0)

という感じでセルを参照しています。。。

正直、何かが問題だと思いますが、私の知識では歯が立ちません。。。
数字と文字列で何が違うんでしょう???
セルに"123"と入れると検索できなくて"123a"と入れると合致していました???
(123だと右寄せでセルに入りますが、123aだと左寄りでセルに入力されますが数字と認識しているかだけなので関係ないですよね。)

頂いたコードでも同じような結果になっているように見えました。。。
(こっちは、しっかり見ていないので確認してみます。)

お礼日時:2014/03/06 00:00

こんばんは!



エラー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
    • good
    • 0
この回答へのお礼

プログラムのコードまで大変ありがとうございます。
こちらに変更してみましたが、結果は同じでした。。。た
ぶん、基本的なことが理解していません。
また、きちんと見ていないので、移植が間違っていたら、すみません。

ただ、今、試していたんですが、数字はマッチしないように見えます。。。
文字列ならOKでした。
セルの書式などの指定など問題もありますでしょうか?

こういうものでしょうか?回避策はありますか???
はっきり言ってよくわかりません。ご教授頂きたいです。

よろしくお願いします。

お礼日時:2014/03/05 23:24

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

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


おすすめ情報