VBAで文字の列を他のシートにコピーできるか

このQ&Aのポイント
  • VBAで特定の条件に基づいて、文字の列を別のシートにコピーする方法について教えてください。
  • 具体的には、表の中で「食べ物」の行を別のシートに集め、「乗り物」の行を別のシートに集めたいと思っています。
  • 現在試しているコードがうまく動作しないため、正しい方法を教えていただけると幸いです。
回答を見る
  • ベストアンサー

VBAで、ある文字の列を他のシートにコピーしたい時

名称   /数量 /種類 りんご /1 /食べ物  自動車 /2 /乗り物 a /3 /アルファベット バナナ /4 /食べ物 消防車 /6 /乗り物 b /5 /アルファベット 上記の様な表で種類の列を基準に、「食べ物」のある行だけ集めて別のシートにコピーして、「乗り物」のある行だけ集めて別のシートにするということはできますか? 下記のように考えてみましたが上手くいきませんでした。 質問内容が上手く説明ができないため 分かりづらいかもしれませんが、 もし、お分かりになりましたら教えてください。 ------------------------------ Sub test2() Dim i As Long For i = 2 To 7 Select Case Cells(i, 3).Value Case "食べ物" Rows(i).Select Selection.Copy Sheets("食べ物").Select Rows(i).Select ActiveSheet.Paste Case "乗り物" Rows(i).Select Selection.Copy Sheets("乗り物").Select Rows(i).Select ActiveSheet.Paste Case Else Rows(i).Select Selection.Copy Sheets("その他").Select Rows(i).Select ActiveSheet.Paste End Select Next End Sub

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

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.2

こんなのではどうでしょうか? 一番の問題は、最初は元データのシートがselectされているけれど、その後別のシートが選ばれるので、2回目からそれが選択されていない事だと思います。 また、「別のシートにコピー」で「Rows(i).Select」とすると、集計がとびとびになってしまうと思います。 Sub test2() Dim i As Long For i = 2 To 7 Sheets("Sheet1").Select '元データのあるシートを選ぶ Select Case Cells(i, 3).Value Case "食べ物" Rows(i).Select Selection.Copy Sheets("食べ物").Select Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).EntireRow.Select If Cells(1, 3).Value = "" Then Rows(1).Select '1行目から書く場合 ActiveSheet.Paste Case "乗り物" Rows(i).Select Selection.Copy Sheets("乗り物").Select Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).EntireRow.Select If Cells(1, 3).Value = "" Then Rows(1).Select '1行目から書く場合 ActiveSheet.Paste Case Else Rows(i).Select Selection.Copy Sheets("その他").Select Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).EntireRow.Select If Cells(1, 3).Value = "" Then Rows(1).Select '1行目から書く場合 ActiveSheet.Paste End Select Next End Sub ちなみに、シートの選択以外は同じ作業をしているので、こんな風にできると思います。 Sub test3() Dim i As Long For i = 2 To 7 Sheets("Sheet1").Select '元データのあるシートを選ぶ Rows(i).Select Selection.Copy Select Case Cells(i, 3).Value Case "食べ物", "乗り物" Sheets(Cells(i, 3).Value).Select Case Else Sheets("その他").Select End Select Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).EntireRow.Select If Cells(1, 3).Value = "" Then Rows(1).Select '1行目から書く場合 ActiveSheet.Paste Next End Sub

pen_pen_pin
質問者

お礼

足りない点をご指摘ありがとうございました。 とても分かりやすく書いてくださって助かります。 また省略したコードも勉強になります。 本当にありがとうございました。

その他の回答 (2)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

Cells(i, 3).Value とか Rows(i).Select は、上位オブジェクトが省略されています。 省略した場合、Activesheetが上位オブジェクトになります。 1回目に Sheets("食べ物").Selectしているので Activesheet = Sheets("食べ物") ということになります。 コピー元シートをSelectすれば問題は解決します。 For i = 2 To 7 Sheets("コピー元のシート名").Select '★追加してください 最初は、どうしてもSelectしますが、多くの場合、Selectしなくても大丈夫です。 そのためには、上位オブジェクトを省略せず明記してやる必要があります。 試しに作ってみました。 With 文で元のシート名を .Cells(i, 3).Value とか .Rows(i).Copy に修飾しています。 あと、貼り付け先のシート名も変数化しています。 Sub sample1()   Dim i As Long   Dim ws As String   With Sheets("元のシート名")     For i = 2 To 7       Select Case .Cells(i, 3).Value         Case "食べ物"           ws = "食べ物"         Case "乗り物"           ws = "乗り物"         Case Else           ws = "その他"       End Select       .Rows(i).Copy Sheets(ws).Rows(i)     Next   End With End Sub

pen_pen_pin
質問者

お礼

足りない点のご指摘ありがとうございます。 とても勉強になります。 本当にありがとうございました。

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

