VBAのProcedureで検索行を抽出する方法

このQ&Aのポイント
  • VBAのProcedureを使用して、検索シートの見出し行をコピーし、貼り付け先シートにコピペする方法を教えてください。
  • 1行目に行を挿入したり、Selection.Offset(1, 0).Select で1行下げたりしても、貼り付け先シートの1行目のデータが消えてしまいます。
  • もし可能であれば、貼り付け先シートの見出し行を抽出せずに、その次の行から検索した行を繰り返し貼り付ける方法を教えてください。
回答を見る
  • ベストアンサー

検索後、行を抽出するVBAのProcedureで、

いつも、参考にさせて頂いております。本当に有難く思っております。 下記のProcedureを使わせていただきたいのですが、検索シートのRange("A1:S1")に見出し行が、ありまして、貼り付け先シートにも見出し行をコピーして、その下の行から Do Loopでコピペしたいのですが、どうしても、記述の仕方がわかりません。MerlionXX様、及び、他にお解りになる方、どうか、お教えください。 1行目に行を挿入したり、Selection.Offset(1, 0).Select で1行さげて、そこへ見出し行をコピペしたりしましたが、貼り付け先シートの1行目のデータが、消えてしまうのです。そのデータの上に見出し行が、貼り付けられてしまうのです。    Selection.Insert Shift:=xlDown これもダメでした。 夜も眠れません。どなたか、下記のProcedure をどのように書き換えたら、貼り付け先シートに見出し行がコピペされ、その次の行から、 検索した行が、繰り返し貼り付けられるようになるのか、お教えください。 Sub test01() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range Dim myStr, ra, rr myStr = InputBox("検索する文字", " (´^∇^)σ 入力してください", "") If myStr = "" Then MsgBox "検索文字未指定", vbCritical, " Σ( ̄ロ ̄lll)" Exit Sub End If Set ws1 = Sheets("Sheet1") '検索 シート Set ws2 = Sheets("Sheet2") '貼付先シート With ws1.Columns("A") '部分一致で検索(A列) Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, myStr & "? ( ̄~ ̄;)う~ん  " Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With MsgBox rr & "件をSheet2に抽出しました。", vbInformation, " ( ̄ー ̄)v" Set ws1 = Nothing Set ws2 = Nothing End Sub 宜しくお願い申し上げます。m(-_-)m

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

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

当方、自宅のPCにExcelがありませんので、 質問内容とコードをみただけでの回答となります。 もし見当はずれでしたらスルーしていただければと思います。 質問内容は、コピー先にて、常にシートの1行目から貼り付けが行われてしまうのを、 2行目から貼り付けられるようにしたい、という趣旨かと認識いたしました。 記載いただいたコードですと、変数「rr」の値に初期値がありませんので、 常に先頭から貼り付けが行われる動作になるのかと思われました。 Do の行の前で、 rr = 1 の1行を加えることで、目的の動作になるのではないかとおもわれます。

Ossan-baby
質問者

お礼

二日も前にご回答頂いていたのに、お礼が遅れて本当にすみません。 数日間、回答が無かったものですから、半ば諦めておりました。 rr = 1 これで、解決いたしました。本当に有難うございます。これで、枕を高くして眠れます。 それにしましても、自宅のPCにExcelがないのに、即座に、初期値の設定だと見抜く実力には、敬服いたします。もっと、勉強して toras9000様のようになりたいと思います。 本当に有難うございました。

