選択したシートを1つに集約する方法

このQ&Aのポイント
  • マクロを使って、複数のシートを1つのシートに集約する方法を教えてください。
  • 質問者はマクロの初心者で、名簿の管理に使っている複数のシートのうち2つを1つのシートに集約したいと考えています。
  • (1)電子申請と(2)TEL申込の2つのシートを(3)の申込者名簿シートに集約したいそうですが、現在のマクロでは電子申請のみが集約されていて、TEL申込の集約ができていません。修正方法を教えてください。
回答を見る
  • ベストアンサー

選択したシートを1つに集約するやり方を教えて下さい

マクロを勉強し始めたばかりの初心者です。 仕事で名簿を管理していますが、複数あるシートのうち2つを1つのシートへ集約したいと考えています。((1)~(8)のシートのうち、(1)電子申請と(2)TEL申込を(3)の申込者名簿シートへ集約したい。) ※(1)~(3)のシート情報は共通の項目となっています。 ※A1が項目、A2から情報が入力されてます。 ※情報は毎日更新・増減されます。 下記のマクロを作成しましたが、(1)電子申請のみ集約され(2)のシートは集約されませんでした。早急に完成し使用したい為、助けを借りたくこちらへ質問させて頂きました。 本当に初心者です。どこを修正したら完成するか教えて頂けたら嬉しいです。 足りない情報がありましたらご質問ください。 Private Sub CommandButton2_Click() Dim sWS As Workssheet '"TEL申込","電子申請"  Dim dWS As Worksheet '申込者名簿  Set dWS = Worksheets ("申込者名簿") '申込者名簿の2行目以降を削除 dWS.UsedRange.Offset(1,0).Clear '"TEL申込","電子申請"の2行目以降のデータを、申込者名簿の末尾にコピー For Each sWS In Worksheets If sWS.Name = "電子申請” Or dWS.name = "TEL申込"Then With sWS.UsedRange '申込者名簿にデータが1件以上ある場合      If .Rows.Count > 1 Then .Offset(1,0)/Resize(.Rows.Count - 1).Copy _ Destination:=dWS.Cells(Rows.Count, 1)._ End(xlUp).Offset(1,0) End If End With End If Next sWS End Sub

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

  • ベストアンサー
  • kon555
  • ベストアンサー率52% (1752/3362)
回答No.1

>>If sWS.Name = "電子申請” Or dWS.name = "TEL申込"Then の部分ではないかと。 「For Each sWS In 」ですので、 Or dWS.name = "TEL申込"Then ではなく Or sWS.name = "TEL申込"Then としないと、"TEL申込"シートが対象になりません。

a12649
質問者

お礼

ありがとうございました。 無事、作成する事が出来ました。