方法はいくつもあると思いますが、提示されたコードを使わせて頂きました。 Sub test2_Next() Dim i As Long Dim i1 As Long Dim i2 As Long Dim i3 As Long i1 = 1: i2 = 1: i3 = 1 '振分先各シートの先頭行数 For i = 2 To 7 Select Case Cells(i, 3).Value Case "食べ物" Rows(i).Copy Sheets("食べ物").Rows(i1) i1 = i1 + 1 Case "乗り物" Rows(i).Copy Sheets("乗り物").Rows(i2) i2 = i2 + 1 Case Else Rows(i).Copy Sheets("その他").Rows(i3) i3 = i3 + 1 End Select Next End Sub ご参考になれば幸いです。

pen_pen_pin
質問者

お礼

すばやい回答ありがとうございました。 貼り付けるときに一行目から貼り付けるということが 未熟ながら分からなかったので、教えていただいて助かります。 丁寧な言葉も初心者の私はありがたいです。 本当にありがとうございました。

関連するQ&A

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • エクセル「マクロの記録」を少し直したい

    マクロの記録で作った下記を Sub Macro1() Sheets("Sheet1").Select Rows("6:6").Select Selection.Copy Sheets("Sheet2").Select Rows("2:2").Select ActiveSheet.Paste End Sub 以下のように書き換えたら、2行目(Paste)がエラーになりました。 Sub ts1() Sheets("Sheet1").Rows("6:6").Copy Sheets("Sheet2").Rows("2:2").Paste End Sub セレクトしないで行ないたいのです。 どう直せばいいでしょうか?

  • エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです

    エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです 1つのエクセルファイルの中に複数のSheetがあります。 各Sheetの4行目以降(5行目から)にデータのあるA列~O列をコピーしていって、 挿入-ワークシート(Sheet1という名前で構わない)に全てを順番にコピーしていきたいです。 ”新しいマクロの記録”で下記のように作成したのですが、  ・5行目からデータのあるA列~O列をコピーしていく   ・存在する全てのSheetから上記の作業をする というマクロの書き方が分かりません。 恐れ入りますがお時間ある方で上記の内容をご理解頂ける方がいましたらアドバイス頂ければ非常に助かります。 Sub Macro1() Sheets.Add Sheets("ER10(zy)").Select Rows("5:8").Select Selection.Copy Sheets("Sheet1").Select ActiveSheet.Paste Sheets("ER10(cx)").Select Rows("5:9").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A5").Select ActiveSheet.Paste Sheets("ER10(zht)").Select Rows("5:13").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A10").Select ActiveSheet.Paste End Sub

  • エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです

    エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです 1つのエクセルファイルの中に複数のSheetがあります。 各Sheetの4行目以降(5行目から)にデータのあるA列~O列をコピーしていって、 挿入-ワークシート(Sheet1という名前で構わない)に全てを順番にコピーしていきたいです。 ”新しいマクロの記録”で下記のように作成したのですが、  ・5行目からデータのあるA列~O列をコピーしていく   ・存在する全てのSheetから上記の作業をする というマクロの書き方が分かりません。 恐れ入りますがお時間ある方で上記の内容をご理解頂ける方がいましたらアドバイス頂ければ非常に助かります。 Sub Macro1() Sheets.Add Sheets("ER10(zy)").Select Rows("5:8").Select Selection.Copy Sheets("Sheet1").Select ActiveSheet.Paste Sheets("ER10(cx)").Select Rows("5:9").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A5").Select ActiveSheet.Paste Sheets("ER10(zht)").Select Rows("5:13").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A10").Select ActiveSheet.Paste End Sub

  • エクセルで指定した行範囲を別のシートにコピーするには?

    (1)指定した行(数値)を変数として登録する方法 tx1 = Sheets("0").Range("A1") tx2 = Sheets("0").Range("A2") tx3 = Sheets("0").Range("A3") A1=2 A2=2000 A3=2500 (2)(1)で指定した変数を使用して行範囲を他のシートSheets(”1”)、Sheets("2”)にコピーペースト。 行(”2:1999”) ←tx1 : tx2-1(A2の数値から1を引いた数値) Rows(▲▲▲▲▲▲).Select Selection.Copy Sheets("1").Select Rows("1:1").Select ActiveSheet.Paste 行(”2000:2499”) ←tx2 : tx3-1(A3の数値から1を引いた数値) Range(▲▲▲▲▲▲).Select Selection.Copy Sheets("2").Select Rows("1:1").Select ActiveSheet.Paste ▲部分がエラーになってしまい、うまくいきません。 正しい方法を教えてください。

  • Excel 2010 で勤務割表を作成しています。

    月間の勤務割表を作成しています。 3列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。 列に日付、行を個人名(max16名)としますから、3列3行の枡が496個となります。 各枡とも1列目の1行目に勤務種別コード(1~5)を記述し、このコードNoにより4種の図形を貼付けています。 1つ1つの枡(496個)に以下のコードを書き実行しています。膨大な行数を要します。 使用するパソコンにおいては実行速度がかなりかかります。 これをもっと単純化する手法についてご教示いただければ幸いです。 Sub Macro1() Select Case Range("I6").Value '1人目-1日 Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Range("J7").Select ActiveSheet.Paste Case 2: ActiveSheet.Shapes("四角形2").Select Selection.Copy Range("I7").Select ActiveSheet.Paste Case 3: ActiveSheet.Shapes("四角形3").Select Selection.Copy Range("J7").Select ActiveSheet.Paste Case 4: ActiveSheet.Shapes("直線1").Select Selection.Copy Range("I6").Select ActiveSheet.Paste Case 9: ActiveSheet.Shapes("四角形3").Select Selection.Copy Range("J7").Select ActiveSheet.Paste End Select  '|   '| <同じことを一つ一つの枡ごとに繰り返し記述しています。>   '| Select Case Range("CU51").Value '16人目-31日 Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Range("CV52").Select ActiveSheet.Paste Case 2: ActiveSheet.Shapes("四角形2").Select Selection.Copy Range("CU52").Select ActiveSheet.Paste Case 3: ActiveSheet.Shapes("四角形3").Select Selection.Copy Range("CV52").Select ActiveSheet.Paste Case 4: ActiveSheet.Shapes("直線1").Select Selection.Copy Range("CU51").Select ActiveSheet.Paste Case 9: ActiveSheet.Shapes("四角形3").Select Selection.Copy Range("CV52").Select ActiveSheet.Paste End Select End Sub

  • エクセル VBA 繰り返し コピー貼り付け

    以下を繰り返し作業をOffsetを使用して行いたいのですがどうすればいいでしょうか? Sheets("Sheet1").Select Range("A1:C1").Select のA1:C1以下へA1000:C1000ぐらいあります。 Sheets("Sheet2").Select Range("G1").Select は貼り付けたセル3つの数字の組み合わせで公式に使う計算期間がまちまちですので公式を張り付けたり出来ません。 D1の解を heets("Sheet1").Select Range("D1").Select に貼り付けてA1:C1以下1000までの結果を評価出来るようにしたいのですが! ' Macro1 Macro Sheets("Sheet1").Select Range("A1:C1").Select Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D1").Select ActiveSheet.Paste Range("A2:C2").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D2").Select ActiveSheet.Paste Range("A3:C3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D3").Select ActiveSheet.Paste End Sub よろしくおねがいします。

  • 「シート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?と削除したり挿入したりで数が変わりますが何かしら文字列が隙間なく入っています。 よろしくお願いします。

  • やはり図形のクリアで実行時エラー1004

     図形を二行三列で一枡とし図形を貼り付けていますが、どうしても実行時エラー 「1004」が出て図形のクリアができません。(尚、四角形は枠線上にあります。) 対処法がありましたらお願いします。 Windows7・SP1 Office2010 Sub 図形の貼付け() Dim i As Integer Dim j As Integer For i = 10 To 43 Step 2 For j = 9 To 99 Step 3 Select Case Cells(i, j).Value Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste Case 2: ActiveSheet.Shapes("四角形2").Select Selection.Copy Cells(i + 1, j).Select ActiveSheet.Paste Case 4: ActiveSheet.Shapes("四角形3").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste Case 5: ActiveSheet.Shapes("四角形3").Select Selection.Copy Cells(i + 1, j + 2).Select ActiveSheet.Paste Case 6: ActiveSheet.Shapes("円1").Select Selection.Copy Cells(i, j).Select ActiveSheet.Paste End Select Next Next End Select End Sub Sub 図形のクリア() Dim myRng As Range Set myRng = Range("I10:CW43") Dim n As Integer, sp As Variant For n = ActiveSheet.Shapes.Count To 1 Step -1 Set sp = ActiveSheet.Shapes(n) If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing  (ここで実行時エラー1004になります。) Then sp.Delete End If Next Set myRng = Nothing End Sub

  • VBAの勤務割表の式を短く

     月間の勤務割表を作成しています。 1列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。 列に日付、行を個人名(max16名)とし1列3行を名前の定義で13種類作成してあります。 別シートの各セルの入力番号に応じて13種類を貼り付けていますが、式を簡単にできませんでしようか?  お教えくださいませんでしょうか?勉強不足は否めませんが。 尚名前の定義は、1行3列に1--で勤務1・""-""で日勤・""公休""で公等にしてあります。 OS Windows7 Office2010 Sub 図形の貼付け2() If Worksheets("メイン").Range("J9").Value Then Select Case Worksheets("メイン").Range("J9").Value 1人-1日 Case 1: ActiveSheet.Range("勤務1").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 2: ActiveSheet.Range("勤務2").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 3: ActiveSheet.Range("勤務3").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 4: ActiveSheet.Range("日勤1").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 5: ActiveSheet.Range("日勤2").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 6: ActiveSheet.Range("日勤3").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False End Select Else Select Case Worksheets("メイン").Range("I9").Value Case 2: ActiveSheet.Range("明け").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 4: ActiveSheet.Range("夜勤").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 5: ActiveSheet.Range("公").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 6: ActiveSheet.Range("有").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 7: ActiveSheet.Range("特").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 8: ActiveSheet.Range("振").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False Case 9: ActiveSheet.Range("欠").Select Selection.Copy Range("D10").Select ActiveSheet.Paste Application.CutCopyMode = False End Select End If End Sub

専門家に質問してみよう