エクセルVBAのFINDでシート1のコード3に基づいてシート2から名称を取得する方法は?

このQ&Aのポイント
  • エクセルVBAのFIND関数を使用して、シート1のコード3に基づいてシート2から名称を取得する方法を教えてください。
  • シート1のD列に、シート1のコード3をもとにシート2から名称を取得したいです。
  • シート1のコード1は重複キーで、一レコードずつ読んで行き、各レコード毎にシート2を読みたいです。どのようなプログラムを書けばよいですか?
回答を見る
  • ベストアンサー

エクセルVBAのFINDの質問です。

エクセルVBAのFINDの質問です。 シート1    A    B    C     D 1 コード1 コード2 コード3 名 称 2  4    1     1 3  4    2     2 4  4    3     1 シート2    A    B 1 コード1 名 称 2  1   名称1 3  2   名称2 やりたいことは、シート1のD列に、シート1のコード3をもとにシート2から名称を取得したいのです。 下記に記したプログラムだと最初のFINDNEXTは動くのですが、 2回目でエラーになってしまい、次を読んでくれません。 どなたか、ご教授頂けますでしょうか。 シート1の検索条件はコード1の"4"です。 シート1のコード1は重複キーで、一レコードずつ読んで行き、各レコード毎にシート2を読みたい のです。 Dim シート1 As Worksheet Dim シート2 As Worksheet Dim obj As Object Dim Lin As Integer Dim mykey As Integer Dim obj1 As Object Dim Lin1 As Integer Dim mykey1 As Integer Dim st_Lin As Integer Set シート1 = ThisWorkbook.Worksheets("シート1") Lin = シート1.Cells(シート1.Rows.Count, 1).End(xlUp).Row mykey = "4" Set obj = シート1.Range("A1", "A" & Lin).Cells.Find(What:=mykey, _ LookIn:=xlValues, _ lookat:=xlWhole, _ SearchOrder:=xlByColumns) If obj Is Nothing Then   MsgBox ("異常です")   Exit Sub Else   st_Lin = obj.Row   Do Until obj.Row <> st_Lin    Set obj = シート1.Range("A1", "A" & Lin).FindNext(obj)    If obj Is Nothing Then     Exit Do    Else     Set シート2 = ThisWorkbook.Worksheets("シート2")       With シート2          Lin1 = .Cells(シート2.Rows.Count, 1).End(xlUp).Row          mykey1 = シート1.Cells(obj.Row, 3).Value          Set obj1 = .Range("A1", "A" & Lin1).Cells.Find          (What:=mykey1,LookIn:=xlValues,lookat:=xlWhole,SearchOrder:=xlByColumns)          If obj1 Is Nothing Then           MsgBox ("名称取得できませんでした")           Exit Sub          Else            シート1.Cells(obj.Row, 4).Value = .Cells(obj1.Row, 2).Value          End If       End With    End If   Loop End If

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

参考に Dim シート1 As Worksheet Dim シート2 As Worksheet Dim mykey As Integer Dim obj As Range, c As Range Set シート1 = ThisWorkbook.Worksheets("シート1") Set シート2 = ThisWorkbook.Worksheets("シート2") mykey = "4" With シート1   For Each c In .Range("A2", .Cells(Rows.Count, "A").End(xlUp))     If c.Value = mykey Then       Set obj = シート2.Columns(1).Find(c.Offset(, 2), _         LookIn:=xlValues, _         lookat:=xlWhole, _         SearchOrder:=xlByColumns)       If Not obj Is Nothing Then         c.Offset(, 3).Value = obj.Offset(, 1).Value       Else         c.Offset(, 3).Value = "該当なし"       End If     End If   Next End With

kimillica
質問者

お礼

FINDNEXTを使わないんですね。 とっても参考になりました。ありがとうございました。

その他の回答 (1)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

