エクセルマクロで同じ数値のセルを検索する方法

このQ&Aのポイント
  • エクセルマクロを使って、同じ数値のセルを検索する方法を教えてください。
  • 具体的な目標は、sheet1のA列から特定の数値を検索し、その行から特定の範囲をsheet2にコピーしてペーストすることです。
  • 現在のマクロでは正しく動作していないため、修正方法を教えていただきたいです。
回答を見る
  • ベストアンサー

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

教えてください。 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 笑われると思いますが、これではダメでした。 どうかお助けしていただけないでしょうか。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

シート2のA2に =IF(OR($G$1="",COUNTIF(Sheet1!$A:$A,$G$1)=0),"",INDEX(Sheet1!A:A,MATCH($G$1,Sheet1!$A:$A,0)-1+ROW(A1))) と記入、右にコピー、下にコピー ぐらいで十分に見えますが。 どーしてもマクロなら、たとえば sub macro1()  dim FoundRow as long  worksheets("Sheet2").select  range("A2:E4").clearcontents  on error resume next  foundrow = application.match(range("G1").value, worksheets("Sheet1").range("A:A"), 0)  range("A2:E4").value = worksheets("Sheet1").cells(foundrow,"A").resize(3,5).value end sub とか。

meina04
質問者

お礼

VBAも簡単なのでちょっとの変更も楽そうです。 ありがとうございました。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは4! 色々やり方はあるかと思いますが・・・ 一例です。 Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub Sample1() Dim i As Long, c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Cells(Rows.Count, "A").End(xlUp).Row If i > 1 Then wS2.Rows(2 & ":" & i).ClearContents End If Set c = wS1.Range("A:A").Find(what:=wS1.Range("G1"), LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then wS1.Rows(c.Row & ":" & wS1.Cells(Rows.Count, "A").End(xlUp).Row).Copy wS2.Range("A2") Else MsgBox "該当データなし" End If End Sub こんな感じではどうでしょうか?m(_ _)m

meina04
質問者

お礼

エクセル2003年度版を使用しているせいか、シート2に3を入力してマクロを実行すると、A2からE2に関係のない数値?が表示されました。 会社の2010年度版で試してみたいと思います。 ありがとうございます。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

関数式では 全く参照関係内のないものを持ってくるのは 確かに無理ですが、 3行位なら、関数式の方が早いかも知れません。 駄目ですか? もし、興味を持たれましたなら、 その旨をお申し付けください。 お役に立てれば幸いです。 ところで、 FINDを使う時は パラメーターを省略すると 思いもよらぬ事が起きますよ? Option Explicit Function 領域の取得(ByVal 検査範囲 As Long, ByVal Key文字列 As String, ByVal シート As String) As range Dim r As Variant '   With Worksheets(シート)     Set r = .range(.Cells(1, 1), .Cells(検査範囲, 検査範囲)).Find(What:=Key文字列, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False, MatchByte:=False) ……… …… … … … 的に、 僕は個人的には、全て指定することを お勧めしますよ?

meina04
質問者

お礼

マクロをはじめて間もないので時間をかけて入力したいと思います。 ありがとうございます。

関連するQ&A

  • Excel VBA テキストボックスを検索

    テキストボックス3に数値を入力し ExcelのA列にあるか検索をかける。 ある場合は、B列の同じ行に 「みーつけた!」と入力。 その設定で組んでみたのですが、 テキストボックス3にデータを6桁入力しようとすると 6桁目にオーバーフローエラーが出ます。 このプログラムの何処がおかしいのでしょうか? Private Sub TextBox3_Change() Dim Number As Integer If TextBox3.Value <> "" Then '空じゃない場合 Number = TextBox3.Value Call 検索(Number) MsgBox TextBox3.Value End If End Sub Sub 検索(ByVal Number As Variant) Dim FoundCell As Range Set FoundCell = Range("A:A").Cells.Find(What:=Number, lookat:=xlPart) If FoundCell Is Nothing Then Else FoundCell.Activate Range("O" & ActiveCell.Row).Value = "みーつけた!" End If End 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

  • セルの値からマクロで検索を行うには

    エクセルのシート1枚に700件程の物品の在庫管理をしています。 件数が多いためナンバーで検索を行えるよう、以下のようなマクロを作ってみました。 Sub 検索を行う() Dim 検索セル As Range Set 検索セル = Range("A1:A675").Find(120) If Not 検索セル Is Nothing Then 検索セル.Activate End If End Sub これでA列の「120番」を検索できるのですが、セルに入力した数値を検索するには、どうすればよいのでしょうか?? (例えばセルE1に120と入力して検索) 色々調べてみたのですが、セルの値から検索ができなくて・・・・。 よろしくご教授ください。

  • エクセル 2010 マクロ 検索

    http://okwave.jp/qa/q8562170.html 上記質問に追加です。 ※1 'D,E,F,G,H,I,K を検索してD,E,F,G,H,I に検索対象があった時 E,F,G,H,Iのいずれかだったら左横列の上に向かって (EならD 、FならE ・・・という具合に) 何か入力されているセルのM列の191000####をmsgboxで表示させたいです。 (画 F11セル(A-1)が検索ヒットした場合E9セル(R-01)を辿り、 その行のM列のセル(191000####)をmsgboxで表示 ※2 但し、検索結果がD列のデータだった時、その行のM列が191000####だった場合 M列の191000####をmsgboxで表示させたいです。 (画 D25セル(Y-1)対象の時) ※3 また、検索結果がD列のデータだった時、その行のM列が191000####以外だった場合 (空白だったり191000####以外の場合) M列の一番上の191000####をmsgboxで 191000####&「これは例外です」と表示させたいです。 (画 D24セル (X-1)対象の時) 現在のコードは下記のとおりです。 Sheet1に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "$A$3" Then Exit Sub Call 検索 Range("A1:A2").Clear Range("A1").Activate End Sub 標準モジュールに Sub 検索()  Dim Ws1 As Worksheet, Ws2 As Worksheet  Dim strKey As Variant  Dim s As String  Dim c As Range, bln As Boolean  Dim rng1 As Range  Dim cnt As Long    Set Ws1 = Sheet1  Set Ws2 = Sheet2    Ws1.Select    With Ws2   strKey = Application.Transpose(.Range("A1").Resize(2).Value)   strKey = Join(strKey, "")  End With    If Trim(strKey) = "" Then MsgBox "検索キーが空です", vbCritical: Exit Sub      With Ws1   Set rng1 = .Range("K2", .Cells(Rows.Count, "K").End(xlUp))   For Each c In rng1.Offset(, -10)     'D,E,F,G,H,I,Kを検索    s = c.Offset(0, 3).Value & c.Offset(0, 4).Value & c.Offset(0, 5).Value & c.Offset(0, 6).Value & c.Offset(0, 7).Value & c.Offset(0, 8).Value & c.Offset(0, 10).Value &        If StrComp(s, strKey, vbTextCompare) = 0 And c.Offset(0, 2).Value = "" Then     c.End(xlToRight).Activate c.Offset(0, 2).Value = Date          c.Resize(1, 14).Interior.ColorIndex = 6     bln = True     Exit For    End If   Next c      If Not bln Then    Ws2.Select    MsgBox "リストに存在しません", vbExclamation, "NotFound"   Else '加える    Call ReSearch(Ws1.Range("M2"), c.Row)    '再設定    Set rng1 = .Range("K6", .Cells(Rows.Count, "K").End(xlUp))    MsgBox "残り" & DoubleCountBlank(rng1.Offset(, -8), rng1) & "品目です。", vbInformation   End If  End With  Application.Goto Ws2.Range("A1"), True End Sub Sub ReSearch(Rng As Range, j As Long) '最初のセル, 終わりの行数 Dim i As Long Dim Ws As Worksheet With Rng.Parent For i = j To Rng.Row Step -1 If CStr(.Cells(i, Rng.Column).Value) Like "191000####" Then MsgBox "指図番号 " & vbCrLf & CStr(.Cells(i, Rng.Column).Value) & " の部品です" Exit For End If Next i End With End Sub Function DoubleCountBlank(rng1 As Range, rng2 As Range) '横並びのセルのブランクをカウントする (セル範囲1 , セル範囲2)  Dim i As Long  Dim cnt As Long  For i = 1 To rng1.Rows.Count   If VarType(rng2.Cells(i, 1)) = vbDouble Then    If rng1.Cells(i, 1).Value = "" And rng2.Cells(i, 1).Value <> 0 Then     cnt = cnt + 1    End If   End If  Next i  DoubleCountBlank = cnt End Function 宜しくお願い致します。

  • 検索マクロがおかしくなって原因がわかりません

    Sheet1のA列にはあらかじめ通し番号が1から入っていて、B列3行目からデータを入力していき、データ入力がされているまでの範囲で検索条件を満たすデータをSheet2へ表示させるマクロ実行で、いつしか、Sheet1のB列にデータが入っていないあらかじめ入力済みのA列の番号全てが検索結果として表示されるようになり、原因がわかりません。 お助けください。 Sub 未到着() Dim Rng As Range Dim i As Long Dim Deliveries As Variant Dim h As Long, j As Long Dim DataRows As Long Dim Result As String ''未到着書類(Sheet2)のフィールド行(受付番号、氏名)は、5行目に(設定して)ある With Sheet1 'Sheet1 をオープン .Activate i = 6 '6行目から該当リストを表示させる 'ユーザーフォームによるメッセージ表示 UserForm1.Show vbModeless DoEvents Set Rng = Range("B3", .Range("B65536").End(xlUp)) For Each c In Rng ' "通知書", "受領書", "預り証", "保険証書" の4項目を検索 If Application.CountA(c.Offset(, 9).Resize(, 4)) <> 4 Then 'A列から、A列を含めて14列取得し、未到着書類にコピー c.Offset(, -1).Resize(, 14).Copy Sheet2.Cells(i, 1) i = i + 1 End If Next End With 'メッセージ用のユーザーフォームを閉じる UserForm1.Hide '配列式に格納 Deliveries = Array("通知書", "受領書", "預り証", "保険証書") 'Sheet2 をオープン With Sheet2 .Activate DataRows = Range("A2", Range("A65536").End(xlUp)).Rows.Count + 1 For h = 6 To DataRows '6行目から For j = 11 To 14 '10列目~13列目 If .Cells(h, j).Value = "" Then '調べたセルの文字列0の長さだったら、 '配列より、取り出す Result = Result & ";" & Deliveries(j - 11) End If Next j If Result <> "" Then '結果が空でないなら、N列に貼り付け .Cells(h, 14).Offset(, 1).Value = Mid(Result, 2) Result = "" End If Next h End With End Sub

  • VBA 特定もセルに入力で実行

    下記のコードを実行した際は問題なく実行されるのですが これを特定のセルに値が入力された際に動かそうとするとエラーになってしまいます。 Sub PaintTargetCharacter() Dim FoundCell As Range, FoundCell2 As Range Dim Addr As String Dim Addr2 As String Dim SearchArea As Range Dim SearchArea2 As Range Application.ScreenUpdating = False ActiveCell.Interior.ColorIndex = 0 '検索対象範囲 Set SearchArea = Worksheets("G番情報").Range("AE6:BG6") '検索実行 Set FoundCell = SearchArea.Find(What:=ActiveCell.Offset(0, -1), LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列を含むセルがない場合は終了 If FoundCell Is Nothing Then Exit Sub Set SearchArea2 = Range(FoundCell.Offset(1, 0), FoundCell.Offset(33, 0)) Set FoundCell2 = SearchArea2.Find(What:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell2 Is Nothing Then Exit Sub FoundCell2.Copy Destination:=ActiveCell Application.ScreenUpdating = True End Sub 当然、特定のセルで値を入力後エンターキーを押すとアクティブセルは下に下がってしまうので Private Sub Worksheet_Change(ByVal Target As Excel.Range) Target.select Call PaintTargetCharacter End Sub としているのですが Set FoundCell = SearchArea.Find(What:=ActiveCell.Offset(0, -1), LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) の部分でエラーが起きてしまいます。 また停止してシートに戻るとセルのカーソル表示が消えてしまいます。 この現象はシートを閉じて再度開くと直りますが なにかエラーと関係しているのでしょうか? 初心者なのでおかしな部分が多々あると思います。 ご指摘などあれば宜しくお願いします。

  • 数値の入ったセルの色分け

    エクセル(2003)で数値の入ったセルを色分けしたいです。 色んなサイトを見て下記を書いてみましたが 数値を入力すると色が変わるのですが 別のところから数値をコピーペーストすると色が変わりません。 マクロでもVBAでもなんでもかまいません。 数値を5種類に分けてセルの色を変える方法を教えていただきたいです。 宜しくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myNO As Integer With Target If .Count > 1 Then Exit Sub If IsEmpty(.Value) Then Exit Sub If Not Application.Intersect(Target, Range("A1:AX51")) Is Nothing Then Select Case .Value Case Is <= 54: myNO = 3 Case 55 To 79: myNO = 39 Case 80 To 104: myNO = 4 Case 105 To 119: myNO = 33 Case Is >= 120: myNO = 6 End Select .Interior.ColorIndex = myNO End If End With End Sub

  • VBA 検索して一致したセルへジャンプさせたい

    Excelにて、シート1のA列とシート2のA列のデータにNoを入れます。 シート1のA列のNoをクリックすると、シート2のA列の同じNoにジャンプするマクロを組みたいです。 現在組んでいるマクロは、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Sht As Worksheet Dim Rng1 As Range Dim Rng2 As Range Dim FindCell As Range Set Sht = Worksheets("シート2") Set Rng1 = Range("A2:A100") Set Rng2 = Sht.Range("A2:A100")If Intersect(Target, Rng1) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub Set FindCell = Rng2.Find(Target.Value) If Not FindCell Is Nothing Then Application.Goto Reference:=FindCell, Scroll:=False End If End Sub です。 一応マクロは実行されますが、そうすると、シート1のA列の編集(Noを追加したり変更したり・・・)できません。 編集や変更もできて、検索マクロも実行できるというマクロの組み方はありますでしょうか?

  • Excel VBA でテキストボックスの値をセルA列から検索

    いつもお世話になります。 Private Sub CommandButton3_Click() Dim 行 As String Dim 列 As String Dim 最終行 As String Dim 検索行 As String Dim メッセージ As Integer Dim 一致 As Range Dim myNO As Variant Dim i As Long Sheets(3).Select 最終行 = Range("A2").End(xlDown).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column myNO = TextBox2.Value 検索行 = Range("A2").End(xlDown).Select ※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole) If 一致 Is Nothing Then MsgBox "データがありません。新規コード入力します。" Cells(行, 列 + 0) = UserForm1.TextBox2.Value Cells(行, 列 + 1) = UserForm1.ComboBox7.Value Else i = Cells(行 - 1, "A") Cells(i, 列 + 0) = UserForm1.TextBox2.Value Cells(i, 列 + 1) = UserForm1.ComboBox7.Value End If End Sub 「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。 ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

  • エクセル:セルの検索

    Sheet1のC~G列を検索し、 [AAA]が見つかれば「成功」、見つからなければ「失敗」と表示するコードを作りました。 (実際のコードでは、AAAが見つかったセルBBBの.Addressや.Valueを使いたいので「Set BBB」などという書き方をしています)   Dim AAA As String Dim BBB As Range Set BBB = Worksheets("Sheet1").Range("C:G").CurrentRegion.Find(What:=AAA, LookAt:=xlWhole) If BBB Is Nothing Then MsgBox "検索に失敗" Else MsgBox "検索に成功" End If このコードで、C~D列にAAAがある場合は見つかるのですが、 E~G列にAAAがある場合は見つからず「検索に失敗」とメッセージが出ます。 また、 別のシートでも全く同じコードを使っているのですが、こちらは正常に動作します。 上に挙げたコードと違うところは検索範囲がE~I列だというだけです。 上記コードでとあるシートにおいてのみE~G列にある値が検索に引っかからない理由として、 どのようなことが考えられるでしょうか。 保護はかかっていません。 値が微妙に違うということもありません。 大文字小文字、半角全角の指定はしておりませんが、 C列で検索に引っかかった値をそのままG列に移動しただけで見つからなくなります。 なお、AAAに入れているデータは、 Private Sub Worksheet_Change(ByVal Target As Range) End Sub のTarget.Addressで、「$A$20」のような形で入っています。 Sheet1のC~G列に用意している値も「$A$20」のような形で直接書き込んでいます。

専門家に質問してみよう