[[20240408155929]] 『複数のブックから複数のシートのデータコピー』(家事手伝い) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『複数のブックから複数のシートのデータコピー』(家事手伝い)

【前提】
<ブック名>
マクロ用のブックを用意。
参照先ブックは固定名で「●●●」「×××」等、現在は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 >


各ブックとシート名の指定の仕方があいまいなのでは?
(無料) 2024/04/08(月) 16:45:14

各数十個のデータブック、マクロ用のブックは 同一フォルダー内です。
ブックは固定名で処理は同じなので 引数を渡してブックを指定して処理。
指定があいまいなのかなと確認したんですが・・・VBAが習いたてで困ってます。
現在の記載は 一部省略していますが以下のとおりとなります。

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


別インスタンスのエクセルを起動させているように見えるけど
それって必要なのかな?
最近のエクセルのことよく知らないけど
(無料) 2024/04/08(月) 17:24:53

    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


「■5」で提示したコードに、ブックを閉じる命令が無かったので修正しました。

(もこな2) 2024/04/10(水) 06:27:40


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.