関連するQ&A

  • 検索後、行を抽出するマクロ 2

    はじめまして マクロ初心者です、自分で出来ませんのでやりたいことに合うマクロをネットで探してやっておりますが、どうにもなりませんどなたかご教授お願いします。 下記のマクロで結果はOKなのですが、インプットボックスでは無く特定のセル(”A1”)の値から検索したいのです、また、結果の出る("Sheet2") を1回全てクリアにしてから結果が出る様にしたいのですが、どなたかご教授お願いします。 >Sub test01() >Dim ws1 As Worksheet, ws2 As Worksheet >Dim rng As Range Dim myStr, ra, rr myStr = InputBox("検索する文字", " (´^∇^)σ 入力してください", "") If myStr = "" Then MsgBox "検索文字未指定", vbCritical, " Σ( ̄ロ ̄lll)" Exit Sub End If Set ws1 = Sheets("Sheet1") '検索 シート Set ws2 = Sheets("Sheet2") '貼付先シート With ws1.Columns("A") '部分一致で検索(A列) Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, myStr & "? ( ̄~ ̄;)う~ん  " Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With MsgBox rr & "件をSheet2に抽出しました。", vbInformation, " ( ̄ー ̄)v" Set ws1 = Nothing Set ws2 = Nothing End Sub

  • キーワード検索後、部分一致した行のみコピーする方法について

      通達番号  発効日     通達名称   発行部署   (1) 2009001 2009年08月01日 営業推進1   営業部 (2) 2009002 2009年08月02日 予算通知1   経理部 (3) 2009003 2009年08月02日 営業先支援   営業部 (4) 2009004 2009年08月03日 人事異動   人事部     フォームを作成し、キーワード検索をし、部分一致した行のみ 別シートへコピーする仕組みを構築したいと考えております。 現在、下記コードを作成中です。 1行中に同じ用語が複数存在する場合(例:「営業」を検索)、 別シートへは2行のみ((1)と(3))表示したいところ、4行表示 されてしまいます。((1)(1)と(3)(3))というようになります。 どのようにコード変更すればよろしいでしょうか? Option Explicit Private Sub 検索_Click() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range Dim myStr, ra, rr Dim number As Integer Dim cnt As Integer Dim cntstart As Integer Dim cntend As Integer Dim endrows As Integer myStr = TextBox1.Value rr = 2 number = 0 If myStr = "" Then MsgBox "検索する語句を入れてください。" Exit Sub End If Set ws1 = Worksheets(2) Set ws2 = Worksheets(3) With ws1.Range(Cells(3, 1), Cells(100, 10)) Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "データは見つかりませんでした" Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With rr = rr - 2 If rr = 0 Then Else cntstart = 3 cntend = rr + 2 For cnt = cntstart To cntend number = number + 1 Worksheets(3).Range("A" & cnt).Value = number Next cnt End If MsgBox rr & "件を抽出しました。" Set ws1 = Nothing Set ws2 = Nothing End Sub Private Sub 閉じる_Click() UserForm1.Hide End Sub

  • エクセル2010 マクロ複数行検索を単数行検索に

    Sheet2のA1からA4にデータを入力すると Sheet1のリスト (C・E・F・H列)を検索します。 その時、検索対象を含む行が複数(重複して)ある場合、 対象行、全てに色塗りされ L列が 出荷待ち となります。 そこで、下記のマクロで、 Sheet1に同じ内容の行が 幾つか存在した時、 出荷待ち を Sheet1のリストを参照する度に リストの上の方から順番に 入力されるようにするには、 どこをどう変えたら良いのでしょうか? 【例】 Sheet1の2行目と4行目が重複内容だったら 2行目に色塗りとL2に出荷待ち。 Sheet2に戻り、A1~A4に上記内容と同じデータを入力すると 今度は4行目に色塗りと出荷待ちの表示 また、出来ることなら 出荷待ち ではなく、L列を日付(検索実行日)にするには どうすれば宜しいでしょうか? よろしくお願いします。 Sub test() Dim WS1 As Worksheet Dim WS2 As Worksheet Dim strKey As String Dim c As Range Dim v As Variant Dim y As Long Dim bln As Boolean Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") strKey = Join(Application.Transpose(WS2.Range("A1").Resize(4).Value), "") With WS1.Range("A1").CurrentRegion v = .Resize(, 12).Value For y = 1 To UBound(v) If Join(Array(v(y, 3), v(y, 5), v(y, 6), v(y, 8)), "") = strKey Then v(y, 1) = "出荷待ち" If c Is Nothing Then Set c = .Cells(y, 1).Resize(, 12) Else Set c = Union(c, .Cells(y, 1).Resize(, 12)) End If Else If v(y, 12) = "出荷待ち" Then v(y, 1) = v(y, 12) Else v(y, 1) = Empty End If End If Next .Columns(12).Value = v End With If Not c Is Nothing Then c.Interior.ColorIndex = 34 bln = True End If If bln Then MsgBox "終了しました" Else MsgBox "リストに存在しません" End If End Sub

  • エクセル 最終行からの連続コピー

    エクセルで最終行から上に連続する10行(最終行含む)をコピーしたいです。 途中、空白行が含まれている場合でも、最終行を特定し、コピーできるようにするには、下記のコードにどう手を加えたらよいでしょうか? どなたかアドバイスをお願いします。 Sub Test()   Dim i As Long   Dim j As Integer   Dim rng As Range   With ActiveSheet     'フィルタ     .Range("A1").CurrentRegion.AutoFilter Field:=1          '行選択     With .AutoFilter.Range       For i = .Cells(.Cells.Count).Row To 2 Step -1         If .Rows(i).Hidden = False Then           If rng Is Nothing Then             Set rng = .Rows(i)           Else             Set rng = Union(rng, .Rows(i))           End If           j = j + 1         End If         If j >= 10 Then Exit For       Next i       'コピー       If Not rng Is Nothing Then         rng.Copy Worksheets("Sheet2").Range("A1")         Beep       Else         MsgBox "該当行は存在しません。", 48       End If     End With   End With   Set rng = Nothing なお、コードはこちらを参考にさせていただきました。 http://okwave.jp/qa3552420.html?ans_count_asc=1

  • 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

  • エクセル 最終行からの連続コピー

    * すぐに回答を! エクセルC20からI51までデータを1日1行ずつ入力します。 データが入力されている最終行から上に連続する10行(最終行含む)をコピーしたいのですが、最終行から10行上をどのように認識させたらいいのか、わかりません。Offsetなど試してみましたがダメでした。 よろしくお願いします。 Sub dataコピー() Dim i As Long Dim j As Integer Dim rng As Range '最後尾から10行前までを選択 With Worksheets("月").Range(Cells(20, 3), Cells(51, 10)) For i = Cells(Rows.Count, 1).End(xlUp).Row To -10? If rng Is Nothing Then Set rng = .Rows(i) End If j = j + 1 If j >= 10 Then Exit For Next i 'コピー If Not rng Is Nothing Then rng.Copy Range("M1") Beep Else MsgBox "該当行は存在しません。", 48 End If End With Set rng = Nothing End Sub コードはこちらを参考にしました ​http://questionbox.jp.msn.com/qa5440189.html

  • VBAで検索してコピー

    エクセル2003を使っています。 下記のような構文で、あるデータを検索しています。 検索まではできましたが、その検索したデータが入力されている行を選択して別のシートにコピーしたいです。 Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet Dim rng As Range Set ws1 = Sheets("CSV") '検索先のシート Set ws2 = Sheets("0群加工") '検索データのシート Set ws3 = Sheets("完了") '貼付先シート Set ws4 = Sheets("過程") With ws1.Columns("A") '完全一致でシートの頭から検索(A列) i = 2 Do Until ws2.Cells(i, "E").Value = "" 'ws2のデータがなくなるまで Set rng = .Find(What:=ws2.Cells(i, "E").Value, LookAt:=xlPart, After:=.Cells(.Cells.Count)) '検索 上記は0群加工シートに入力されているデータを、CSVシートに入力されているデータを検索しています。 (ここのデータというのは時間が入力されています。つまり、0群シートに入力されている時間と同じ時間を、CSVシートで検索しています) CSVシートに同じデータがあれば、そのデータがあるセルが属する行をコピーして、違うシートに貼り付けたいです。 よろしくお願いします。

  • エクセル 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 宜しくお願い致します。

  • マクロでキーワードを抽出して別のシートに挿入する

    質問番号:4733370の質問と回答を勝手に引用させて頂きます。 セルA列にキーワードCCCが含まれていた場合に その行を削除してSheet2に貼り付けする・・・という下のマクロを 貼り付けの部分を挿入に変更したいのですが、なにぶんマクロ初心者 の為よくわからないので教えていただけないでしょうか・・ 宜しくお願い致します。 Sub キーワード切取貼付02() Dim r As Range, ur As Range, rr As Long Dim rd(), v Set r = Range("A1", Range("A65536").End(xlUp)).Find(What:="CCC", LookAt:=xlPart, After:=Range("A65536").End(xlUp)) If r Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, "? ( ̄~ ̄;)う~ん  " Exit Sub '終了 Else 'あったら Do Until r Is Nothing '対象がなくなるまで ReDim Preserve rd(rr) '動的配列を用意 rd(rr) = r.Address(0, 0) '対象セルアドレスを配列に格納 rr = rr + 1 'カウント r.EntireRow.Cut Destination:=Sheets("Sheet2").Cells(rr, 1) '行の切り取り貼り付け Set r = Range("A1", Range("A65536").End(xlUp)).FindNext(r) '連続検索 Loop '繰り返し For Each v In rd() '各配列要素を If ur Is Nothing Then Set ur = Range(v) Else Set ur = Union(Range(v), ur) 'ユニオンに End If Next v ur.EntireRow.Delete 'ユニオンセルの属す行を一括削除 Set ur = Nothing Set r = Nothing End If MsgBox rr & "件をSheet2に移動しました。", vbInformation, " ( ̄ー ̄)v" 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を追加したり変更したり・・・)できません。 編集や変更もできて、検索マクロも実行できるというマクロの組み方はありますでしょうか?

専門家に質問してみよう