• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCEL VBA 条件にあったものをコピー)

EXCEL VBAで条件にあったものをコピー

このQ&Aのポイント
  • VBA初心者の方に向けて、Excelでシートの内容をコピーする方法をご紹介します。特定の条件にあったデータを別のシートにコピーする方法について説明します。
  • ExcelのVBAを使って、特定の条件に該当するデータを別のシートにコピーする方法を解説します。シート1とシート2にあるテーブルの中から、特定の条件に該当するデータのみをコピーします。
  • ExcelのVBAを使って、特定の条件に該当するデータを別のシートにコピーする方法をご紹介します。シート1のテーブルから、条件にあったデータをシート2にコピーすることができます。

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

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

20行目が印とか記入してあるタイトル行だとして。 sub macro1()  worksheets("Sheet1").unprotect  worksheets("Sheet2").unprotect  worksheets("Sheet2").range("A20:D80").clearcontents  worksheets("Sheet1").range("A20:D80").autofilter field:=1, criteria1:="="  worksheets("Sheet1").range("A20:D80").copy worksheets("Sheet2").range("A20")  worksheets("Sheet1").autofiltermode = false  worksheets("Sheet1").protect  worksheets("Sheet2").protect end sub ぐらいで十分かと。

g7gg10
質問者

お礼

こんにちは。 回答ありがとうございます。 自分の思ってた風にできました。 ありがとうございました。

その他の回答 (4)

回答No.5

テーブルの開始位置を可変にする機能を追加 Option Explicit Sub SelectRows() Const xFrom = "Sheet1" Const xTo = "Sheet2" Const xKey_Col = "A" Const xMark = 1 Const xHeads = 1 Const xHead_Row = 20 Dim xSheet As Worksheet Dim xHit As Boolean Dim kk As Long Dim nn As Long Dim mm As Long Dim xLast As Long Dim xLast_To As Long Application.ScreenUpdating = False Set xSheet = Sheets(xFrom) xLast = xSheet.Cells(Rows.Count, xSheet.Cells(1, xKey_Col).Column + 1).End(xlUp).Row Sheets(xTo).Activate ActiveSheet.UsedRange.Clear xLast_To = xHead_Row If (xHeads <> 0) Then Application.CutCopyMode = False Worksheets(xFrom).Rows(xLast_To & ":" & xLast_To + xHeads - 1).Copy Rows(xLast_To & ":" & xLast_To + xHeads - 1).PasteSpecial Paste:=xlPasteAll xLast_To = xLast_To + xHeads End If xLast_To = xLast_To - 1 For nn = xHead_Row + xHeads To xLast If (xSheet.Cells(nn, xKey_Col).Value <> xMark) Then xHit = False For mm = nn To xLast If (xSheet.Cells(mm, xKey_Col).Value = xMark) Then Exit For xHit = True Next mm If (xHit) Then Application.CutCopyMode = False xSheet.Rows(nn & ":" & mm - 1).Copy kk = xLast_To + (mm - nn) Rows(xLast_To + 1 & ":" & kk).PasteSpecial Paste:=xlPasteValues ', Operation:=xlNone, SkipBlanks:=False, Transpose:=False xLast_To = xLast_To + (mm - nn) nn = mm 'If (nn > xLast) Then Exit For Else End If End If Next nn Epilogue: Application.CutCopyMode = True Application.ScreenUpdating = True End Sub

g7gg10
質問者

お礼

こんにちは。 回答ありがとうございます。 開始位置を可変するコードを追記していただきありがとうございます。 こんなコードがスラスラ書けたらいいのですが・・・。 自分では分からないところもありますので、勉強します。 ありがとうございました。

回答No.3

Constのとこを環境に合わせて変更 Option Explicit Sub SelectRows() Const xFrom = "Sheet1" Const xTo = "Sheet2" Const xKey_Col = "A" Const xMark = 1 Const xHeads = 1 Dim xSheet As Worksheet Dim xHit As Boolean Dim kk As Long Dim nn As Long Dim mm As Long Dim xLast As Long Dim xLast_To As Long Application.ScreenUpdating = False Set xSheet = Sheets(xFrom) xLast = xSheet.Cells(Rows.Count, xSheet.Cells(1, xKey_Col).Column + 1).End(xlUp).Row Sheets(xTo).Activate ActiveSheet.UsedRange.Clear xLast_To = 0 If (xHeads <> 0) Then Application.CutCopyMode = False Worksheets(xFrom).Rows("1:" & xHeads).Copy Rows(1 & ":" & xHeads).PasteSpecial Paste:=xlPasteAll xLast_To = xHeads End If For nn = 1 + xHeads To xLast If (xSheet.Cells(nn, xKey_Col).Value <> xMark) Then xHit = False For mm = nn To xLast If (xSheet.Cells(mm, xKey_Col).Value = xMark) Then Exit For xHit = True Next mm If (xHit) Then Application.CutCopyMode = False xSheet.Rows(nn & ":" & mm - 1).Copy kk = (xLast_To + 1) + (mm - nn) - 1 Rows(xLast_To + 1 & ":" & kk).PasteSpecial Paste:=xlPasteValues ', Operation:=xlNone, SkipBlanks:=False, Transpose:=False xLast_To = xLast_To + mm - nn nn = mm 'If (nn > xLast) Then Exit For Else End If End If Next nn Epilogue: Application.CutCopyMode = True Application.ScreenUpdating = True End Sub

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

コピー元シートに保護が掛かっている場合、Copyメソッド等は使えないと思うので普通に代入するぐらいでしょうか。 一例です。 因みにB列が空白の場合には終了させています。 Sub sample() Dim st1 As Worksheet, st2 As Worksheet, i As Long, j As Long Set st1 = Sheets("10月"): Set st2 = Sheets("11月") st2.Cells.ClearContents For i = 20 To 80 If st1.Cells(i, "B") = "" Then Exit Sub If st1.Cells(i, "A") <> 1 Then j = j + 1 St2.Cells(j, "A").Resize(, 4) = st1.Cells(i, "A").Resize(, 4).Value End If Next End Sub

g7gg10
質問者

お礼

こんにちは。 回答ありがとうございました。

  • NYAN99
  • ベストアンサー率35% (32/90)
回答No.1

考え方としては、行コピーすればいいのでは? シート1の表20行目から80行目をFor文で回して1行ずつ読み込む。 そしてその中で印のセルが1なら読み飛ばして次の行へ。 '1行をコピーして貼り付け(この場合は2行めを3行目に) Range("2:2").Copy Range("3:3").PasteSpecial Rangeの前にActiveSheet名を指定してあげれば。。

g7gg10
質問者

お礼

こんにちは。 回答ありがとうございました。

関連するQ&A

専門家に質問してみよう