プロが教えるわが家の防犯対策術!

こんにちは、仕事でVBAを使い始めて数週間。
最適ではなくともなんとか書けるようになってきました。
でも、まだまだ想定外の動作をされることが多いです。
今回もちょっと困っているので、お助けください。

本来のコードは会社に置いてきたので、自宅での再現です。
ちょっと長いですが、お付き合いください。

シートは3つです。
Sheet1 = 実行ボタンや手順など。
Sheet2 = CSVを取り込んだデータ
Sheet3 = 手入力したデータ

Sheet1の実行ボタンを押すと以下の処理が始まる予定です。

Sheet2のデータを以下の通り処理
・A3 に A1&A2 の様にくっつけた文字列を入力
その文字列が、Sheet3 の A列に存在するか検索
Sheet3に存在した場合、A3 は空白にします。

これのコードは以下です(会社にある本来のコードの再現です。インデント消えるので画像も添付)
==============================================
Sub temp()

Dim I As Long
Dim KEY As Variant

With Worksheets("Sheet1")
For I = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
.Cells(I, 3) = .Cells(I, 1) & .Cells(I, 2)
On Error Resume Next
KEY = Application.WorksheetFunction. _
Match(.Cells(I, 3), Worksheets("sheet2").Columns("A"), 0)
'データ量が多いので、findではなくmatchでやりたいです。
If Err.Number = 0 Then .Cells(I, 3) = ""
On Error GoTo 0
Next
End With
End Sub
==============================================

これを実行すると、Sheet2をアクティベートしている時なら問題なく処理されるのですが
Sheet1をアクティベートしていると、検索で引っかかても空白になりません。
いったいどこが原因でしょうか?
このコードは再現なので、「これではわからないヨ」ということでしたら
来週会社においてある本来のコードを持ってきます!

よろしくお願いします。

「VBA 教えてください」の質問画像

A 回答 (3件)

>Sheet2のデータを以下の通り処理


>・A3 に A1&A2 の様にくっつけた文字列を入力
>その文字列が、Sheet3 の A列に存在するか検索
>Sheet3に存在した場合、A3 は空白にします。

上記が正しいとするなら
With Worksheets("Sheet1")ではなく
With Worksheets("Sheet2")かと

Match(.Cells(I, 3), Worksheets("sheet2").Columns("A"), 0)ではなく
Match(.Cells(I, 3), Worksheets("sheet3").Columns("A"), 0)かと

思いますが、いかがでしょうか。
    • good
    • 0
この回答へのお礼

あ、、ものすごくしょうもない記載ミスでした。すみません、実際はご指摘の通り正しいシートを指定しています。

お礼日時:2018/01/20 10:26

こんにちは!



Sheetの指定はNo.1さんが回答されている通りだと思います。
尚、あくまで個人的な考えですが・・・

今回の件に関しては
MATCH関数を使っていますので、
存在すれば「数値」、なければ「エラー」が返りますね。

>On Error Resume Next

>If Err.Number = 0 Then .Cells(I, 3) = ""
>On Error GoTo 0
で、エラーを利用しA列に存在しない場合の処理を行っているように思いますが、
私は極力「On Error Resume Next」は使わないようにしています。

仮にコードに不具合があっても「On Error Resume Next」を使ってしまうと
不具合の場所が特定できないと思いますので、
極力エラーを出さないようなコードにするように心がけています。

今回の場合、エラーが返る場合は「数値」でない!という考え方です。

Sub Sample1()
Dim i As Long, myStr As String
Dim wS As Worksheet, myKey
Set wS = Worksheets("Sheet3")
With Worksheets("Sheet2")
For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
myStr = .Cells(i, 1) & .Cells(i, 2)
myKey = Application.Match(myStr, wS.Range("A:A"), False)
If Not IsNumeric(myKey) Then
.Cells(i, 3) = myStr
Else
.Cells(i, 3) = ""
End If
Next i
End With
End Sub

こんな感じになるのではないでしょうか?

※ お示しのコードはあるなしにかかわらず
一度C列にA列&B列を表示させ、ある場合に消去としていますが
ない場合のみ表示させる!というやり方にしました。m(_ _)m
    • good
    • 0
この回答へのお礼

IsNumeric関数を知りませんでした!数値の場合はTrueなんですね。
この関数を使って、判定の基準を書き換えて動作をみてみます!
とても勉強になりました。ありがとうございます。」

お礼日時:2018/01/20 11:37

「コードは再現なので・・・」とのことですが、このコードに問題は無いように思います。

Withブロック中の変数の書き方で、次の違いは理解されていると思いますが、単純に「.」を漏らしているだけのような気がします。この観点で再度、コードを見直すことをお勧めします。

With Worksheets("Sheet1")
.Cells(I, 3) ・・・Sheet1のセル(I, 3)
Cells(I, 3) ・・・ActiveSheetのセル(I, 3)
End With
    • good
    • 0
この回答へのお礼

夕方に書いたコードなのでなにが抜けていたのかも知れませんね…
今日、改めて書き直したら想定通りの動作をしてくれました!

お礼日時:2018/01/23 18:36

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