質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

409閲覧

複数シートを1つのシートにまとめたい

PyPyPython

総合スコア92

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

0クリップ

投稿2025/04/10 00:44

実現したいこと

ブック内にある複数のシートを、新規シートにつなげたい。

前提

・ブック内に500程度のシートがあり、それぞれのデータ範囲はA1~F48
・シート名は001、002、、、500
・000という新規シートを作成し、000のA1~F48には001のシートのデータ、A49からは002のシートのデータ、、、といったように、シートを連結させたい。
マクロ・VBAで実現できることは確認済み

発生している問題・エラーメッセージ

昨年にも同様の連結作業をしたのですが、昨年はマクロ等は使わずExcel内の機能でやったような覚えがある(思い違いの可能性もあり)ので、Excel内の機能だけでスマートに実現できる方法があったら教えていただきたい。

該当のソースコード

ソースコード

Sub 統合シート作成()

Dim i As Long Dim 元シート As Worksheet Dim 統合シート As Worksheet Dim 貼付開始行 As Long Set 統合シート = ThisWorkbook.Sheets("000") 統合シート.Cells.ClearContents 'クリア For i = 1 To 365 Dim シート名 As String シート名 = Format(i, "000") Set 元シート = ThisWorkbook.Sheets(シート名) 貼付開始行 = (i - 1) * 48 + 1 元シート.Range("A1:F48").Copy Destination:=統合シート.Range("A" & 貼付開始行) Next i MsgBox "データ統合完了"

End Sub

試したこと

上記コード

補足情報(FW/ツールのバージョンなど)

特になし

tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2025/04/11 10:57

> 昨年にも同様の連結作業をしたのですが、昨年はマクロ等は使わずExcel内の機能でやったような覚えがある ・昨年の成果物は既に存在しないということでしょうか?(バックアップも無いのか?) ・既にマクロがあるのに「Excel内の機能でやったような覚えがある」方法を求めている理由は何でしょうか?
guest

回答1

0

ブック内に500程度のシートがあり、それぞれのデータ範囲はA1~F48

vba

1元シート.Range("A1:F48").Copy Destination:=統合シート.Range("A" & 貼付開始行)
  • コピーされる範囲の行数は(48行目が空白行だろうが何だろうが)常に48行で固定する必要がある。

  • セルの値だけではなく書式(表示形式/配置/フォント/罫線/塗りつぶし)も元のまま維持する必要がある。

という前提であるのであれば

マクロ等は使わずExcel内の機能で

Excel内の機能だけでスマートに実現できる方法

「自力でコピーアンドペーストを繰り返す」以外の方法はありません。

投稿2025/04/10 01:50

sk.exe

総合スコア1048

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PyPyPython

2025/04/10 01:56

手動でコピペを繰り返すのが「スマート」に実現できる方法だと思って回答しているのなら大変愉快な人ですね。
sk.exe

2025/04/10 02:20 編集

上記の前提においてマクロ以外に自動化、簡略化する手段が 実際に存在しないのでそう申し上げたに過ぎません。 - Range.Copy メソッドと同様に「全ての書式ごとコピーする」ようなワークシート関数は存在しない。 - Power Query なら「データの結合」は一応可能だが「書式のコピー」は不可能である。
Black_Velvet

2025/04/10 02:38

回答してもらっておいてその言い草は無いのでは? と、まぁ突っかかっておいて言うのもアレなんですけど、 スマートで近代的な方法がありますよ。 ChatGPTにそのデータを添付し、『このデータでシート「1」からシート「500」が存在するが、新たにシート「000」を作成して各シートの1行目から48行目までを下方向に結合してシート「000」に転記してください』と言ってみてください。
sk.exe

2025/04/10 03:17

> ChatGPTにそのデータを添付 確かにスマートで近代的ですが、「Excel内の機能だけで」という要件からは外れますね。 - 使用する Excel のバージョンが最新( Excel for Microsoft 365 など)である。 - '001'から'500'までのワークシートがシーケンシャルに並んでいる(3-D参照が可能である)。 - セルの書式まではコピーしなくてもよい。 という前提なら、VSTACK 関数一発で済む問題なのですが。
PyPyPython

2025/04/11 07:03

>Black_Velvetさん 質問に書いていない前提をコメント欄で確認することもなく、自力でコピー&ペーストする以外の方法はない、というのがまともな回答だとお考えですか?わたしにはスコア稼ぎの荒らし回答以外には受け取れません。 >sk.exeさん VSTACKといった別の回答をする知見もお持ちなのに、なぜ1発目の回答がアレなのでしょうか。
sk.exe

