• ベストアンサー

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

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

こんな感じでいかがですか? 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

murano47
質問者

お礼

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

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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

  • TAK_999
  • ベストアンサー率43% (42/96)
回答No.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

murano47
質問者

お礼

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

関連するQ&A

  • VBAでシート1のデータを他シートに入力させるには

    sheet1に   A B  C D 1 H 22 . 4 2        5          6と入力しています sheet2には売り上げの表があります 現在sheet1のコード表示をクリックして、下記を入力しています。 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(2).Name = Range("A1") End Sub それでsheet2にはH22.4、以下sheet3 4 ・・としています。 sheet2には売り上げの表があってその表題をsheet1に入力されている H22.4     5を使って 平成[sheet1のB1のデータ]年[sheet1のD1のデータ]月分売上高というように入力させたいのですが、色々勉強しましたが いまいち良くわかりません。 宜しくお願いします。

  • EXCEL VBAのFind について

    VBAで、特定の文字が入っているセル位置(結合セル)を取得したく、 シートのコード記述で --- Private Sub Worksheet_Change(ByVal Target As Range) Dim w_CelObj As Object Set w_CelObj = ActiveSheet.Cells.Find(What:="あああ", LookAt:=xlWhole, MatchByte:=False) MsgBox w_CelObj.Row MsgBox Cells.Find(What:="いいい").Row End Sub ----- と記述し、"aa"も"bb"もどちらの方法でも取得できました。 ですが、これを別のEXCELブック(既にシートがたくさんあり、コードもびっしり記述してあります)で同様のことを行おうとするとエラーになってしまいます。 ※新しいシートを作成し、そのシートにコードをコピーして試しました。 セルの結合を解除すると正常に取得できるのですが、結合セルだとFindされてきません。 調べてみましたが、「Cells.Find」ときちんとセル全体を指定していれば大丈夫のようで、同様の事例を検索できませんでした。 他に何を調べればよいでしょうか? ご協力よろしくお願いします。

  • EXCEL VBA のエラー処理

    EXCEL VBA でセルの文字列を読み(基本的に2007/05/08のような日付データが入っている)、 もしそれ以外のデータ("あいう"のような文字列)が入っていた場合はエラールーチンに飛ばして処理をしようと思ったのですが、 エラーが発生して、発生箇所が黄色く反転表示され、止まったままになってしまいます。 エラールーチンに飛ばすためにはどうしたらいいのでしょうか? Sub test() Dim LineNo As Integer Dim WrkDate As Date On Error GoTo Err LineNo = 1 WrkDate = Range("S" & LineNo).Value ←ここが黄色く反転表示される。 WrkDate = WrkDate + 7 Range("X" & LineNo).Value = WrkDate GoTo Owari Err: (処理ルーチン) Owari: End Sub

  • エクセル:イベントが書かれたシート名を取得したい

    シート[Sheet1]に値が入力された時、  (1)その入力された値(というか"Target")  (2)Targetが入力されたシート名 を持って、SheetInputというプロシージャへ飛ぶ、というコードをSheet1に書きました。 (シートを右クリックして「コードの表示」を選択して出てくるところに) Private Sub Worksheet_Change(ByVal Target As Range) Dim SName As String SName = ActiveSheet.name SheetInput Target, SName  '(1)Target、(2)SName End Sub 「シート[Sheet1]に値が入力された時」に動き出すイベントなのだから、 (2)は必ず「Sheet1」ですが、シート名が変わってもこのコードをそのまま使えるように、 SName = ActiveSheet.name と書いていました。 しかし、 別のマクロ上で「Sheet1に値を書き込む」と書いた結果としてこのSheet1のWorksheet_Changeイベントが動いた場合は、 SNameが「Sheet1」にならないことがあります。 それでもSName = "Sheet1"とは書きたくなく、 かつ、常に「このWorksheet_Changeイベントが書かれているシート名」を変数SNameに取得したいのですが、 このイベントが書かれているシート名を取得する関数はあるのでしょうか。 (伝わりますでしょうか?)

  • excel VBA 2つのプロシージャを1つに

    いつもお世話になっております。 初心者ですが、苦しみながらもexcelでデータベースを作成しております。 さて Worksheet_Change のイベントが2つあり、これを一つにまとめようとしているのですが、がんばっているんですが、自分ではどうしてもうまくいかない為、投稿させていただきました。 コードは下記2つです。 また、どういったものを作ろうとしているのか説明不足でご指摘を頂戴することもありますので、試作段階のファイルですが、アップローダーにあげさせていただきました。確認頂ければ幸いです。 ■アプロダ 投稿No 4514 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi ■作ろうとしているデータベースの概要 inputシート・・・データを直接入力して、また、データや写真を閲覧をするシート dataシート・・・データを格納するシート、オートフィルタを使って、曖昧検索フィルタもここでかけたりします。 どうか良いお知恵を拝借させていただきたくよろしくお願いします。 '一つ目のプロシージャ(Noセルに数字が入ると、そのNoのデータを自動的にdataシートまで読みにいって表示させます) Private Sub WorkSheet_Change(ByVal Target As Range) 'No入力してデータ反映 Dim fRange As Range Dim fRow As Long If Target.row <> 4 Then Exit Sub If Target.Column <> 3 Then Exit Sub Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Range("F4").Value = Sheets("data").Cells(fRow, 2).Value Range("C5").Value = Sheets("data").Cells(fRow, 3).Value Range("C6").Value = Sheets("data").Cells(fRow, 4).Value Range("C7").Value = Sheets("data").Cells(fRow, 5).Value Range("F5").Value = Sheets("data").Cells(fRow, 6).Value End Sub '二つ目のプロシージャ(写真を表示させるためのコードです) Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$k$4" myLoadPicture "board_Image", Target.Text, Range("I5") Case "$K$17" myLoadPicture "map_Image", Target.Text, Range("I18") Case Else Exit Sub End Select End Sub

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

  • エクセルVBAで Cancel=Trueの使い方

    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_Deactivate() Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cancel = True MsgBox "キャンセルしました" End Sub 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?

  • エクセルのマクロでワークシートチェンジについてお教えください

    以前教えていただいたマクロで セルに入力があったら起動するマクロを作っています ・・・Private Sub Worksheet_Change(ByVal Target As Range)・・・ 今回お聞きしたいのは シート上にボタンを作っておいて そのボタンを押すたびに ワークシートチェンジ自体のマクロを発生する、しない を切り替える 方法を教えていただきたいのです  「発生している状態で作業をして  ボタンを押して発生させなくして コピーをして  別のシートに貼り付ける」というようなことをしたいのです  (ワークシートチェンジが発生している状態だと  コピーするための選択ができないので) わかりにくい部分がありましたら 細くさせていただきますのでよろしくお願いいたします

  • ExcelのVBAについて(再掲)

    ExcelのVBAについて(再掲) 以下のシートは作成中(勉強中)のものです。いずれは私的に実用しようと思っています。。 さて、質問ですが、「シート1のA3に入力、手動でシート2に移動自動で転記し、手動でシート1に移動し、また入力する」という単純動作を目的に作成しています。問題点は沢山ありますが、例えば『シート1の時間列が何かの変更で書き換えられてしまう』、『沢山書いていくと分かりますが、途中で行削除を行うと、時間列に削除行分の時間記録が下向きに書き込まれる』などです。他にもあると思っていますが、(1)この問題はなぜ発生するのか?(2)修正案としてはどの様な例があるか? 等をお聞きしたいです。細々と問題はあると思っていますので、その様な問題点もお聞きしたいです。 よろしくお願いします! '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") Application.EnableEvents = False Application.EnableEvents = True End If Next time7 Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet2").Range("A3").Select End Sub

  • エクセルVBAでセル変化したら別のセルへコピーする

    おはようございます。VBAをはじめて浅い初心者です。 あるセルに数字および文字列が入力されたら違うセルへコピーしたいのですがどのようにすればできますか。 Private Sub Worksheet_Change(ByVal Target As Range)とか 使用してつくればいいのですか?教えてください。

専門家に質問してみよう