EXCEL VBAで条件にあったものをコピー
- VBA初心者の方に向けて、Excelでシートの内容をコピーする方法をご紹介します。特定の条件にあったデータを別のシートにコピーする方法について説明します。
- ExcelのVBAを使って、特定の条件に該当するデータを別のシートにコピーする方法を解説します。シート1とシート2にあるテーブルの中から、特定の条件に該当するデータのみをコピーします。
- ExcelのVBAを使って、特定の条件に該当するデータを別のシートにコピーする方法をご紹介します。シート1のテーブルから、条件にあったデータをシート2にコピーすることができます。
- ベストアンサー
EXCEL VBA 条件にあったものをコピー
こんにちは。 VBA初心者です(いつまでたっても) シート1とシート2は同じ表 シート1(10月)に下記のような表があるとして(範囲は決まっていて表の20行目から80行目) シート1 印 日付 商品 備考 11/3 漬物 長期保存可 1 11/4 菓子 日持ちしない 11/5 果物 日持ちしない シート2(11月)に、 印で1がついたものをものを除いてコピーしたいのです。 シート2 印 日付 商品 備考 11/3 漬物 長期保存可 11/5 果物 日持ちしない シートの保護の関係でVBAでこれをやりたいのです。 よろしくお願いします。
- g7gg10
- お礼率75% (21/28)
- オフィス系ソフト
- 回答数5
- ありがとう数4
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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 ぐらいで十分かと。
その他の回答 (4)
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
テーブルの開始位置を可変にする機能を追加 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
お礼
こんにちは。 回答ありがとうございます。 開始位置を可変するコードを追記していただきありがとうございます。 こんなコードがスラスラ書けたらいいのですが・・・。 自分では分からないところもありますので、勉強します。 ありがとうございました。
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
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)
コピー元シートに保護が掛かっている場合、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
お礼
こんにちは。 回答ありがとうございました。
- NYAN99
- ベストアンサー率35% (32/90)
考え方としては、行コピーすればいいのでは? シート1の表20行目から80行目をFor文で回して1行ずつ読み込む。 そしてその中で印のセルが1なら読み飛ばして次の行へ。 '1行をコピーして貼り付け(この場合は2行めを3行目に) Range("2:2").Copy Range("3:3").PasteSpecial Rangeの前にActiveSheet名を指定してあげれば。。
お礼
こんにちは。 回答ありがとうございました。
関連するQ&A
- ExcelのVBAについて
ExcelのVBAについて VBA全くの初心者です。 以下のような処理を行いたいのですが、どなたかご教授をお願いします。 以下のように支店(1)~(3)のシートがあります。 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、 一致しない行を不一致データシートに出力する もう一つ別のマクロで、 1.入力シートに調べたい商品No・商品名・備考を入力する(複数行あり) 2.マクロを実行すると、商品Noを検索対象として支店(1)~(3)シートをチェックし、、 一致する行を一致データシートに出力し、D列に対象データがあるシート名を表示する ※可能でしたら、E列に対象データがある行番号も表示する -------------------------------- シート名:支店(1) A B C 商品No 商品名 備考 011 商品A 備考A 009 商品B 備考B 015 商品C 備考C -------------------------------- シート名:支店(2) A B C 商品No 商品名 備考 008 商品A 備考A 023 商品B 備考B 004 商品C 備考C -------------------------------- シート名:支店(3) A B C 商品No 商品名 備考 007 商品A 備考A 033 商品B 備考B 018 商品C 備考C -------------------------------- シート名:入力シート A B C 商品No 商品名 備考 ※ここに複数行入力する -------------------------------- シート名:不一致データシート A B C 商品No 商品名 備考 ※ここに出力される -------------------------------- シート名:一致データシート A B C 商品No 商品名 備考 ※ここに出力される
- 締切済み
- Visual Basic
- Excel VBA
Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。
- 締切済み
- Visual Basic
- エクセルVBA:表の内容を担当者別に振り分けたい
よろしくお願いいたします。 VBA初心者です。よろしくご指導をお願いいたします。 安易に教えてgooで質問することにお叱りをいただくこともあり、 VBAの本も数冊買って勉強をはじめ、格闘していますが、手に負えません。どうか助けてください。 A B C D E F g 担当者 日付 商品 規格 数量 単価 備考 1山田太郎 ○ △ ■ ◎ ◇ ▼ 2鈴木次郎 ■ ○ ▼ ■ ○ ○ 3佐藤三郎 △ ■ ○ ◎ ◎ ■ 4山田太郎 ▼ ■ ◎ ■ ○ ▼ 5山田太郎 ◇ ○ ◎ ◇ ◆ ◎ 6鈴木次郎 ◆ ◎ ◇ ◎ ◇ ◇ というような入力シートの表があり、レコードは1000以上、下にたくさん続きます。 ○や▼には実際には数値や商品名、短文などが入ります。 担当者は、50名、そこで「山田太郎」をはじめ、担当者氏名の名前の50のワークシートを作成しています。 そこで、次のようなVBAを書きたいのです。 VBAを実行すると、 シート別に入力表のデータが振り分けられて、 「山田太郎」に A B C D E F g 1 日付 商品 規格 数量 単価 備考 2 ○ △ ■ ◎ ◇ ▼ 3 ▼ ■ ◎ ■ ○ ▼ 4 ◇ ○ ◎ ◇ ◆ ◎ と入力シートに入力されたデータが50名のシートに振り分けられるものです。 どうか、よろしくご指導お願いいたします。
- ベストアンサー
- オフィス系ソフト
- エクセルVBAのコピーについて
初心者です。 表を別のシートにコピーしたいのですが、列と行の幅がコピーされません。どうすれば列と行のコピーができるのでしょうか。 pastespecial で引数を指定するのでしょうが、formats ではないでしょう? copy destination:= で別のシートにコピーをしても罫線の行と列の幅が元の幅と異なってしまいます。教えて! エクセルで形式を選択してコピーで、すべてをコピー、でも同じ現象が起きます。列をコピーしてから、すべてをコピーするとうまく行くのですが、VBAではどう書けばいいのでしょうか。
- ベストアンサー
- Visual Basic
- エクセルでVBAを使うのかと思うのですが・・・
エクセルである商品の一覧があります。 それぞれの数量合計を求めたいのですが ひとつの商品が複数行にわたって入力されており その合計を出したいのです。 ABCDEF 1 (1) 5 2 (1) 2 3 (1) 4 4 (2) 3 5 (2) 1 6 (2) 8 7 (3) 9 8 (4) 7 9 (4) 7 上記の表で(1)が合計何個、(2)が合計何個といった感じです。Eは個数です。 (1)は5+2+4=11なので別シートの商品名のみの一覧の(1)の横へ11と入力したいのです。 商品数が数百あり、行も数千あるため自動計算したいと思っています。 ちなみに今は行3の下に行の挿入を行い、セル1E~3Eまでを合計し、別のシートの商品一覧にC&P(値のみ)しています。 これではいつまでかかるか気が遠くなってきます。 VBAの出来る方よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- EXCEL VBA条件による行の上下段へのコピー
EXCEL VBA 条件による上や下段への行コピー お世話になります。 質問させていただきます。 添付図ようなの表1があります。 この表は各商品につき6行あって[品名]と[区分]だけは6行すべてデータが入っていますが、その他の[納品日]や[担当者]フィールドには6行全てには入っていません。(ピボットテーブルで集計した表のため) このほうが表としては見易くて良いのですが、オートフィルターをかけると空白行が抽出されずに不便で困っています。 そこで表1を表2のように全ての行にデータを入れればオートフィルターでもうまく抽出できるので、このようにしたいのです。(表2の緑色セル部分) 以下表1の条件です (1)品名、区分は必ず入っている (2)品番は各商品データの2行目(1行目ではなく)に必ず入っている (3)納品日~問屋名までは同一データが続く場合、先頭データの2行目(1行目ではなく)にしか入っていない (4)商品データは1商品につき6行表示されていて、可変ですが1000行ほどあります やりたい事・・・ [データ挿入]というボタンを作成して、ボタンを押したら表1が表2の緑色セルを埋めるような動作をさせたいです お忙しいところ恐縮ですがどなたかお知恵をお借りできますでしょうか? 何卒よろしくお願い致します。 環境 Windows XP SP3 Excel2003
- ベストアンサー
- その他MS Office製品
- excelでボタン一つでシートからシートへのコピーの方法。
例) シート1に日付と商品名と単価と個数、それに特別の項目があります。 下図のような表。 =============== 日付 商品 単価 個数 4/1 A 100 1 特別 4/1 D 0 3 ←1行空いてます。 4/2 B 120 2 4/2 C 130 1 ←1行空いてます。 4/3 A 120 1 4/3 C 130 3 特別 4/3 D 0 5 ←1行空いてます。 4/4 定休日 : : 4/30 =============== このような表があるとします。 これをボタン一つでシート2にコピーしたいのです。 (簡単に言えばシート1がデータ。シート2が印刷用です。) <条件> シート2のセルの大きさは変えられませんが、それ以外はOK シート2にコピーする際に日付指定が出来ること。(1日から5日までのデータを印刷するなど。) 長々とした文になりましたが、よろしくお願いします。 また、わからないことがあれば補足いたします。
- 締切済み
- オフィス系ソフト
- エクセルのVBA初心者です。教えてください。
エクセルVBAの勉強を始めたばかりのものです。無知を自覚しながら質問させていただきます。 宜しくお願い致します。 下のようにエクセルの表があります。 B列の中から例えば5月13日が今日だとして本日の日付のものを探し、見つけたらその隣の列の A列の通番を参照しピックアップしたら、別のシートに作ってある番号ばかりのシート表の中のその通番のセルを塗りつぶすという一連の作業のVBAを作りたいのですがどうしたらいいのでしょうか? 問題の説明不足で意味が通じるかが心配なのですが、本日の日付をB列から見つけてその通番 をピックアップするVBAを教えて頂けたらとおもい、質問しました。 ちなみに日付は5/13の形式で入力しています。 A B 1 5月13日 2 3 4 5 5月13日 6 6
- ベストアンサー
- Visual Basic
- VBAで条件が一致するものの合計
条件が一致するものを合計し、別のシートに値を代入したいです。 日付 商品 個数 金額 1/1 りんご 1個 500円 1/3 みかん 1個 300円 1/3 みかん 2個 600円 1/5 みかん 5個 1500円 1/1 ぶどう 2個 800円 1/2 りんご 2個 1000円 このような表でりんごの合計1500円、みかんの合計2400円 を別のシートの1月の列へ代入したいのですが VBAでできる方法を教えてください。 この表は毎月上書きされるようになっています。
- 締切済み
- オフィス系ソフト
- エクセル 関数を自動的に入力するVBAで困っています
VBA初心者です。 エクセルの入力シートで行ごとにデータを下記のように入力しています。 A B C 1 日付 品番 商品 2 10/25 10 りんご 3 10/26 20 みかん 4 5 6 2行目から順にデータを入力すると自動的にC列にVBAで VLOOKUP関数をセットして商品を検索したいのですが 上手くできませんでした。 教えてください。よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
お礼
こんにちは。 回答ありがとうございます。 自分の思ってた風にできました。 ありがとうございました。