• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FIND関数について教えてください)

Excel VBAでの検索ツール作成方法について

このQ&Aのポイント
  • Excel VBAを使用して、特定の列から検索し、結果を表示する検索ツールを作成する方法について教えてください。
  • さらに、検索結果をもとに別の列からデータを取得する方法も知りたいです。
  • また、見つからなかった場合のエラーハンドリングや、曖昧な検索セルの指定方法についても教えてください。

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

  • ベストアンサー
回答No.1

通りすがりのVBAビギナーです。 初めにお断りしておきますが、質問の内容と違った答えを書いていたらすみません。 Sub 検索() __Dim FoundCell As Range, FirstCell As Range __''どのシートからどうやって実行するのかわからなかったので、Sheet1を __''Withステートメントでまとめてみました(Sheet1という名前の他のシートがあれば __''Worksheets("Sheet1")に変更して下さい __With Sheets("Sheet1") ____''Sheet1のA1が空欄だったらここで終了します ____If .Range("A1").Value = "" Then ______MsgBox "検索条件が設定されていません", vbExclamation ______Exit Sub ____End If ____''=====================ここから検索開始(Sheet2)========================= ____''ここで間違っていたポイントは↓の範囲指定がCells("A:A")となっていた所です ____''セル範囲の指定はRangeオブジェクトで行います ____Set FoundCell = Sheets("Sheet2").Range("A:A").Find _ ____________(What:=.Range("A1").Value) ____If Not FoundCell Is Nothing Then ______Set FirstCell = FoundCell ______''Cellsプロパティで最終行を取得する所ですが、Rows.Countも ______''シートオブジェクトを指定します ______FoundCell.Resize(1, 2).Copy .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) ______Do ________Set FoundCell = Cells.FindNext(FoundCell) ________If FoundCell.Address = FirstCell.Address Then __________Exit Do ________Else __________FoundCell.Resize(1, 2).Copy .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) ________End If ______Loop ____End If ____''======================ここから検索開始(Sheet3)========================= ____''こちらは見つからなかったらメッセージを出して処理を抜けます ____Set FoundCell = Sheets("Sheet3").Range("A:A").Find _ ____________(What:=.Range("A1").Value) ____If Not FoundCell Is Nothing Then ______Set FirstCell = FoundCell ______FoundCell.Resize(1, 2).Copy .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) ______Do ________Set FoundCell = Cells.FindNext(FoundCell) ________If FoundCell.Address = FirstCell.Address Then __________Exit Do ________Else __________FoundCell.Resize(1, 2).Copy .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) ________End If ______Loop ____Else ______MsgBox "見つかりませんでした", vbInformation ______Exit Sub ____End If __End With End Sub 解らない所があったり動かなかったりしたら、再度質問お願いします。 ※半角スペースが消えて見づらいので、半角スペース2個をアンダーバーに置き換えてます

sanyp
質問者

補足

ありがとうございます。 後で試してみます。 できれば、検索結果を更に検索する、Cells(i,1).valueを検索するようなコードを教えていただけるとありがたいです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

Cells(i,1).Value(例えばですが)で検索条件を行方向で複数指定したい場合は、 Sub 検索() __Dim i As Long __For i = (初めの行番号) To (終りの行番号) ''使う数値に置き換えてください ____''今回の処理(要修正) ※.Range("A1").Value ⇒ .Cells(i,1).Value __Next i End Sub みたいな感じでいいんでしょうか? ただし、そうなるとA列に全ての結果がコピーされるので見辛いと思います。 A列に検索条件を列挙して、対応した行のB列以降にその行の結果を出力していった方が分かりやすいかもしれません。 内容を正確に把握できていないので、この程度しか回答できずすみません。 追記:前回の投稿のコードですが、Find関数は引数が必要な場合がありますので、その場合適宜追加してお使いください。

sanyp
質問者

補足