FINDの勉強をしているなら、無視してください FINDを使用しない例です Sub test() Dim シート1 As Worksheet Dim シート2 As Worksheet Dim i As Long Dim j As Long Set シート1 = Worksheets("シート1") Set シート2 = Worksheets("シート2") For i = 2 To シート1.Cells(Rows.Count, 3).End(xlUp).Row For j = 2 To シート2.Cells(Rows.Count, 1).End(xlUp).Row If シート1.Cells(i, 3).Value = シート2.Cells(j, 1).Value Then シート1.Cells(i, 4).Value = シート2.Cells(j, 2).Value Exit For End If Next j If j > シート2.Cells(Rows.Count, 1).End(xlUp).Row Then MsgBox "名称取得できませんでした" Next i End Sub こちらの方が簡単だと思います 参考まで

kimillica
質問者

お礼

こんなやり方があるんですね。本当にありがとうございました。

関連するQ&A

  • エクセルのVBAについて教えてください。

    以前に下記のような内容のプログラムを作成したいと投稿致しましたら dim row as Integer for row = 1 to 65535 if (selectSheet.Cells(1, row) = "") then selectSheet.Cells(1, row) = "#####" EndIf をアレンジしたいのです。 上記のプログラムが構築されているコマンドボタンと同じuserformにオプションボタンを5個、コンボボックスを一つ作りました。 オプションボタン1を選択するとコンボボックスにはあ行が。 オプションボタン2を選択するとコンボボックスにはか行が。 オプションボタン3を選択するとコンボボックスにはさ行が。 オプションボタン4を選択するとコンボボックスにはた行が。 オプションボタン5を選択するとコンボボックスにはな行が。 選択できるようにしたいのです。 次に選んだオプションボタンと同名前のシートに上記の#####が入力されるようにしたいのですが、どのようにすればいいのですか? このように教えて頂きました。 Public myop As Integer 'オプション選択保持用 Private Sub CommandButton1_Click() Dim row As Integer Dim mykey As String '比較キー '選択したオプションボタンにより '比較キーと選択保持用変数に各値を代入 Select Case True Case OptionButton1: mykey = "[あ-お]*": myop = 1 Case OptionButton2: mykey = "[か-こ]*": myop = 2 Case OptionButton3: mykey = "[さ-そ]*": myop = 3 Case OptionButton4: mykey = "[た-と]*": myop = 4 Case OptionButton5: mykey = "[な-ほ]*": myop = 5 Case Else: myop = 0 End Select If myop = 0 Then Exit Sub For row = 1 To 65535 If ActiveSheet.Cells(1, row).Value Like mykey Then ActiveSheet.Cells(1, row) = "#####" End If Next row End Sub これを流用して自分でいじりたいのですが、私が未熟ですので、コードの意味、役割がさっぱりわかりません。 わがままな質問ではございますが、どなたか上記のコードの意味を教えて頂けませんか? よろしくお願い致します。

  • VBA 選択された離れたセルの値の取得について

    EXCELのVBAでどうしても前に進めず困っております。 目的としているコードは、離れたセル(複数)をあらかじめCtrlキーで選択状態にしておき、選択されたセルの値のみをVBAが別のセルに並べていくというものです。 以下が私の作ったコードなのですが、思ったとおりの動作をしてくれません。 VBA初心者なもので、おかしな記述がたくさんあると思うのですが、どなたかアドバイスお願いします。 Public Sub xx() Dim SelectArea As String Dim TargetCell As Range Dim a As Integer Dim Row As Integer Dim Column As Integer Dim CNT1 As Integer a = 0 Row = 0 Column = 0 For CNT1 = 1 To 10 Row = Row + 1 SelectArea = Selection.Address Set TargetCell = Range("B3").Cells(Row - 1, Column) If Intersect(Range(SelectArea), TargetCell) Is Nothing Then Else Range("A30").Cells(a, 0) = Range("B3").Cells(Row - 1, Column).Value a = a + 1 End If Next End Sub

  • EXCEL VBA 文字 アドレス 検索 消去 セル

    こんにちは。 EXCELの中にボタンを設置して以下のような動作をさせたいと思っておりますが、うまくいきません。 どのように改良すればよろしいでしょうか? 1.「end」の文字を検索し、そのセルのアドレスを取得する 2.取得したアドレスの行に関する値から一つ引いた値を計算で求める。例えばendがA10にあれば、A9とする 3.次にA3からA9までの範囲を消去する。 以下が自作したプログラムです。 Sub ボタン1_Click() Dim srcSheets As Worksheet Dim sinki As Integer sinki = MsgBox("データを消去しますか", vbYesNo) Select Case sinki Case vbYes '選択肢 Dim lngYLine As Long Dim intXLine As Integer Set Obj = Worksheets("Sheet2").Cells.Find("end") 'Sheet2の中でendを検索する。セルの場所を特定する。 If Obj Is Nothing Then MsgBox "endが見つかりません" Else lngYLine = Worksheets("Sheet2").Cells.Find("end").Row intXLine = Worksheets("Sheet2").Cells.Find("end").Column lngYLine = lngYLine - 1 End If With Sheets("Sheet2").Range("A3:intXLine+lngYLine").ClearContents End With End Select End Sub

  • EXCELのVBAについて教えてください。

    演習1というシートの(1,1)のセルの値と(1,2)のセルの値を入れ替えるプログラムを作成したいので すがエラーが出て出来ません。コードは下記の様に書きました。 Sub 演習1() Dim sheetobj As Worksheet Dim a As Integer Set sheetobj = ThisWorkbook.Worksheets("演習1") With sheetobj a = .Cells(1, 1) .Cells(1, 1) = .Cells(1, 2) .Cells(1, 2) = a End With End Sub プログラミング自体が本を読んでも分かりません。 宜しければ小学生に教えるように文を訳してくれませんか?

  • エクセルVBAのFindの不具合

    入力シートの4~2000行にデータをフォームを使って入力し、そのフォームを閉じる際に集計シートで集計する家計簿を作ってます。集計シートでは、食費・交際費などのコードがB5:B22に入っており、それぞれの合計をC5:C22に表示させたいのです。SUMIFを使えば楽なのですが、勉強のために極力VBAで処理させます。 フォームを閉じた際のソース(抜粋)は以下の通りです。 -------------------------------- Private Sub CommandButton2_Click() Dim i As Integer Dim コード As Integer Dim 金額 As Long Dim 集計行 As Integer Dim コード範囲 As Range Unload Me Set コード範囲 = Worksheets("集計").Range("b5, b22") For i = 4 To 2000 コード = Cells(i, 3).Value 金額 = Cells(i, 5).Value 集計行 = コード範囲.Find(コード).Row Next i End Sub -------------------------------- For~Nextの中はもっと処理を追加しなければならないのですが、とりあえず現段階で、   実行時エラー91(オブジェクト変数またはWithブロックが設定されていません) が   集計行 = コード範囲.Find(コード).Row の行で発生します。行番号だけを取得しようとしているので、Findの行だけを整数型変数に代入したいのですが・・・ 間違っている点をお教え下さい。 ご面倒でなければ、 Application.WorksheetFunctionに置き換える方法も教えていただければ幸いです。 よろしくお願いします。

  • エクセルVBAでの質問

    お世話になります。 エクセルVBAのプログラムコードをコピーし、 エクセルの通常シートへ貼り付けした際、 「’」で始まる説明分または注釈をプロシージャ画面の 様に色づけしたいと思い下記の様なコードを書きました。 しかし、VBA実行後、元のコードが行によって、空白 から始まって行の途中に「’」がある場合など、 少し手前の文字から着色されたりしていました。 何故なのでしょうか。 どこがおかしいのでしょうか。 空白が半角か全角になっている為にこのような現象に なっているのでしょうか。 しかしその解決方法が分からなく、 どなたかご教授頂きたく宜しくお願い致します。   記 Sub サンプル() Dim x As Integer Dim y As Integer Dim z As Integer Dim myrng As String Dim zz As Integer For y = 1 To 10 For x = 1 To Cells(Rows.Count, y).End(xlUp).Row If InStr(Trim(Cells(x, y).Value), "'") = 1 Then Cells(x, y).Font.ColorIndex = 10 ElseIf InStr(Trim(Cells(x, y).Value), "'") = 0 Then Else z = InStr(Trim(Cells(x, y).Value), "'") myrng = Cells(x, y) zz = Len(myrng) Cells(x, y).Characters(z, zz).Font.ColorIndex = 10 End If Next x Next y End Sub

  • エクセルVBAで。

    お世話になります。 VBA初心者です。 (初心者でもないのですが、しばらく遠ざかっていました。) エクセルVBAの記述内容をコピーし、 エクセルの通常のシートへ貼り付けした際、 記述上「’」で始まる文字は緑色が付いていますが、 通常のシートへ貼り付けした際、黒字になってしまいます。 そこで、下記の様なVBAを記述し、貼り付け後に、 「’」から始まる文字を緑色に着色しようと試みましたが (やはり)うまくいきませんでした。 エクセル関数なんかも織り交ぜたおかしな記述だと思いますが 何となくやりたい事が伝わって頂けるかと思うのですが、 どう修正したら出来ますでしょうか。 ご教授下さいます様、宜しくお願いいたします。   記 Sub 色() Dim y As Integer Dim x As Integer Dim a As Integer mysheet = ActiveSheet.Name For y = 1 To 10 x = Sheets(mysheet).Cells(Rows.Count, y).End(xlUp).Row a = 0 Do Until a > x a = a + 1 If Right(Cells(y, a), 1) = "'" Then Cells(y, a).Select Selection.Font.ColorIndex = 10 End If Loop Next End Sub

  • どなたか教えてください。

    Public myop As Integer 'オプション選択保持用 Private Sub CommandButton1_Click() Dim row As Integer Dim mykey As String '比較キー '選択したオプションボタンにより '比較キーと選択保持用変数に各値を代入 Select Case True Case OptionButton3: mykey = ("A2:A11"): myop = 1 Case OptionButton4: mykey = ("B2:B11"): myop = 2 Case OptionButton5: mykey = ("C2:C11"): myop = 3 Case OptionButton6: mykey = ("D2:D11"): myop = 4 Case Else: myop = 0 End Select If myop = 0 Then Exit Sub For row = 1 To 65535 If ActiveSheet.Cells(1, row).Value Like mykey Then ActiveSheet.Cells(1, row) = "#####" End If Next row End Sub で、For row = 1 To 65535でエラーがでます。 どうしてなのでしょうか・・・?

  • 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 でExecuteExcel4Macro("GET.OBJECT(48,

    エクセル2000です。 以前、ワークシートに配置したフォームツールのラベルの参照元を取得するマクロをご教示いただき、以下のTest01は問題なく作動しています。 Sub test01() Dim obj As Object Dim i As Integer Dim obj_n As String 'オブジェクトの名前 With ActiveSheet For Each obj In .Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address 'GET.OBJECT で、リンクがないものを取ると、False になる .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub 今回、同一シートではなく別シートに表示させようと以下のTest02を書いたのですが、やってみると .Cells(i, 5) はすべて#VALUE!エラーになってしまいました。 ExecuteExcel4Macro("GET.OBJECT(48~がどのようなものかわからずやっているので応用がききません。(そもそも48って?) どのようになおしたらよいのかご教示いただければ幸いです。 Sub test02() Dim obj As Object Dim i As Integer Dim obj_n As String Dim ws As Worksheet, ns As Worksheet Set ws = ActiveSheet Set ns = Worksheets.Add With ns For Each obj In ws.Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub