実現したいこと
VBAで複数のテーブル情報を取得してExcelの一枚のシート上に好きな位置に配置したい
発生している問題・分からないこと

一つ目のデータを貼り付けは出来たと思うが、二つ目以降のデータを配置したいが、一つ目のデータの列数が変動すると思うので、その点をカバーできるように二つ目以降のデータを配置をどのようにすればよいか分からない、また三つ目以降は二つ目のデータの右になど様々な位置に配置できる、次に貼り付ける際には元々入っていたデータを削除してフォーマットは残せるように対応させたい
該当のソースコード
VBA
1Sub MergeExcelFiles() 2 Dim FolderPath As String 'フォルダパス 3 Dim Filename As String 'ファイル名 4 Dim wbSource As Workbook '参照テーブルファイル 5 Dim wsDest As Worksheet '貼り付け先シート 6 Dim LastRow As Long '最終行 7 Dim PasteRow As Long '貼り付け行 8 Dim wsSource As Worksheet '参照テーブル格納データ 9 10 ' まとめ用シートを設定 11 Set wsDest = ThisWorkbook.Sheets("まとめ") 12 wsDest.Cells.Clear ' 古いデータを削除 13 PasteRow = 1 14 15 ' データが入っているフォルダパスを指定(最後に \ を忘れない) 16 FolderPath = "C:\Users\accou\OneDrive\デスクトップ\STAFF_○○\VBA作成テーブル例\" ' ←ここを変更 17 Filename = Dir(FolderPath & "*.xlsx") ' フォルダ内のxlsxを取得 18 19 ' フォルダ内の全ファイルをループ 20 Do While Filename <> "" 21 Set wbSource = Workbooks.Open(FolderPath & Filename) 22 Set wsSource = wbSource.Sheets(1) ' 最初のシートをコピー対象に 23 24 ' コピーする行数を取得(1列目の最終行) 25 LastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row 26 27 ' ヘッダー行を1回だけコピー 28 ' If PasteRow = 1 Then 29 ' wsSource.Rows(1).Copy wsDest.Rows(PasteRow) 30 ' PasteRow = PasteRow + 1 31 ' End If 32 33 ' データ部分をコピー(2行目以降) 34 If LastRow > 1 Then 35 wsSource.Rows("2:" & LastRow).Copy wsDest.Rows(PasteRow) 36 PasteRow = wsDest.Cells(wsDest.Rows.Count, 1).End(xlUp).Row + 1 37 End If 38 39 wbSource.Close False 40 Filename = Dir ' 次のファイルへ 41 Loop 42 43 MsgBox "データの統合が完了しました!" 44End Sub
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
FileMakerからExcel用に出力し、フォルダ内に格納された複数のファイルのデータをVBAで自動化し配置できることが分かった。また、そのソースコードが分かった。
補足
チャットgptに質問してソースコードを作成しました
> VBAで複数のデータを好きな位置に配置する方法
> 複数のテーブル情報を取得してExcelの一枚のシート上に好きな位置に配置
ここでの「好きな位置」というのが、具体的にどのような状況下における、どのような条件に当てはまる「位置」を意味しているのかが不明瞭です。
> フォルダ内に格納された複数のファイル
それぞれのブックの 1 番目の(あるいは特定の名前が付けられた)ワークシートから任意のセル範囲/テーブルをコピーし、そのマクロ有効ブックのワークシート[まとめ]上に貼り付けて統合することを主な目的とされていると仮定して、
> 一つ目のデータの列数が変動すると思う
コピー元のテーブルの構造(列の数、各列の名前および列位置)は全てのブックにおいて統一されているのか、それともブックによってテーブルの構造が異なる場合があるのか、どちらなのでしょうか。
また、添付された画像が「コピー元のワークシート」と「貼り付け先のワークシート」のどちらを示しているのかが不明です。
したがって、「コピー元のブック/セル範囲と貼り付け先セルを変えながら単純なコピーアンドペーストを繰り返す」だけの処理でよいのか、それとも貼り付けに際して何らかのフロー制御やデータ変換が伴うのかが分かりませんので、現時点では回答のしようがありません。
まずはその辺りの詳しいご説明を追記されることをお奨めします。
「発生している問題・分からないこと」の図を見ると、罫線だけが引かれていて項目名の無い列がいくつもあります。これは「FileMakerからExcel用に出力し、フォルダ内に格納された複数のファイル」がそういう構造になっているということでしょうか?
もしかするとですが、FileMakerのリレーションシップグラフのようなものを、Excelシートで再現したいのでしょうか?各ExcelにはFileMakerのテーブルの中身が出力されていて、それを、単一Excelシート上に、自動的に配置させたいのかなと思いました。各テーブルは行数も列数もそれぞれ異なるので、Excelシート上の動的に配置可能な領域を探すロジックが必要になると思いますが、それを質問されてるのかなと。見当違いであればすみません。
質問の意図が伝わりづらい提示情報で申し訳ありません。やりたい事としてはUmeeeh様の仰っている「各テーブルは行数も列数もそれぞれ異なるので、Excelシート上の動的に配置可能な領域を探すロジックが必要になると思います」の実装です。End(xlUp)でデータ側は行数の取得が出来ているのですが、配置先の表はバラバラでアルバイトの表にデータを入れたい場合に、データの行数が分からないので配置位置を可変で対応させたいです。
図の項目が無い箇所は抜けていただけです。ファイルの構造ではないです。
- あるフォルダに A.xlsx, B.xlsx, C.xlsx というブックが保存されている。
- A.xlsx には、ある日付における各社員の勤怠実績を記録した表(以下「表A」)が
作成されたワークシートがある。
この表のデータ行(列見出し行を除く範囲)の行数は、作成時点における社員人数に応じて
その都度変動する。
- B.xlsx には、A.xlsx と同じ日付における各アルバイトの勤怠実績を記録した表
(以下「表B」)が 作成されたワークシートがある。
この表のデータ行の行数は、作成時点におけるアルバイト人数に応じて
その都度変動する。
- C.xlsx には、A.xlsx および B.xlsx と同じ日付における売上総額と
それに掛かる消費税額を集計した結果を記録した表(以下「表C」)が
作成されたワークシートがある。
この表のデータ行の行数は 1 件のみである。
- あるマクロ有効ブックに[まとめ]というワークシートがある。
このワークシートを貼り付け先として、上記 3 つの表をコピーしようとしている。
- この時、表A, 表B, 表C のそれぞれの表の貼り付け先範囲を、
添付した画像のような位置関係(表A:上、表B:左下、表C:右下)に
なるように動的に制御したい。
といったことを目的とされているとして、
1. 表A全体を(データ行の多寡に係わらず)そっくりそのまま
[まとめ]の特定のセル範囲(この例では A1 セルを始点とする)に貼り付ける。
2. 上記 1 の貼り付け先範囲より 3 行下のセルを始点として
表B全体をそっくりそのまま貼り付ける。
例えば、表Aの行数(列見出し行とデータ行の総数)が 10 行ならば、
表Bの貼り付け先範囲の始点は A13 セルとなる。
3. 上記 2 の貼り付け先範囲より 3 列右のセルを始点として
表C全体をそっくりそのまま貼り付ける。
例えば、表Aの行数が 10 行、表Bの列数が 5 列ならば、
表Cの貼り付け先範囲の始点は H13 セルとなる。
といったコードを書ければよい、ということでしょうか。
sk.exe様の仰る通りの事を目的としています。コードもそのような事が書きたいのですが、表Aや表Bの行数がまとめ表で想定している行数を超えた場合にも対応できる様なコードを書きたいと思っています。その場合に、「表Bの貼り付け先範囲の始点は A13 セルとなる。
」、「表Cの貼り付け先範囲の始点は H13 セルとなる。」と言った始点を変動させる方法が無いかと思案しているのですが、そういった場合は手動でまとめ表の行数を増やしたり、コードを修正したりするしかないのでしょうか?
> 次に貼り付ける際には元々入っていたデータを削除してフォーマットは残せるように対応させたい
> 表Aや表Bの行数がまとめ表で想定している行数を超えた場合にも対応できる様なコードを書きたい
逆に「想定している行数に満たなかった場合」はどのようになさりたいのでしょうか。
例えば、表Aの貼り付け先として想定されている範囲の行数(の上限?)が 10 行だったとして、
実際の表A全体の行数が 2 行(列見出し行+ 1 件のデータ行)しかなかった場合、
表Bの貼り付け先範囲の始点はワークシート[まとめ]のどのセルになるのでしょうか。
(私が例示した形をそのまま採る場合なら A5 セルということになりますが)
いずれにせよ、実際のコピー元範囲が想定された貼り付け先範囲から「溢れた」場合も含めて
それらの書式(表示形式や罫線など)を制御したいのであれば、フォーマットを「残す」のではなく
「一から設定し直す」ぐらいでなければ上手くはいかないと思います。
sk.exe様回答ありがとうございます。
想定している行数に満たなかった場合についてですが、
sk.exe様の提示条件とした場合
<表Aの貼り付け先として想定されている範囲の行数(の上限?)が 10 行だったとして、
実際の表A全体の行数が 2 件(列見出し行+ 1 件のデータ行)しかなかった場合>
その場合には1件のデータが入って残りの9行は空白のまま存在している想定で考えていました。
貼り付け先のシートには項目と集計の為の行を用意しているのでそれを崩さないで張り付ける方法を模索していたのですが、
「それらの書式(表示形式や罫線など)を制御したいのであれば、フォーマットを「残す」のではなく
「一から設定し直す」ぐらいでなければ上手くはいかないと思います。」との助言の通り、フォーマットを残すのは難しい為他の手法を試そうかと思います。皆様ご助言ありがとうございました。
> その場合には1件のデータが入って残りの9行は空白のまま存在している想定で考えていました。
恐らく、印刷する上での体裁を整える目的で「空白行にも罫線を引きたい」
といったことなのだろうと思われますが、
> 貼り付け先のシートには項目と集計の為の行を用意しているのでそれを崩さないで張り付ける
それは例えば「ある年の 1 月から 12 月までの月ごとの水道料金の内訳」のように、
データ件数が必ず一定の数値内( 1 ~ 12 )に収まることが保証されている場合のみ
有効な手法であると言えます。
今回の例に置き換えるなら「その職場の規模として社員やアルバイトの総数は
最大で何人程度になる可能性があるか」を検討し、その想定し得る人数よりも
更にゆとりを持たせた行数の貼り付け先範囲を設けておく必要があります。
つまり「めったなことでは『溢れ』が生じないようなレイアウト」にしてしまう形です。
それでもデータ件数に上限がない限り「溢れる」可能性をゼロにすることは出来ないわけですが、
そうなった場合は個別に対応する、という運用の仕方もあるでしょう。
いずれにせよ、(具体的にどのような数式が設定されているかにもよりますが)
もし実際のデータ行が数式上において参照されている範囲を「溢れた」場合、
それぞれの数式が参照するべき範囲を変更したり、新たな数式セルを追加したり
しなければならなくなるはずです。
そういった「ワークシートの修正作業」が発生する可能性をできるだけ排除し、
全てをマクロのみで完結させたいのであれば、Umeeeh さんがおっしゃったように
「動的に配置可能な領域を探す」と共に「数式セルの設定」や「セル書式の設定」
といった処理を一括して実行する形を採られるのが無難でしょう。
(マクロのメンテナンスコストは上がるかも知れませんが)
真にやりたいことって何なのでしょうか?FileMakerをお使いなんですよね?FileMakerで完結できないんでしょうか?
回答1件
あなたの回答
tips
プレビュー



