こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA 他のワークシートのデータを見るには?

EXCEL VBAでsheet1のセルに何かデータが入力された時に、sheet2のどこかのセルに同じ文字列がないかを探したいと思います。

データの入力と同時に検索をかけるため、sheet1の部分にイベントプロシージャを定義し、
データが入力された時にそのルーチンの中からsheet2のデータを見に行きたいのですが、エラーが出てしまいます。
こういうことはできないのでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim LineNo As Integer
Dim tmp_str As String
tmp_str = Target.Value
LineNo = Sheets("sheet2").Cells.Find(what:=tmp_str, lookat:=xlWhole).Row
MsgBox (LineNo)
End Sub

投稿日時 - 2007-05-09 10:53:48

QNo.2985474

困ってます

質問者が選んだベストアンサー

こんな感じでいかがですか?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim LineNo As Variant
Set LineNo = Sheets("sheet2").Cells.Find(what:=Target.Value, lookat:=xlWhole)
If Not LineNo Is Nothing Then MsgBox LineNo.Row
End Sub

投稿日時 - 2007-05-09 11:19:29

お礼

ご回答ありがとうございます。
このやり方で行きます。

投稿日時 - 2007-05-10 11:57:32

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

この辺は大丈夫ですか?

■ Excel VBA ヘルプ引用

  引数 LookIn、LookAt、SearchOrder、および MatchByte の設定は、
  このメソッドが使われるたびに保存されます。
  次にこのメソッドを使うときに、これらの引数の指定を省略すると、
  保存された設定が使われます。

つまり、Find メソッドを使う場合は上記のパラメータをちゃんと
指定しないと、前回の設定のまま検索が行われてしまう可能性があると
いうことです。

設定が違えば、「あるはずなのに?」ということもあり得ます。

または、データの末尾に不要なスペースなどがあって、一見同じデータ
にみえても、プログラム的に見れば別データとなっている事があります。

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim rFound As Range

  ' // 終了条件:: 値が変化したセルが複数の場合は中止
  If Target.Count > 1 Then Exit Sub
  ' // 終了条件:: データ消去も中止
  If Len(Target.Value) = 0 Then Exit Sub

  ' // 検索処理(Find メソッドはちゃんとパラメータ指定する)
  Set rFound = Sheets("Sheet2").Cells _
         .Find(What:=Target.Text, _
            LookAt:=xlWhole, _
            LookIn:=xlValues, _
            MatchByte:=False)
  ' // 結果出力
  If rFound Is Nothing Then
    ' MsgBox "Not Found."
  Else
    MsgBox "RowNum :=" & CStr(rFound.Row)
    Set rFound = Nothing
  End If

End Sub

投稿日時 - 2007-05-09 13:06:09

ANo.1

Findメソッドで対象文字(tmp_str)がSheet2の中で見つからないと
Nothingが返されます。Nothingに対してRowプロパティは使えませんか
らエラーになります。

あまりスマートな例ではありませんが、以下のコーディングではどうでしょう?
If ThisWorkbook.Sheets("Sheet2").Cells.Find(what:=tmp_str, lookat:=xlWhole) Is Nothing Then
MsgBox "見つかりません"
Else
LineNo = ThisWorkbook.Sheets("Sheet2").Cells.Find(what:=tmp_str, lookat:=xlWhole).Row
MsgBox (LineNo)
End If

投稿日時 - 2007-05-09 11:09:00

お礼

ご回答ありがとうございます。
とりあえずsheet2に入力してあるデータだけを検索したので、
nothingになるはずはないのですが…。

投稿日時 - 2007-05-09 11:40:23

あなたにオススメの質問