EXCEL VBA:Range("A:A").Find(What:="キーワード")の1行目について

このQ&Aのポイント
  • 【EXCEL VBA】Range("A:A").Find(What:="キーワード")の1行目について自分なりに検索してみましたが、解決策を発見できませんでしたので質問させて下さい。
  • EXCEL VBAのRange関数を使ってセルA列の中から指定のキーワードを検索し、最初に見つかった行の行番号を取得するマクロを作成しています。
  • しかし、1行目とそれ以外の行に検索対象が存在する場合に、最初に見つかった行の行番号が正しく取得できない問題が発生しています。どのように解決すればよいでしょうか?
回答を見る
  • ベストアンサー

【EXCEL VBA】Range("A:A").Find(What:="キーワード")の1行目について

自分なりに検索してみましたが、解決策を発見できませんでしたので質問させて下さい。 Sheet1・・・セルA1~A5の任意の場所に"5"を入力します。 標準モジュールに、以下のコードを記入しました。 Sub test() Dim i As Integer i = Sheets("Sheet1").Range("A:A").Find(What:="5").Row MsgBox i End Sub 見ての通り、A列全体から、1行目を起点に"5"を上から順に検索し、 最初に見つかった行ナンバーをメッセージボックスに表示するマクロです。 このマクロを実行した際、以下のようなことが起こりました。 "5"を入力するセル  /  MsgBoxが表示する行番号 (1) 1、2、3行目  /   2 (2) 1、3行目    /   3 (3) 1行目      /   1 (4) 3、4、5行目  /   3 このように、(3)「1行目のみに検索対象が存在する場合」及び (4)「2行目以降に複数件、検索対象が存在する場合」には 最初に見つかったセルの行番号を正しく返してくれるのですが、 (1)(2)「1行目とそれ以外の行に検索対象が存在する場合」には、 「2行目以降」で最初に見つかったセルの行番号が返ってきます。 これはEXCEL VBAの仕様なのでしょうか? 社内で利用するために作成したツールの一部に上記コードを組み込んでおり、 想定した通りに動いてくれずに困っております。 やりたいことは、A列全体から指定のキーワードが存在するセルを検索し、 1行目も含めて、最初に見つかったセルの行番号を取得することです。 ご助言頂けますよう、よろしくお願いします。

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Sub test2() 'Dim i As Integer Dim i As Long 'の方が宜しいかも With Sheets("Sheet1") i = .Range("A:A").Find(What:="5", After:=.Range("A" & Rows.Count)).Row End With MsgBox i End Sub After:= で検索開始する位置を指定します。 ⇒実際には指定セルの次に見つかったセルですので、A列の最終行を指定しておくとこの場合A1を最初に見つけてくれます。

gugugugu19
質問者

お礼

ありがとうございます、よく分かりました。 今更ですが、VBAヘルプに記載されていましたね・・・ また何かありましたらよろしくお願いします。

