『複数のブックから複数のシートのデータコピー』(家事手伝い)
【前提】
<ブック名>
マクロ用のブックを用意。
参照先ブックは固定名で「●●●」「×××」等、現在は16ファイル
<シート名>
各ブックのシート名はまちまちで、各々シートの数も違うが、
シート名に”集計データ”という文字が含んでいるシートのみを参照する。
各ブックのシート数は30シート程度
【したいこと】
(1)マクロ用ブックから、まず1つ目のブックから”集計データ”という
シートを参照する
(2)そのシートのB列5番目からB列最後のデータ行を取得し、A列〜E列のデータを一時シートにコピーする。A5〜EXXX(B列データ最後の行)
(3)マクロ用ブックにある、”一時”という名前のシートにA1からコピー、
そこで集計して、マクロ用の”集計”シートにコピーする
(集計側のプログラムは完成している)
(4)集計が終ったら次のシートに進み、(1)〜(3)を繰り返す。最後のブックまで
いくと次の固定名のブックに移行し、(1)〜(4)を実行する。16個のブックが終ると処理は終了
例:ブック「●●●」はシートが13個あるが、”集計データ”がシート名に含んだシートが4つ。この場合は4回((1)〜(3)を4回)集計を実施し、次のブック「XXX」に移行する。
【困っていること】
Forでシート名をなめて”集計データ”の時だけの処理の分岐はできている。
、End(xldown)などを使い最終行の取得はうまくいってるが、
マクロ用ブック”一時”シートにコピー時にエラーがでる。
また、次のブック(固定名)に移行する場合、べた書きの為同じコードを
かいてしまう。この場合引数を渡すソースになるが、そこでもエラーになる。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
Call Shori 1 'XXXブックの場合
Call Shori 2 'YYYブック
'処理
Sub Shori(ByVal BookNo as Intger)
Dim ReadPath as String
Dim EndRow as Double
Dim wb as workbook
Dim ExcelApp as New Application
Dim Cnt as Long 'カウント
Dim i as Long
If num Mod 2 = 0 Then
if bookNo =1 then
ReadPath=Thisworkbook.path & "\XXX.xlsx")
ExcelApp.Visible = false ExcelApp.DisplayAlerts =false Set wb =ExcelApp.Workbooks.Open(ReadPath, True) cnt=wb.worksheets.Count 'シートの数カウント
for i to cnt
if wb.Worksheets(i).Name Like "*集計データ" then
’B列5番目からデータを参照し最終行を取得
EndRow=wb.Worksheets(i).Cells(5,2).End(xlDown).Row
’ーーーーーーーーーーーーーうまくいってないもの_その1ーーーーーーーーー
ここに最終行を取得したので、XXXブックの”集計データ”が含まれたシートにある
最終行を取得したのでA5〜E最終行 の範囲を、マクロ用ブックの”一時”にコピー
’ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
’ーーーーマクロ用ブックにおいて、集計ーーーーー
ここで、マクロ用ブックの”一時”シート内でデータのカウントをする
その結果をマクロ用ブックの別のシートに転記する
’−−−−−−−−−−−−−−−−−−−−−−−
else end if
next i
end sub
else bookNo=2
end if
(家事手伝い) 2024/04/08(月) 16:57:20
If num Mod 2 = 0 Then は転記ミスです。
正しくは
Call Shori 1 'XXXブックの場合
Call Shori 2 'YYYブック
'処理
Sub Shori(ByVal BookNo as Intger)
Dim ReadPath as String
Dim EndRow as Double
Dim wb as workbook
Dim ExcelApp as New Application
Dim Cnt as Long 'カウント
Dim i as Long
if bookNo =1 then
ReadPath=Thisworkbook.path & "\XXX.xlsx") ExcelApp.Visible = false ExcelApp.DisplayAlerts =false Set wb =ExcelApp.Workbooks.Open(ReadPath, True) cnt=wb.worksheets.Count 'シートの数カウント for i to cnt if wb.Worksheets(i).Name Like "*集計データ" then ’B列5番目からデータを参照し最終行を取得 EndRow=wb.Worksheets(i).Cells(5,2).End(xlDown).Row ’ーーーーーーーーーーーーーうまくいってないもの_その1ーーーーーーーーー ここに最終行を取得したので、XXXブックの”集計データ”が含まれたシートにある 最終行を取得したのでA5〜E最終行 の範囲を、マクロ用ブックの”一時”にコピー ’ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ’ーーーーマクロ用ブックにおいて、集計ーーーーー ここで、マクロ用ブックの”一時”シート内でデータのカウントをする その結果をマクロ用ブックの別のシートに転記する ’−−−−−−−−−−−−−−−−−−−−−−− else end if next i ExcelApp.DisplayAlerts = True '警告メッセージをオン ExcelApp.Quit 'Excel終了 Set ExcelApp = Nothing
else bookNo=2
end if
end sub
(家事手伝い) 2024/04/08(月) 18:01:52
>マクロ用ブック”一時”シートにコピー時にエラーがでる。
その処理をしている部分のコードを提示しなければ、何が問題か分からないですよ。
エラーは何と言うエラーですか?
(半平太) 2024/04/08(月) 22:43:58
■1
↓はどのプロシージャにかいてあるのですか?
Call Shori 1 'XXXブックの場合 Call Shori 2 'YYYブック
■2
既に指摘がありますが、↓の狙いはなんですか?
Dim ExcelApp as New Application
■3
↓は省略しているだけで、実際には【Else節】も記述があるのでしょうか?
else end if
■4
こちらも指摘がありますが、
’ーーーーーーーーーーーーーうまくいってないもの_その1ーーーーーーーーー ここに最終行を取得したので、XXXブックの”集計データ”が含まれたシートにある 最終行を取得したのでA5〜E最終行 の範囲を、マクロ用ブックの”一時”にコピー ’ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
’ーーーーマクロ用ブックにおいて、集計ーーーーー ここで、マクロ用ブックの”一時”シート内でデータのカウントをする その結果をマクロ用ブックの別のシートに転記する ’−−−−−−−−−−−−−−−−−−−−−−−
↑のそれぞれについて、【現状のコードを提示した上で】
・××の箇所で○○というエラー(エラー番号、エラーメッセージ)が出る ・エラーにはならないが、××になるはずが、○○になってしまう
など具体的に説明できませんか?
■余談
コードを手打ちされているようですが、可能であればエディタからコピペされた方がよいです。
タイプミスの指摘はお互い時間の無駄でしょう。
(もこな2 ) 2024/04/09(火) 09:18:09
■5
コンパイルエラーにならないことしかチェックしてませんが、ざっくり整理すると↓みたいになるのではないでしょうか?
Sub 整理() Dim ブック名 As String Dim SH As Worksheet
ブック名 = Dir(ThisWorkbook.Path & "\*.xlsx") Do Until ブック名 = "" If ブック名 <> ThisWorkbook.Name Then '自ブックはxlsmだろうけど一応 With Workbooks.Open(ThisWorkbook.Path & "\" & ブック名) For Each SH In .Worksheets If SH.Name Like "*集計データ" Then
'▼そのシートのB列5番目からB列最後のデータ行を取得し、A列〜E列のデータを一時シートにコピーする。 SH.Range("A5:E" & SH.Cells(5, 2).End(xlDown).Row).Copy ThisWorkbook.Worksheets("一次").Range("A1")
'ーーーーマクロ用ブックにおいて、集計ーーーーー 'ここで、マクロ用ブックの”一時”シート内でデータのカウントをする 'その結果をマクロ用ブックの別のシートに転記する '−−−−−−−−−−−−−−−−−−−−−−−
Exit For '「〜集計データ」というシートは1ブックに1つしかないと思うので見つかったら(処理したら)巡回は終了してOK End If Next SH .Close False End With End If
ブック名 = Dir(ThisWorkbook.Path & "\*.xlsx") Loop End Sub
※あくまで、説明用の提示であり完成品プレゼントの意図はありません。 ※「一時」なのか「一次」なのかも含めて、ご自身の環境に合わせてカスタマイズしてください。
■6
既に述べたように「マクロ用ブックにおいて、集計」の内容がわかりませんが、データのカウントくらいであれば、一旦別シートに貼り付けなくても処理できるのではないでしょうか?
どのような集計をするのか、コードのみならず行列を踏まえたレイアウトで サンプルデータを提示して説明いただくとアドバイスできることがあるかもしれません。
(もこな2 ) 2024/04/09(火) 10:33:50
(もこな2) 2024/04/10(水) 06:27:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.