やはりそれでいんですよね。元のコードが間違っていたので、エラーになったようです。 前回の回答ですが、sheet2にあってもsheet3にないと「見つかりません」となるようです。 説明が悪くて申し訳ありません。sheet2,3それぞれを検索するのですが、sheet2になかったらsheet3を探すという風にしたかったのです。 頂いたコードを少し修正したらできましたので、前回の回答をベストアンサーとさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Find関数内にFind関数をかける場合

    エラー91が発生し、手詰まりです。 どなたかご教授お願いいたします。 Find関数でDo~lppoを行い、初期の検索結果アドレスでLoopを抜けようと思ったのですが。。 エラーしてしまいました。 Find関数内にFind関数を用いることが出来ない と目にしたのですが。 下記のようなVBAの場合 どのように対処したらいいでしょうか? また、VBA初心者のため VBA文が見づらかったり、おかしなところがあると思います。 その部分についても教えて頂けたらと思います。 Sub SAMPLE() Dim TargetDE As String '文字列型 Dim TargetNo As String '文字列型 Dim PODate As String '文字列型 Dim FoundCell As Range ' Dim FoundDate As Range Dim FoundCellNo As Long '長整数型 Dim FoundDateNo As String Dim SearchArea As Object 'オブジェクト型 Dim tar_obj(1) As Object 'オブジェクト型 Dim Addr As String '文字列型 Dim Lastrom As Long ' Dim POLEFT As Range '検索文字列入力(DE) TargetDE = Application.InputBox("Fill in a DE:??", "DE:??", Type:=2) If TargetDE = "False" Then Exit Sub '検索対象範囲 Set SearchArea = Workbooks("Sample sample.xlsx").Sheets("Sample") Set tar_obj(1) = Workbooks("INPUT FORMAT.csv").Sheets("INPUT FORMAT") '表示先をクリア tar_obj(1).Cells(1, 1).CurrentRegion.ClearContents '検索実行 Set FoundCell = SearchArea.Range("C:C").Find(What:=TargetDE, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列(DE)を含むセルがない場合は終了 If FoundCell Is Nothing Then Exit Sub '検索文字列入力(DE Number) TargetNo = Application.InputBox("Fill in DE nomber", "Nomber", Type:=2) If TargetNo = "False" Then Exit Sub '最初の検索結果の行数を格納 Addr = FoundCell.Address '検索文字列入力(PO Date) PODate = Application.InputBox("Fill in Sample Date", "Date", Type:=2) If PODate = "False" Then Exit Sub Do '検索Cell右横の値がTargetNoと同じ場合 If FoundCell.Offset(0, 1).Value = TargetNo Then '行番号を代入 FoundCellNo = FoundCell.Row '検索の下限値を変数に代入 F_LAST = FoundCellNo + 50 '検索実行 Set FoundDate = SearchArea.Range(SearchArea.Cells(FoundCellNo, 1), SearchArea.Cells(F_LAST, 1)).Find(What:=PODate, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列を含むセルがない場合は終了 If FoundDate Is Nothing Then 'MsgBox "Find is mistake" '検索文字列を含むセルがある場合 Else '変数に行番号代入 FoundDateNo = FoundDate.Row If FoundDate.Offset(1, 1).Value = "" Then MsgBox "The position of the cell is not correct. Please coordinate macro. " Else POLEFT = FoundDate.Offset(1, 1) For i = 2 To 13 If FoundDate.Offset(1, i) <> 0 Then If FoundDate.Offset(1, i) <> "." Then If IsNumeric(FoundDate.Offset(1, i).Value) = True Then '表示先(INPUT FORMAT)の行数をカウントアップ cnt = cnt + 1 PORIGHT = FoundDate.Offset(1, i).Value tar_obj(1).Range("E" & cnt) = POLEFT & PORIGHT End If End If End If Next i End If End If ElseIf FoundCell.Offset(0, 1) <> TargetNo Then ' MsgBox "Find is mistake" End If '次の検索を実行 Set FoundCell = SearchArea.Range("C:C").FindNext(After:=FoundCell) Loop While Not FoundCell Is Nothing And FoundCell.Address <> Addr ' If FoundCell.Offset(0, 1) <> TargetNo Then ' MsgBox "Not Find Number" ' End If End Sub

  • マクロFind検索で見つからなかった時の対処

    エクセル2013です 以下のコードを作成しましたが .Rowが色で塗られ 「型が違います」でERRになります。 .Columnの方はERRでなく なぜ.Rowの方がERRなのでしょうか? よろしくお願いします。 Dim 検索行番号 As Range Dim 判定列番号 As Range Dim 検索列番号1 As Range Dim 検索列番号2 As Range Set 検索行番号 = Rows(1).Find("みかん").Column If 検索行番号 Is Nothing Then MsgBox "みかんが有りません。" End If Exit Sub Set 判定列番号 = Rows(1).Find("りんご").Column If 判定列番号 Is Nothing Then MsgBox "りんごが有りません。" End If Exit Sub Set 検索列番号1 = Range("B:B").Find("大箱").Row If 検索列番号1 Is Nothing Then MsgBox "大箱が有りません。" End If Exit Sub Set 検索列番号2 = Range("B:B").Find("小箱").Row If 検索列番号2 Is Nothing Then MsgBox "小箱が有りません。" End If Exit Sub

  • 結合していないセルの検索?

    複数シートから指定の1行を別のシートに行を追加して貼り付けをしたいのですが、コピー元が結合していたり、していなかったりとバラバラなため、貼り付け先がぐちゃぐちゃになってしまいお手上げ状態です。 セルの結合は、行は最大2行ですが、列は1列~6列など添付画像のように統一されていません。 例えば、B3~AC4の中でセルの結合が解除されている場所を検索して、ヒットしたら手動でその部分を結合させるということはできますか? もしくは他に良い方法はありますか? ご教示よろしくお願いいたします。 スクリプトは見様見真似で以下のように書きました。 Sub コピー() Dim sh1 As Worksheet Dim FoundCell As Range, FirstCell As Range '「項 目」という文字列を検索  For i = 1 To Worksheets.Count - 2 '←最大シート数  Sheets(Sheets(i).Name).Select  Set FoundCell = Cells.Find(What:="項*目")    If FoundCell Is Nothing Then       MsgBox "見つかりません"     Exit Sub     Else       ’入力されているセルを右に向かって探す     Set FirstCell = FoundCell     Set FoundCell = FoundCell.End(xlToRight)        '指定の範囲を貼り付け先にコピー        FoundCell.Resize(2, 25).Copy     Sheets("SheetA").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteAll     Application.CutCopyMode = False   End If  Next i End Sub

  • FINDで複数ヒットする場合

    EXCELで 範囲(A1:J2)で「東京」が存在する最初の列番号は以下で求められますが 範囲内には、他にも「東京」が複数ヒットします。 その場合は、どのようなコードになりますか ? 作業手順として考えたのは 最初に見つけた「東京」の次の列からを検索範囲に変更して次の「東京」をFIND 同じように検索範囲を次々と変更して最終的に「東京」が見つからなかったらFINDを終了すれば良さそうですが? 又、 他に良いコードがあれば教えてください。 Sub FindColumns() Dim searchString As String Dim searchRange As Range Dim foundCell As Range Dim columnNumbers As String ' 検索する文字列を指定 searchString = "東京" ' 検索範囲を指定 Set searchRange = Range("A1:J2") ' 検索を実行 Set foundCell = searchRange.Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart) If foundCell Is Nothing Then MsgBox "「東京」が見つかりませんでした。" Else MsgBox "ヒットした列番号: " & foundCell.Column End If End Sub

  • VBAを使って検索をしたい

    VBAを使って検索をしたい EXCEL2007を使っております。 フォームを立ち上げて日付を入れるとシートの検索を行い、リスト内にその日付のA~Gまでのセルの内容が表示され、それらを別シートに貼り付けるといったことをしたいのですが、複数のセルの情報をリスト内に表示をするのが、よくわからず教えていただきたく思います。 フォーム内のテキストボックスに検索する日付を入れると 画像でいうところのA列を検索し、その日付内のA~Gをリストに表示して、ボタンを押すと貼り付けるといった、動きにしたいのですが、お願いします。 現状検索BOXに以下の記述をしてます これでは、A列のものだけが出てきます。お助けください。 ************************* Private Sub TextBox1_Change() Dim r As Range, FirstCell As Range, rng As Range Dim vnt As Variant Dim prow As Long Dim s As Worksheet Dim cnt As Long Set s = Sheets("sheet2") Set rng = Intersect(s.Range("a:a"), s.UsedRange) '検索キー Set r = rng.Find(What:=TextBox1.Text) If r Is Nothing Then MsgBox "見つかりませんよ" GoTo Exit_sub End If Set FirstCell = r ReDim vnt(0) vnt(0) = s.Cells(r.Row, 1).Resize(1, 5).Value '検索位置 prow = r.Row cnt = 1 Do Set r = rng.FindNext(r) If Not r Is Nothing And (r.Address <> FirstCell.Address) _ And (FirstCell.Row <> r.Row) And (prow <> r.Row) Then ReDim Preserve vnt(UBound(vnt) + 1) vnt(UBound(vnt)) = s.Cells(r.Row, 1).Resize(1, 5).Value '検索位置 prow = r.Row cnt = cnt + 1 End If Loop While r.Address <> FirstCell.Address ' If cnt = 1 Then vnt = s.Cells(FirstCell.Row, 1).Resize(1, 5).Value '検索位置 If cnt > 1 Then vnt = Application.Transpose(Application.Transpose(vnt)) ListBox1.List = vnt ' Set FirstCell = Nothing Erase vnt Exit_sub: If cnt = 0 Then ListBox1.Clear Set r = Nothing Set rng = Nothing Set s = Nothing End Sub

  • EXCEL VBAについて質問です

    最近EXCELのマクロを組む勉強を始めました。 幾つかわからないことがあるので、教えてください。 お店の在庫と売上を管理するシートを作成しています。 その管理表では年度ごとにシートを分けています。 調べたいのは、今回注文を受けた会社から過去に注文を受けたことがあるか、受けたことがあれば何年度の何月に受けたか、という内容です。 具体的には「注文者」の名前で検索して、発注日をリストで表示させたいと考えています。 例) A株式会社から商品の注文を受けた 2015年度~2019年の5枚のシートで「A株式会社」を検索し、発注された日を確認したい。 エクセルにもともと備わっている検索機能を使ってもよいのですが、一番知りたいのは「過去にいつ発注されたか」です。本来の検索機能では発注日をリスト表示できません。 各シートのフォーマットはそろっていて、会社名の左隣に発注日が入力されています。※会社名が入力されているのは各シートのC列です。 まずは特定のシートで計算してリストに表示させるマクロを組み、 それがうまくいったらワークシートのインデックス番号を変数としてFor文でループさせてみよう…と考えたのですが、 そもそも特定のシートでもうまくいきませんでした。(列を範囲指定して検索しているはずなのに、そのシート上すべてで検索されてしまう。たとえばE列=備考欄にA株式会社という名前が入っていると、そのセルもリストに表示されてしまう。) これ以上は自分だけで考えていてもうまい方法が思いつかないので、お知恵をお貸しいただけると幸いです。 (似たようなマクロ関連の質問をいくつか投稿しておりますが、初歩的な質問ばかりで申し訳ありません) Sub 検索() Dim FoundCell As Variant Dim FirstCell As Variant Dim mRange As Range Dim keyword As Variant Set mRange = Worksheets("2019年度").Range("C1:C100") keyword = Application.InputBox("調べたい会社名を入力してください") Set FoundCell = mRange.Find(What:=keyword, SearchOrder:=xlByRows) If FoundCell Is Nothing Then MsgBox "過去に発注を受けた履歴がありません" Exit Sub Else Set FirstCell = FoundCell UserForm1.ListBox1.AddItem FoundCell.Address & vbTab & FoundCell.Value & vbTab & FoundCell.Offset(0, 1).Value End If Do Set FoundCell = Cells.FindNext(FoundCell) If FoundCell.Address = FirstCell.Address Then Exit Do Else UserForm1.ListBox1.AddItem FoundCell.Offset(0, -1).Value & FoundCell.Address & vbTab & FoundCell.Value End If Loop UserForm1.Show vbModeless End Sub

  • エクセル マクロ 同じ数値のセルを検索

    教えてください。 sheet2のG1に3と入力しマクロを実行すると、sheet1のA列(通し番号)の3~5の行をコピーして、sheet2のA2にペーストしたいと思ってます。 (sheet1) 番号 数値1 数値2 数値3 数値4   1     5   10   15   20   2    10   15   20   25   3     5   15   20   20   4    10   20   15   25   5     10   15   20   20 ・    ・    ・    ・    ・ ・    ・    ・    ・    ・            ↓ (sheet2) 番号 数値1 数値2 数値3 数値4      3   3    5   15   20    20   4   10   20   15    25   5   10   15   20    20 イメージとしては上の通りです。 まずは、同じsheet1のG1に3を入力して、A列の3(A4)を検索することを目標にしましたが、ここの時点でこけてしまいました。。 Sub 同じ数値のセルを検索() Dim 番号 As String Dim FoundCell As Range Range("A1").Select 番号 = "G1" Set FoundCell = Cells.Find(What:="番号") If FoundCell Is Nothing = False Then FoundCell.Select End If End Sub 笑われると思いますが、これではダメでした。 どうかお助けしていただけないでしょうか。

  • Find,Offsetを使ってセルを指定する方法

    エクセルVBAのことで伺います。 以下の記述は、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、 その中の値(西暦の年が入っています)を、G4からI100までの範囲に入力される月日 の年として置き換える」といったものなのですが、エラーが出てしまいます。 「実行時エラー424、オブジェクトが必要です。」とのメッセージが表示され、デバックを クリックすると、「Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select」 が黄色く強調表示されています。 プログラムの記述をどのように修正すれば良いか、どなたかお教えください。 よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select With Target If Intersect(Target, Range("G4:I100)) Is Nothing Or Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

  • データ検索について

    条件詳細 ・シートは、シートA/シートB。 ・シートAにユーザーフォームを表示するボタンを置く。 ・シートBに商品データ。 ・ユーザーフォームのオブジェクト名は、商品登録。 ・ ユーザーフォームにある項目は、商品番号/商品名/重さの3種類。  ※テキストボックス ・重さは、3種類((1)10kg/(2)20kg/(3)100kg)。 ・検索ボタンを押すと、検索フォームが表示される。 上記条件の下、ユーザーフォームに検索したデータを表示させたいのですが、 私のコードだと、デバックが出てしまい、うまく機能しません。 どのように追加または改造すれば、機能するのか ご教授願います。 私のコードは下記の通りです。 Private Sub cmd検索_Click() Dim SerchKey As String Dim SerchArea As Range lRow = Sheets("商品データ").Cells(65536, "A").End(xlUp).Row + 1 SearchKey = Application.InputBox( _ Prompt:="商品コードを入力して下さい。", Type:=2) If SearchKey = "" Or SearchKey = "False" Then Exit Sub End If Set SearchArea = Sheets("商品データ").Range(Range("A1"), Range("A1").End(xlDown))  ⇒このコードが黄色でデバック! Set FoundCell = SearchArea.Find( _ What:=SearchKey, _ SearchOrder:=xlByRows, _ LookAt:=xlWhole, _ MatchCase:=False) If FoundCell Is Nothing Then MsgBox "見つかりません", vbCritical GoTo ExitHandler End If With FoundCell 商品登録.txt商品コード.Value = .Value 商品登録.txt商品名.Value = .Offset(0, 1).Value 商品登録.txt重さ.Value = .Offset(0, 2).Value End With With Sheets("シートA") If .Cells(lRow, "G").Value = "10kg" Then txt重さ.Value = "0" ElseIf .Cells(lRow, "G").Value = "20kg" Then txt重さValue = "1" ElseIf .Cells(lRow, "G").Value = "100kg" Then txt重さ.Value = "2" End If End With ExitHandler: Set SearchArea = Nothing Exit Sub End Sub 下記がデバック(黄色)が出てしまいます。 Set SearchArea = Sheets("商品ータ").Range(Range("A1"), Range("A1").End(xlDown))   また、10kg/20kg/100kgが数字((1)(2)(3))に変換されません。 If~が機能してないようです。 どのようにしたら良いかお願いします。

  • Findステートメントで別なブックの検索

    Findステートメントで検索した内容のある行のA列にある値をキーワードとして別なブックのA列に検索をかけてヒットしたセルの内容を元のブックの指定したセルに移すという動作をさせたいので次ののように書いてみました。 Private Sub CommandButton2_Click() Dim Yline As Long Dim No As Variant Dim c As Range Dim sh As Worksheet Dim sh_no As Integer Dim findcell As Range Dim add As String Set sh = Worksheets("ブックAの1") No = TextBox1.Text sh_no = 1 'テキストボックスに値が入っていた場合 If No <> "" Then 'Find メソッドの最低のプロパティは入れる。SearchOrder は特にいらない Set c = sh.Range("B:B").Find( _ What:=No, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '見つかった場合にのみ、値を入れる If Not c Is Nothing Then Yline = c.Row '見つかった行のA列の文字列でブックBに検索をかける add = sh.Cells(Yline, 1).Value Workbooks("B").Activate Set findcell = Workbooks("B").Worksheet(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '前Setステートメントからのループ検索開始 If findcell Is Nothing Then Do sh_no = sh_no + 1 If sh_no > ThisWorkbook.Worksheets.Count Then Exit Sub End If Set findcell = Workbooks("B").Worksheets.(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) Loop While findcell Is Nothing End If End If Workbooks("A").Activate With Worksheets("Aの2")   .Cells(21, 4).Value = sh.Cells(Yline, 14).Value .Cells(20, 4).Value = sh.Cells(Yline, 15).Value .Cells(36, 4).Value = findcell End With Unload Me Else MsgBox No & " は見つかりません。", 48 End If Set sh = Nothing End Sub するとwhat:=addとしてaddが見つかるまでシート番号を増やしていくループのところでエラーがでてキーワードが見つからないと出ます。恐らくブックBを検索してくれているとは思うのです。A列に空白があるためかと思い埋めてみましたが関係ないようです。 構文エラー的なものは無いと思いますが、宜しくお願いします。

このQ&Aのポイント
  • 883AWプリンターを使用してWebページを印刷する際にエラーが発生してしまう問題が発生しています。
  • 印刷の途中でエラーが出てしまい、正常に印刷が完了しない状況です。
  • 印刷するWebページの内容や設定に問題があるのか、プリンター本体に何かしらの不具合があるのか、確認が必要です。
回答を見る

専門家に質問してみよう