• ベストアンサー

文字列を検索しその列をコピーする(VBA)

よろしくお願いします。 OS:WINDOWS 2000 PRO 環境:OFFICE 2003 エクセルのVBAについての質問です。 A列には数値コードが入っています。 そのコードは"1"と"2"に分類されてます。 マスターはSHEET1で、このマスターから コード1はSHEET2に、 コード2はSHEET3に 振り分けたいのですが、どうもうまくいきません・・・ A列にはコード"1" "2"以外に空白セルが存在します。 空白セルは無視したい。。。 それとこのデータはDBから抽出するのですが、 抽出したデータは規則性はありません。 抽出するごとに"1"と"2"と"空白"はランダムなので、 LOOP等のマクロを調べてやってみたのですが、出来なくて週末になってしまいました。 A列からコード1とコード2を検索して、 ヒットしたコードの行ごと各SHEETにコピーして、 なおかつ各シートA列の入力されていない一番下の セルにコピーしたいのですが、検索でヒットした 上から順番に。。。 これをLOOPと組合わせれば、各シートにコピーするのは 問題ないような気がします。。。 Sub AAA_BBB() .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0) End With End Sub LOOP等で上記の条件を満たせる方法はないでしょうか。 ご教示を、よろしくお願いします。

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

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

こんにちは。 For -Eachを使ってやってみました。 各シートの1行目はタイトル行になっているものとします。 Sub test() Dim rng As Range With Sheets("SHEET1") For Each rng In _ Range(.Cells(1, 1), .Cells(.Range("A65536").End(xlUp).Row, 1)) If rng.Text = "コード1" Then rng.EntireRow.Copy _ Sheets("SHEET2").Range("A65536").End(xlUp).Offset(1) ElseIf rng.Text = "コード2" Then rng.EntireRow.Copy _ Sheets("SHEET3").Range("A65536").End(xlUp).Offset(1) End If Next End With End Sub

daikun2004
質問者

お礼

初心者相手にご回答いただき感謝に耐えません。 もちろん、解決いたしました! ありがとうございます。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 タイトル行は、Sheet1, Sheet2, Sheet3 にあるという前提にしないと、このコードはうまく行きません。最初のマスターのシートは、オートフィルタを使って抽出しています。これで参考にしてみてください。なお、コードは、myCodeのところを増やし、myShtsの中も、同じ数だけシートも増やせば、さらに増えても、ループは可能です。 '----------------------------------------- Sub Sort_OtherSheetPaste()   Dim myShts() As Variant   Dim myCode() As Variant   Dim i As Integer     myCode = Array("1", "2") 'コード   myShts = Array("Sheet2", "Sheet3") 'ペーストされるシート   Application.ScreenUpdating = False   'マスターのシート   With Worksheets("Sheet1").Range("A1").CurrentRegion      For i = LBound(myCode()) To UBound(myCode())      .CurrentRegion.AutoFilter Field:=1, Criteria1:=myCode(i)      .Offset(1).Resize(.Rows.Count - 1).Copy Worksheets(myShts(i)).Range("A65536").End(xlUp).Offset(1)    Next i    .AutoFilter   End With     Application.ScreenUpdating = True End Sub なお、マクロの実行のダブりの検査は、現在のコードではなされていません。

daikun2004
質問者

お礼

解決できました。 ありがとうございます。