2025/04/11 10:32 編集

> なぜ1発目の回答がアレなのでしょうか。 提示されたマクロと全く同じ実行結果を再現する方法は 本当に「自力でコピーアンドペースト」しかないからです。 > VSTACKといった別の回答をする知見もお持ちなのに 前述の通り、VSTACK 関数は VBA の Range.Copy メソッドと全く同じ結果をもたらす機能ではありません。 また、VSTACK 関数を用いた場合はかえって次のような弊害が生じる恐れがあります。 - 表示形式が「日付」や「時刻」である(これらに相当するユーザー定義表示形式を含む)  セルの値がシリアル値(倍精度浮動小数点数)として返される。 - 空白セルの値が 0 として表示される。  (シートの設定により回避可能だが、逆に値が 0 であるセルが空白で表示されるようになる) 結合対象となる範囲のサイズ/数が比較的狭い/少ないのであれば 「とりあえず VSTACK で結合しておいて、もし都合の悪い結果が含まれていれば 個別に調整する」という考えも出来るでしょうけど、 > ブック内に500程度のシートがあり、それぞれのデータ範囲はA1~F48 この場合、結合後の範囲は 24000 行 × 6 列 = 144000 セルほどに及び、 それらのセルを 1 つ 1 つチェックし、必要に応じて値や書式を変更する作業を 行うにも、それなりに手間が掛かるでしょう。 また、使用される Excel のバージョンが VSTACK をサポートしていないのならば そもそも使えない方法です。 参照元のセル範囲が実際にどのようなレイアウトになっているのか、 それぞれのセルに対して具体的にどのような値が格納されているか、 それぞれのセルに対して具体的にどのような書式が設定されているか、 といったことが全く判らない状況において、確実に「全てを」 コピーする方法は、コピーアンドペーストを「自力で」繰り返すか 「マクロで」繰り返すかのどちらかしかありません。
otn

2025/04/11 13:46

> 質問に書いていない前提をコメント欄で確認することもなく、自力でコピー&ペーストする以外の方法はない、というのがまともな回答だとお考えですか? この質問に限らず、質問に、検討するための必要な情報がちゃんと書かれていることは希で、 「こういう条件のケースが多いだろう」ということを前提に書いて回答することはごく普通だと思います。 コメントでの質問を繰り返して、ちゃんと完成した質問文にしてもらうことを目指すのはやりとりで時間が掛かります。「条件をすべて具体的にに質問に追記してください」の1つのコメントで済めば良いのですが、普通はそれで済まない。 で、「こういう条件だと解は無い」というのも有意義な回答です。条件を変えることを考えてもらうきっかけになります。 回答者の条件の想像が違うのなら、質問者が正しい条件を書けば良いだけすね。 VSTACKの回答コメントも、前提付きで書かれています。どっちを先に書くのかは、どっちの前提の方がありそうだと思ったか次第かと思います。やりたいことが文章で具体的に書かれていない以上、「VBAコードと同じ機能を求めているのだろう」という判断をsk.exeさんがされたことは間違ってないと思います。 「『セル関数 複数シートを1シートに』で検索してトップページに出てくる VSTACK関数だとどの点が希望に合わないのでしょうか?」という質問コメントをするのもありだったとは思います。 条件を1つずつ沢山質問するより楽。
meg_

2025/04/11 16:51

> 質問に書いていない前提をコメント欄で確認することもなく 「質問へのコメント」をせっかく書いてもレスが付かないことがあるからじゃないでしょうか?ナレッジサービスとしては(余程おかしなものでなければ)回答残した方が有意義だと思います。 ところで以前利用されたのはPowerQueryではないでしょうか?提示された条件「それぞれのデータ範囲はA1~F48」以外にデータが存在する場合は「スマートに実現できる」から外れるかもしれませんが。
Black_Velvet

2025/04/12 01:10 編集

>PyPyPython様 わざわざ貴重な時間で回答して頂いているんですから感謝しましょうよ。 と、まぁChatGPTではエクセル機能外という根本的なミスをしてしまったので別の回答を… あんまり関数でごり押すのは好きじゃないんですが、 シート「000」のA1に =INDIRECT("'" & INT((ROW(A1)-1)/48)+1 & "'!A" & MOD(ROW(A1)-1,48)+1) を入れて、A24,000(48行×500シート)までフィルして下さい(既にスマートじゃない笑) これで要望の結果になると思います。 ただ、値が変わる度に再計算するので結構重いと思います。(面倒なので試してません) それから当然ですが、書式とかはシート「000」に依存します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問