関連するQ&A

  • EXCEL2000、VBAのFindメソッドの仕様(1行目の取扱)について

    EXCEL2000のVBAでマクロを作っています。 Sheet1のA列に下記の様に数字を入れ、作成したfindcheckのマクロを実行します。検索値の5は一番最初に1行目に現れるので、メッセージボックスによって1と表示されるはずなのですが、4と出ます。 おかしいなぁと思って4行目の5を別の数字にするとメッセージボックスで1が表示されるようになりました。いろいろ検索してみると、フィルタなどでは1行目はタイトルとして扱われる…みたいな記述があったので、この場合も1行目は特別な意味を持つのかなぁと思い質問しました。 今回は検索結果が複数ある場合、1番最初に出たセルの行数を表示したいと思っています。1行目を「数値一覧」として、列タイトルの様にしたところ、うまくいきそうでした。もしこの動作が仕様なのかどうかご存じの方がいらっしゃったら教えていただきたいと思います。 どうぞよろしくお願いします。 ■Sheet1のA行目の数字 ----------------------------------------------------------- 5 3 2 5 4 3 2 1 1 ----------------------------------------------------------- ■VBAのコードサンプル ----------------------------------------------------------- Sub findcheck() Dim searchResult As Range Set searchResult = Worksheets("Sheet1").Columns("A").Find("5") If searchResult Is Nothing Then MsgBox "見つかりません" Else MsgBox searchResult.Row End If End Sub -----------------------------------------------------------

  • エクセル VBA find は別シートを検索できますでしょうか?

    こんばんわ。マクロ初心者です。 皆さんいつも親切なご回答ありがとうございます。 早速ですが質問内容を記入いたします。 ・ブックA を開いています。 選択している行のC列セルの値を検索キーワードにして、 ブックB 内を検索し、検索結果のセルの3つ左のセルの値を、 ブックA で選択していたセルの同じ行のO列(15列目)に入力したいです。 ※ブックBをアクティベートする事無く行えますでしょうか? (他の処理と組合わせて行い、回数も多いので、  ブックA⇔ブックB アクティベートの往復は避けたいです。) 下のようなマクロを作成してみましたがうまくいきません。 どうかご指導よろしくお願いいたします。 --------------------------------------------------------------- dim 検索品目 as string dim fcell as object dim i as integer i = Selection.Row '選択行の3列目セルの値を変数『検索品目』に格納 検索品目 = Cells(i, 3).Value 'オブジェクト変数『fcell』に検索したセルを格納 Set fcell = Cells.Find(What:=検索品目, After:=Workbooks("ブックB.xls").Worksheets("sheet1").Range("G2"), LookAt:=xlWhole, searchorder:=xlByColumns) '検索したセルの3行左のセルの値を変数『オーダ番号』に格納 オーダ番号 = fcell.Offset(, -3).Value 'ブック A の選択行の15列(O列)にデータ入力 Cells(i, 15) = オーダ番号

  • 検索の実行で、ヒットした行のA列の番号を、セルB3に自動入力するマクロ

    検索の実行で、ヒットした行のA列の番号を、セルB3に自動入力するマクロを教えてください。 エクセルの6行目から約19000行目まで、A列には1からの番号、B列に薬名、C列に剤形、D列にコードが入力されている薬台帳があるのですが、この台帳から薬名を検索して、最初にヒットしたA列の番号をセルB3に表示したいのです。 どなたかよろしくお願いします。

  • 【Excel VBA】データの最終行について

    Excel2003を使用しています。 ある一覧表形式のデータSheet1をSheet2に値のみコピーして、このSheet2を“印刷用”として、ページ設定等をして、印刷のみに使用しようと思っています。 Sheet2のI列、J列、K列には数値が入力されていて、I列、J列、K列のデータの最終行の1行下に、それぞれ6行目からデータ最終行までの合計の数式が入力されるよう、コードを追加したのですが、数式は入力されるものの、入力したい行に数式が入力されません。 マクロを実行して、数式が入力された行を見てみると、301行目に入力されていました。 Sheet1は別のシートのデータを数式により表示していて、数式が300行まで入力されているので、Sheet2の元になっているSheet1の影響(?)なのかな~?と…。こういう場合、どうすればいいでしょうか? コードは下記のようになっています。 よろしくお願いします。 ---------------------------------------- Sub 印刷用作成() Dim i As Integer Dim j As Long Sheets("Sheet1").Activate Range("B6:L6", Range("L6").End(xlDown)).Select Selection.Copy Sheets("Sheet2").Select Range("B6").PasteSpecial xlPasteValues Application.CutCopyMode = False For i = 9 To 11 j = Application.Max(j, Cells(65536, i).End(xlUp).Row + 1) Next For i = 9 To 11 Cells(j, i).FormulaR1C1 = "=SUM(R2C[0]:R[-1]C[0])" Next i End Sub

  • [Excel VBA]複数ファイルで条件を満たす行

    Office 365を使用しています。 下記の条件で行削除したいのですが、マクロではどうのよに記述したら良いでしょうか? ・対象のExcelファイルが↓3つあります >グループリスト >一般顧客 >特別顧客 条件; >グループリストファイル; F列 ---- 1-1 'グループ番号 D列 ---- XXXX '顧客番号 ・グループ番号 1-1のすべての顧客番号が削除対象 処理; 1. >一般顧客ファイル A列 ---- XXXX-XX 'サブ顧客番号 B列 ---- XXXX '顧客番号、グループリストファイルのD列 ・B列、グループリストファイルのD列がマッチした全行を削除して、削除件数をカウント 2. >特別顧客ファイル H列 ---- XXXX-XX 'サブ顧客番号 ・H列、一般顧客ファイルのA列がマッチした全行を削除して、削除件数をカウント *一般顧客ファイルでマッチした行の削除前に、特別顧客ファイルの対象行を削除する必要があると思います

  • 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】ThisWorkbook モジュールのマクロ

    Excel2003を使用しています。 39枚のシートから成るBook1のThisWorkbook モジュールに、C列に“○月計”と入力されたら、その行のE列、F列、G列へ数式を入力するコードを書いています。 現在は、それぞれのシート(39枚のシートのうち3枚を除く36枚)のC列最終行から2行下のセルへ“○月計”と手入力していますが、マクロで“○月計”と入力されるようにすれば、ThisWorkbook モジュールに書いているコードも実行されて、数式の入力までマクロで処理できるのかな?と思い、試しに、36枚それぞれシートのC列最終行から2行下のセルへ“○月計”と入力されるようコードを書いてみました。 …が、そうではないのか、それぞれのシートのC列最終行から2行下のセルへ“○月計”と入力されるものの、E列、F列、G列へ数式は入力されません。 せっかくなので、できることなら数式の入力までマクロで処理したいのですが、どのようにしたらThisWorkbook モジュールに書いているコードまで実行されるのでしょうか? よろしくお願いします。

  • 「シート1のアクティブセルをコピーしてシート2のA列の最終行+1に貼り付ける」

    「シート1のアクティブセルをコピーしてシート2のA列の最終行+1に貼り付ける」 というVBAコードが知りたいのですが Sub Macro1() Selection.Copy Sheets("Sheet2").Select Selection.End(xlDown).Offset(1).Select ActiveSheet.Paste End Sub ではうまくいきませんでした。 ・マクロを実行する前のもともとのアクティブセルはシート1の入力されたセル上にあるとします。 ・シート2のA列にはA1~A?と削除したり挿入したりで数が変わりますが何かしら文字列が隙間なく入っています。 よろしくお願いします。

  • VBA Rangeの足し算

    どもども、とってもVBA初心者です。 "A1"のセルに任意の数字をいれます. ・"B2"セルより"A1"に代入された数分、列を移動させたセルを選ぶマクロ ・"B2"セルより"A1"に代入された数分、行を移動させたセルを選ぶマクロ 本読んでもでてこないくらい初歩のようです。 よろしくお願いします。

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。