関連するQ&A

  • EXCEL VBAで文字列の検索とコピー

    検索したい文字をinputboxで入力して、A列を検索して、検索文字を含むセルをコピーして、そのコピーしたデータを、別のシートに貼り付ける、次に該当したセルをさっきコピーしたデータの次の行に貼り付けて・・・。とデータが入力してある最終行までの繰り返し、をやりたいのですが、ご指導の程、説明が下手ですが宜しくお願いします!

  • EXCEL VBA 文字列検索とコピー

    以前にも同じ質問をさせて頂いたのですが、どうも上手くいかないので今一度お願い致します! 名簿を作成していて、現在下記のようなシートになっています。 [ Sheet1 ] A   B   C   D   E   F   G   H 日付 ○  ○  ○  ○  名前 電話 メール このF列の名前を検索して、検索文字に該当する全てのセルの行ごと(出きればA1:H2の範囲)コピーして、Sheet2に貼り付けたいです。 現在のコードは、以下のようになってます。 宜しくお願いします!! Sub 検索1() Dim myFind As Variant Dim myfRow As Long, c As Range Dim CopySh As Worksheet Dim i As Long Dim num As Integer Set CopySh = Worksheets("Sheet2") 'コピー先のセルの最初の行 i = 1 '================================== myFind = Application.InputBox("検索文字をカナで入力してください", Type:=2) If VarType(myFind) = vbBoolean Or myFind = "" Then Exit Sub With Worksheets("Sheet1").Cells(4.4) Set c = .Find(myFind, , xlValues, xlWhole) If Not c Is Nothing Then myfRow = c.Row Do c.Copy CopySh.Cells(i, 1) 'コピー Set c = .FindNext(c) i = i + 1 Loop Until c Is Nothing Or myfRow = c.Row End If End With Beep '終了の合図

  • 6列を配列に取込し1列を検索値、2列を書出ししたい

    シート(抜取マスタ)のA列と シート(マスタ全部)のA列をぶつけてヒットしたら シート(マスタ全部)の該当行のE列を抜取マスタのF列に転記 するマクロを ヒットしたら シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 とか シート(マスタ全部)の該当行のD,F列を抜取マスタのF,G列に転記 シート(マスタ全部)の該当行のE,F列を抜取マスタのF,H列に転記 に改造したいです。 ●部分を修正しなければと思っていますが 思ったように動きません。教えてください。 よろしくお願いします。 Sub 検索貼付() 'シート(抜取マスタ)のA列と 'シート(マスタ全部)のA列をぶつけてヒットしたら 'シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 'データは2列目から開始 'ヒットしない場合は 無し と記入 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("マスタ全部") 'シート(マスタ全部)のデータを配列に取込 '(F2の部分とCount, 1の部分 →A~F列となる) With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) 'Vに代入する事となる、検索する列の指定.Columns(1)=A列 v = .Columns(1).Value 'Wに代入する事となる、書出す値のある列の指定 (5)=E列 ●w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("抜取マスタ") '検索値のある列指定(A2の部分とCount, 1の部分→A列~A列) With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else 'ヒットしない場合 v(i, 1) = "無" End If Next '書き出しする列を指定(Offset(, 5)=検索値のA列より右5つ→F列) ●With .Offset(, 5) .ClearContents .NumberFormat = "@" .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • マクロVLOOKUPの高速化

    シート1には13,000行、 シート区分マスターには25,000行において シート1の検索値からシート区分マスターを検索して ヒットしたらシート1に返したいです。 シート1のデータ行文行いたいです。 シート1の行数は常に変化、 シート区分マスターの行数は固定です。 以下の記述で検索を行いますが終了するのに 5分強かかります。 (下のほうに再計算0%→5%→70%→95%と表示されている) もっと早く処理させる方法はありますでしょうか? よろしくお願いします。 Sub 区分検索() '2010 年11月18日 'シート1のA列を検索値として 'シート区分マスターのA列を検索しヒットしたら 'シート区分マスターの該当行のE列をシート1のC列に転記 'データはそれぞれのシートともに2列目からである 'ヒットしない場合はシート1のC列は空白にする '検索値と転記するセルのシート選択 With Sheets("シート1") 'データ開始行のC2に式を入れる .Range("C2").Formula = _ "=IF(ISNA(VLOOKUP(A2,区分マスター!$A:$E,5,FALSE)),"""",VLOOKUP(A2,区分マスター!$A:$E,5,FALSE))" '数式入力 '式によって抽出されてC列に転記された値をコピーします。 .Range("C2").Copy .Range("C2:C" & .Range("A" & .Rows.Count).End(xlUp).Row) 'データ最終行までコピー .Columns("C:C").Copy 'コピーした値をC1から値貼付を行う .Range("C1").PasteSpecial Paste:=xlPasteValues 'C列を値に変換 Application.CutCopyMode = False End With End Sub

  • VBAでコピー&ペーストをループ化する方法

    お忙しいところ申し訳ありません、ご教授の程お願い致します。 ワークシート(1)とワークシート(2)の間で特定のセル列をコピー&ペーストしたくそれを列のデータが無くなるまで(空白まで)処理したいのですが、 単一セルの処理は Worksheets("ワークシート(1)").Range("BJ2") = Worksheets("ワークシート(2)").Range("E2") で値の貼り付けが実行され成功したのですがそれをループ化したい構文に当てはめると空白まで自動的に処理してくれるような動作をしません。 検索してしらべてみたのですが、 Sub test() Dim i As Integer i = 1 Do Until cells(i, 2) = "" cells(i, 2) = Worksheets("ワークシート(1)").cells(2, 62) = Worksheets("ワークシート(2)").cells(2, 5).End(xlDown) i = i + 1 Loop End Sub で、試してみましたが動作しなかったです。 お忙しいところ申し訳ありませんが、宜しく御願い申し上げます。

  • 【VBA】別シートを検索して該当があれば『●』表示

    VBA初心者(独学中…)です。 別シートからVLOOKUPの要領でデータの抜き出しをしたいです。 関数を試しましたが、データ量が多く、かなり時間が掛かってしまうため、 できればマクロで完了させたいと思っています。 ご教示のほど、何卒よろしくお願いいたします。 ------------------------  帳票の仕様 ------------------------ ■Excel2010 にて  ・Sheet1~9のJ列に『検索コード』があります。  ・Sheet10は【コードマスタ】シートです。  ・行はシートにより増減あり。  ・列はSheet1~9で共通、項目・並び等 変更なし。     Sheet10も項目・並びは変更しません。 ------------------------  やりたいこと ------------------------ Sheet10からSheet1~9へ、VLOOKUPのように該当データを抽出・転記したい。 ------------------------  具体的には… ------------------------ Sheet1~9の『検索コード(J列 ※データは[セル:J2]以下~)』を元に、  (1)Sheet10のA列を検索 ⇒ 該当があればSheet1~9のK列へ  (2)Sheet10のB列を検索 ⇒ 該当があればSheet1~9のL列へ 『●』が表示されるようにしたい。 ------------------------------------------------------------------------ 試しに(1)の動作テスト用に、以下を書いてみましたがうまく動作しませんでした。 (★の部分がエラーになります) 正しく動作させるには、どのようにしたらよろしいでしょうか。 (実際のコードを教えていただけますと、大変有難いです…) ================================================================ Sub コードマスタからK列値をVLookup() Dim tbl As Range Set tbl = Worksheets(10).Range("A:B") Dim key As Long key = Range("J2").Value        ★ On Error Resume Next Dim ret As String ret = WorksheetFunction.VLookup(key, tbl, 1, False) On Error GoTo 0 Range("K:K").Value = ret End Sub ================================================================

  • EXCEL VBA オートフィルで別シートへコピー

    EXCEL VBA オートフィルで別シートへコピー しようとしたら、うまくいきません 別々に書くとうまくいくのですが コードを一緒にするとうまくいきません? コード *********************************************** Sub 抽出別シート() Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1" '1時間以下の8列目のをフィルター end sub sub カレントで別シートへコピー() Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")   'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** このように書くとうまくいくのですが これを一緒に書くと別シートへコピーがうまくいきません。 全てコピーされてしまいます +++++++++++++++++++++++++++++++++++++++++++++++ 一緒にしたコードです +++++++++++++++++++++++++++++++++++++++++++++++ *********************************************** Sub 抽出別シート() '1h以下をを抽出別シートへコピー Worksheets("時間合計VB").Select ' 時間合計VBのシートを選択 Range("A1").AutoFilter field:=8, Criteria1:="<=1"    '1時間以下の8列目のをフィルター Range("A1").CurrentRegion.Copy Sheets("1hdown").Range("A1")    'それをカレントして別シートのA1へコピー Range("A1").AutoFilter End Sub *********************************************** 意味が分かりませんどなたかおしえていただけませんでしょうか? よろしくお願いいたします

  • その列の結合セルを次のセルにコピーしたい場合

    A列目に結合セルがあってその結合セルをB列からE列までコピーするコードを書きたいと思って次のコードを記述しましたが動きません。 どこが間違っているのでしょうか?      sub()    Do While Columns(1).MergeArea = True Columns(1).Copy Columns(2) Columns(1).Copy Columns(3) Columns(1).Copy Columns(4) Columns(1).Copy Columns(5) Loop End sub

  • 【VBA】Ifで他シートから検索しコピーする

    Excel vbaについて教えてください。 自分で作成したコードが、うまく動かず悩んでいます。 ●作りたいもの Sheet3のA列にある数字を検索値とし、 Sheet1のA列を検索し、合致する行のB列~最終列までコピーし、 Sheet3のB列から貼付する。 ※Sheet1にある列数(項目数)は不定です ●作成したマクロ Sub test() Dim sh1 As WorkSheet Dim sh2 As WorkSheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") d = sh2.Range("A1").End(xlDown).Row 'Sheet3検索値のA列のデータの最終行 g = sh1.Range("B1").End(xlToRight).Column 'Sheet1の最終列 k = 2 For i = 2 To d    'Sheet3最終行まで If sh1.Cells( i & "A") = sh2.Cells( 1,"A") Then '条件)Sheet1とSheet3のA列が合致 For j = 2 To g                      'Sheet1の最終列まで sh2.Cells( k , j ) = sh1.Cells( i , j ) 'Sheet1のB行から最終列をコピーしSheet3へ貼付 Next j End If Next End Sub いろいろ直していたのですが、Set sh2 = Worksheets("Sheet3")で「インデックスが有効範囲にありません」(同じブック内に同名シートがあるのに?)とエラーが出たり、 また、B行から最終列までコピーする際の範囲指定についてもよくわからず、 もっと他に良い方法が無いものかとお手上げ状態です。 どうぞ宜しくお願いいたします。

  • エクセル2007VBAで連続データ(文字列)の入力

    ●質問の主旨 エクセル2007のVBAでマクロを作成して 同じ列に次々と文字を入力していくにはどうすればよいでしょうか? ●質問の補足 ワークシートのA列に文字列を入力していくマクロを 作成しようとしています。コードの概要は以下の通りです。 1.1回目の入力でA1セルには文字列を入力 2.1のあとフォーカスがテキストボックスに戻る。 3.2回目の入力でテキストボックスに文字列を入力 4.2回目の文字列がA2セル入力 5.以下2~5が続く ところが4のところでA1セルの内容を消去して 2回目の文字列をそのままA1セルに入力してしまいます。 コードに問題があると考えられますが、 どこに問題があるでしょうか? 以下のコードと添付画像をご参照の上、 ご教示くだされば幸いです。 なお添付画像の内容は、作成目標である A列に次々と文字列が入力されていく「模範解答」です。 ●コード (General)-連続データ入力 Sub 連続データ入力() UserForm1.Show vbModal End Sub (General)-(Declaration) Dim CelNo As String Dim Pos As Integer (UserForm1:UserForm_Initialize) Private Sub UserForm_Initialize() Pos = 1 CelNo = "A" & Pos End Sub (UserForm1:InputBtn_Click) Private Sub InputBtn_Click() With Worksheets("sheet1") .Range(CelNo) = UserForm1.TextBox1.Text Pos = 1 CelNo = "A" & Pos .Range(CelNo).Activate End With UserForm1.TextBox1.Text = "" UserForm1.TextBox1.SetFocus End Sub (UserForm1:CommandButton2_Click) Private Sub CommandButton2_Click() Unload UserForm1 End End Sub

専門家に質問してみよう