関連するQ&A

  • エクセル VBA:複数のシートを1つに集約

    以前どこからか以下のようなVBAを見つけ使用していました。 今になり実情に合ったものに改良したいと思い始めたのですが、コピーをとる時のプロパティ UsedRangeが理解できません。 実はデータは少し不完全な場合があり、A列が他の列に比べ不足しております。 解説書などではUsedRangeを使えば、データの一番外枠、つまり全てのデータを含むようにコピーされると理解したのですが、違うのでしょうか。 データはこんな感じです。 A、B XXX、BBB XXX、BBB 、BBB よろしくお願いします。 Sub Sample() Dim sWS As Worksheet 'データシート(コピー元) Dim dWS As Worksheet '集約用シート(コピー先) Set dWS = Worksheets("AllData") '集約用シートの2行目以降を削除 dWS.UsedRange.Offset(1, 0).Clear '各シートの2行目以降のデータを、集約用シートの末尾にコピー For Each sWS In Worksheets If sWS.Name <> dWS.Name Then With sWS.UsedRange 'コピー元シートにデータが1件以上ある場合 If .Rows.Count > 1 Then .Offset(1, 0).Resize(.Rows.Count - 1).Copy _ Destination:=dWS.Cells(Rows.Count, 1). _ End(xlUp).Offset(1, 0) End If End With End If Next sWS End Sub

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • 全く作動しないです。(転記しないです。)

    Private Sub CommandButton1_Click() If CheckBox1 = xlOn Then Worksheets("sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1) .Value = "新規" ElseIf CheckBox1 = xlOff Then Worksheets("sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1) .Value = "リピート" End If End Sub 上記のようなコードですが、まったく作動しないです。 どこが間違っているのでしょうか。

  • エクセル 複数シートを一つのシートにまとめるマクロについて

    エクセル 複数シートを一つのシートにまとめるマクロについて こんにちは いつもお世話になっています あるサイトから上記の目的のマクロを参考にして試したんですが、所有してるデスクトップPCでは成功するのに、ノートPCでは次のエラーが出ます。 「コンパイルエラー 変数が定義されていません」そして、以下に載せたコードの「k = 1」の部分が青い背景色になります。とりあえず、デスクトップでできるので間に合うのですが、ノートPCでのトラブル理由を今後のために勉強したいのです。理由を教えてください。 エクセル2003 SP3 ノートPCは工人舎のモバイルSA1F0 参考にさせていただいたサイトは「エクセル 複数シートを一つに集約」 http://okwave.jp/qa/q1608016.html?order=DESC&by=datetime コード引用 集約用にSheet3を確保します・ Sheet3以外の全シートを集約します。 Sub test07() Dim sh3 As Worksheet Dim sh As Worksheet Set sh3 = Worksheets("Sheet3") k = 1 For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "Sheet3" Then MsgBox sh.Name sh.UsedRange.Copy sh3.Cells(k, "A").Select sh3.Paste k = k + sh.UsedRange.Rows.Count End If Next End Sub 引用終わり よろしくお願いします

  • 特定の文字を含むシートを選択するには

    いつもお世話になっております。 特定の文字を含むシートのデータをコピーするにはどのようにしたらよろしいでしょうか。 具体的には (1)シート名の末尾に"D"を含むシートを選択 (2)選択したシートのデータをコピー (3)コピーしたデータを順次"Sheet1"に貼付 というマクロを組みたいのですが、(1)のところがうまくいきません。 以下のように作成してみました。 Dim sh As Worksheet Dim lr As Long, tlr As Long For Each sh In Worksheets If sh.Name = "*D" Then lr = sh.Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row sh.Rows("3:" & lr).Copy tlr = Sheets("Sheet1").Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row Sheets("Sheet1").Range("A" & tlr + 1).PasteSpecial End If Next 4行目の sh.Name = "*D" のところがうまくないようです。 よろしくお願いします。

  • VBA フォルダ内のファイルを昇順に読み出す方法

    以下のような簡単なプログラムを組みました。 ファイル名を昇順に読み出せると思っていましたが、そうならない場合があるようです。 なぜなのでしょうか? また、どうすればファイルを昇順に読み出せるのでしょうか? どなたか教えて頂けないでしょうか? (抜粋) Set WS1 = Worksheets("データー(org)") '書き出すシート Set WS3 = Worksheets("集計") Dim a As String With Application.FileDialog(msoFileDialogFolderPicker) .Show PathName = .SelectedItems(1) & "\" 'ファイルの入っているフォルダを指定 End With BookName = Dir(PathName) '処理するファイル Do Until BookName = "" Workbooks.Open PathName & BookName 'ファイルを開く Set WS2 = Worksheets(1) '読み込むシート WS2.Rows("1:" & WS2.UsedRange.Rows.Count).Copy If WS1.UsedRange.Rows.Count = 1 Then WS1.Rows(WS1.UsedRange.Rows.Count).PasteSpecial Paste:=xlValues Else WS1.Rows(WS1.UsedRange.Rows.Count + 1).PasteSpecial Paste:=xlValues End If Workbooks(BookName).Close 'ファイルを閉じる BookName = Dir() 'ファイル名をクリア Loop

  • 複数のファイルのsheet1だけをまとめるには

    sub UsedRangeをOffsetする() Dim rng先 As Range Dim PathMacrobook As String Dim Name元book As String Dim 元Book As Workbook Dim 元Sheet As Worksheet Set rng先 = Workbooks("BOOKALL.xls").Worksheets(1).Range("A2") PathMacrobook = ThisWorkbook.Path & "\" Name元book = Dir(PathMacrobook & "*.xls") Do While Not Name元book = "" If Name元book = ThisWorkbook.Name Then ElseIf Name元book = "BOOKALL.xls" Then Else Set 元Book = Workbooks.Open(PathMacrobook & Name元book) For Each 元Sheet In 元Book.Worksheets With 元Sheet.UsedRange .Offset(1).Copy rng先 Set rng先 = rng先.Offset(.Rows.Count - 1, 0) End With Next 元Book.Close False End If Name元book = Dir() Loop End Sub このコードではフォルダにあるブックのすべてのシートをBOOKALLのシート1に 上書きコピーしてしまう事がわかりました。 やりたい事 オープンするブックのsheet1だけを、.end(xlup)を使って一覧にしたいです。。 どの様にしたらよいでしょうか?

  • 決まったシートだけコピーして一つのシートにまとめる

    お世話になります。 http://okwave.jp/qa/q8216220.html で質問させていただいたVBAをこねくり回してみたのですが、「インデックスが有効範囲にありません」というエラーがでて進まなくなってしまいました。 Sub 特定のシートだけコピーと貼り付け() Dim k As Long, endRow As Long, wS As Worksheet Dim P As Variant P = Array("全", , "A", "B", "C", "D", "E", "F", "G", "H", "I") '↑コピーしたいシート名一覧 Set wS = Worksheets("まとめ") endRow = wS.cells(Rows.Count, "B").End(xlUp).Row If endRow > 4 Then Range(wS.cells(5, "B"), wS.cells(endRow, "M")).ClearContents End If For k = LBound(P) To UBound(P) ☆If Worksheets(k).Name <> "まとめ" Then 'ワークシート名が"まとめ"のとき endRow = Worksheets(P).cells(Rows.Count, "B").End(xlUp).Row 'P=Arrayで指定しているシートのセルで If endRow > 4 Then '4行目より下を Range(Worksheets(P).cells(5, "B"), Worksheets(P).cells(endRow, "M")).Copy _ wS.cells(Rows.Count, "B").End(xlUp).Offset(1) 'B5からM列の任意のデータが入っているセルまでコピーして"まとめ"シートに貼り付け End If '繰り返す End If '繰り返す Next k '次のシートへ End Sub 自分で分かるようにコメントを付けています。 ☆のついているところで、「インデックスが有効範囲にありません」と出ます。 指定したシートに"まとめ"を追加してみてもやはり同じでした。 調べたところ、「インデックスが~」というのはVBA中の範囲にないものを指定しているからだ、ということなのですが・・・。 お知恵を貸して下さい。よろしくお願いします。

  • EXCEL VBA 早く処理をする

    よろしくお願いします 下の構文を標準モジュールに書き込み、callで実行しているのですが 処理に時間がかかります。 処理を早くする方法と構文の簡素化のご教示をお願いします。 Application.ScreenUpdating = False For i = 1 To 12 With Worksheets(i) .Select LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A8:G" & LastRow).Sort Key1:=Range("A8"), order1:=xlAscending .Range("G8:G" & LastRow - 1).Formula = "=G7+E8-F8" LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A" & LastRow).Select Dim EndRow As Long EndRow = .Range("A" & Rows.Count).End(xlUp).Row Cells(Rows.Count, 1).End(xlUp).Offset(1, 3) = .Name & "合計" Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) = Application.WorksheetFunction.Sum(Range("E7:E" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) = Application.WorksheetFunction.Sum(Range("F7:F" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(2, 3) = "前月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) = .Range("G7") Cells(Rows.Count, 1).End(xlUp).Offset(2, 5) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 4) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 3) = "次月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(4, 3) = "合計" Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) - Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(4, 4) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) Cells(Rows.Count, 1).End(xlUp).Offset(4, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(1, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(2, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(4, 6) = Cells(Rows.Count, 1).End(xlUp).Offset(0, 6) .Range("C7").End(xlDown).Select Selection.Offset(4, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 2).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 3).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 4).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(0, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 2).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 2).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 3).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 3).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 4).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 4).Borders(xlEdgeBottom).Weight = xlThin End With Next i Application.ScreenUpdating = True

  • ExcelVBAで画像の様に動作を変更したいです

    先日、こちらにて 教えていただいたマクロでのデータ突合方法を基にマクロを作成中なのですが、 画像の様に動作させるにはどう修正すればよいでしょうか (目標) 画像のSheet1 と Sheet2の商品コードを上から順に突合し、 Sheet3に合致したA品番をコピー Sheet4に合致したB品番をコピー Sheet5に合致しなかったA品番をコピー Sheet6に合致しなかったB品番をコピー ※なお、A品番B品番ともに同じ値の品番がいくつか存在することがある。 この場合は、ループ中既に合致したデータは対象から外す。 判別方法は品番の一つ横のセルに”〇”を表記。(フラグを立てる) 「A品番=B品番」のとき「Offset(0, 1)が”〇”」ならば合致しない  --------------------------------------------------- (手順) (1)Sheet1 あり Sheet2 ありの場合 →一致したSheet1とSheet2のOffset(0, 1)に”〇” →一致したSheet1の行全体の値をSheet3にコピー →一致したSheet2の行全体の値をSheet4にコピー (2)Sheet1 あり Sheet2 なしの場合 →該当するSheet1の行全体の値をSheet5にコピー (3)Sheet1 なし Sheet2 ありの場合 →該当するSheet2の行全体の値をSheet6にコピー --------------------------------------------------- (現在のコード) Sub Test() Dim c As Range, FRange As Range Dim Sh1 As Worksheet, Sh2 As Worksheet Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") For Each c In Sh1.Range(Sh1.Cells(3, "A"), Sh1.Cells(Rows.Count, "A").End(xlUp)) Set FRange = Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Rows.Count, "A").End(xlUp)). _ Find(c.Value, LookAt:=xlWhole, After:=Sh2.Cells(Rows.Count, "A").End(xlUp)) If Not FRange Is Nothing Then If c.Value = FRange.Value And FRange.Offset(1, 0).Value <> "◯" Then c.Offset(0, 1).Value = "◯" '↓(1).xlsmSheet2に Sheets("Sheet3").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value FRange.Offset(0, 1).Value = "◯" End If Else '↓(1).xlsmのSheet3に Sheets("Sheet5").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value End If Next For Each c In Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Rows.Count, "A").End(xlUp)) If c.Offset(0, 1).Value = "◯" Then '↓(2).xlsmのSheet2に Sheets("Sheet4").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value Else '↓(2).xlsmのSheet3に Sheets("Sheet6").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value End If Next End Sub ご指導頂ければ幸いです。

専門家に質問してみよう