Access2000VBA・Excel2000VBA独学~複数のシートのリスト形式の表を、好きな列や行を抜き出して縦に結合し、1つの転記先シートにまとめるサンプルプログラム(ADO+SQL)~複数のファイルの同じレイアウトの表を縦にまとめたいときにも、作り変えれば行けると思います。~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
  
目次
 ★ ご注意
 ★ 「日本のデータ管理」「データ管理の基礎」を腐らせたダメなVBA講師の教え方と、本サンプルの関係性について
 ★ はじめに(想定シーンなど)
 ★ その他の想定シーン
 ★ 前提条件
 ★ 必要な列や行を抜きだすための条件を書き換えるには
 ★ 他のブックを読みに行くには?
 ★ SQLの「UNION ALL(縦結合命令)」を使わなかった理由
 ★ 他のブックを読みに行ったときに、2013以降でエラーが出る場合
 ★ サンプルプログラム(コメントなし)
 ★ サンプルプログラム(コメントあり)
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
  
  
★ ご注意

このサンプルは、「SQL」のほかに、「ADO」と呼ばれる機能も使っていますが、以下のWebページに書かれているような「参照設定」という設定をしないと動きません。

『ExcelでADO・ADODBへの参照設定を』
https://www.relief.jp/docs/excel-vba-referencing-to-adodb-library.html

なので、かならずこの設定をしてからお試しください。

※2.5から大丈夫なので、Excel2000でも大丈夫だと思います。
  
  

★ 「日本のデータ管理」「データ管理の基礎」を腐らせたダメなVBA講師の教え方と、本サンプルの関係性について

大変失礼かつ無礼な言い方になってしまって、特にお若い方々には本当に申し訳ございませんが、本記事のこのような処理は、本来はVBAなんか使わなくても・・・・

「最初から、1つのブックの1つのシートに、時系列に下に・下に・ひたすら下方向に、データを蓄積していれば、” やらなくて済む ”、” 本当にバカみたいな処理 ” 」

・・・・です。

「最初から、1つのブックの1つのシートに、時系列に下に・下に・ひたすら下方向に、データを蓄積してさえいれば、本記事のサンプルプログラムのようなことは1文字も書かなくていい!」んです。

「本記事のサンプルプログラムは、本来、書く必要のない ” 超ムダなプログラム ” 」なんです。

「一回やったら、もう二度とやるな!というくらいの、 ” 超ムダなプログラム ” 」なんです。

しかし、現実には、こういうことをやりたい方が今も後を絶ちません。
(Excelが発売された20年も前から今まで。)

でも、こんな処理はほんとう、「データ管理の基礎を何も知らない人・効率化のことやコストのことを何も考えない人(特に講師)」がやることです。

なので、本サンプルのような処理をしたあとは、「ソースのブックは全部捨てて」、ただひたすら、新しく1つにまとめたブックのほうに、その後も継続して、時系列に下に・下に・ひたすら下方向に、データを蓄積していくことを「強く・強く・強く・強く」、お勧めします。

日本の愚かでダメなVBA講師は、本サンプルのような処理を「自慢げ」に行います。
そしてこのような処理を何度も行うことを推奨します。
「こんなのVBAで簡単にできるよ!」みたいに。

しかし、「データ管理の基礎」の「データの蓄積方法の重要性」について、皆さんに「何も」教えないのです。

VBAの「SQLを活用しない・本来書かないでいい無駄なループ処理」ばっかり教えていて。

「どうやったら、今後、無駄なVBAやワークシート関数が減らせるか」、
とか、
「今後、できるだけVBAやワークシート関数を使わずにデータの管理を効率化するには?」、
ということをするための、
「データの蓄積スタイル」の説明、
「その重要性」の説明を、
「全く」
教えないのです。

「バカの極致」

「バカの極み」

・・・としかいいようがありません。

このような4流以下のExcelVBA講師たちが・市販書籍の著者・ライター・編集者たちが・・・、Excelが登場した20年前・その当初からですが、「日本のデータ管理・若者のデータ管理」をダメにしてきました。

いいかげん、ここで、そういうことは辞めないと、本当に、「愚かな4流以下のExcelVBA講師・市販書籍の著者・ライター・編集者たち」に、「日本を潰されて」しまいます。

「お若い方々の未来が潰されて」しまいます。

結果、今後も「数字や接客データの管理・社外の情報管理のことをまったく分かっていない」、「社長・幹部・上司・同僚」が量産されつづけ、「そういった迷惑な人たち」が消えないために、私たち下っ端の「無駄な仕事」が一向に減りません。

(※「そういった迷惑な人たち」は本質を知ろうとしない・努力をしない・学ぼうとしない・感謝をしない・あるいは答えだけをかすめ取ろうとする傾向が強く、正直ハラが立ちますが、しかし、ある意味、その人たちを強力にそのようにすることを手助けしてしまったのが、「4流以下の市販書籍著者・ライター・編集者・Web管理者」だと言えるのかもしれません。もちろん、本人の人間性が低いことが一番の理由だとは思いますが・・・。)

働き方改革したいなら、まずは「そういった迷惑な人たち」にも「データ管理の基礎」を教えることが先決です。

ほんとうにそうして欲しいです。

ExcelVBAの独学者、初心者の方は、このことを是非、忘れないようにしてください。
そして特に「独立したい方」は、「ご自分自身が」、その「そういった迷惑な人たち」にならないように十分にお気をつけください。
「人間性が低い、本質を学ぼうとしない」人間にならないように・・・。
数値管理・接客データ管理にムダにお金をかけるなどといったバカなことはしないように、どうかご注意ください。
SQL」や「リレーション」を絶対に勉強してください。
個人レベル、5人以下の事務所なら、システム業者なんかに依頼しなくても、かなり多くのデータが「1回入力しただけで」「何百通りにも」「使いまわし」できます。
VBAやワークシート関数もかなり減らすことができます。
ExcelならMicrosoft Queryという機能やQueryTableオブジェクトで使えます。
本サイトでも関連記事を増やしていきます。

そして、「データの蓄積の仕方」に、是非、興味をもっていただき、今日・今からすぐにでも「1つのブックの1つのシートに、時系列に下に・下に・ひたすら下方向に、データを蓄積していくこと」を始めてみてください。その時のルールは以下の記事にも書いてあります。

★★★★★★★★★★★★Excelの真の基礎~効率を良くする作表のルール・基本手順(ちょっと詳細版)~Excelやパソコンを単なる紙と電卓の延長としてではなく、真のコンピュータとして使うために~Microsoft Queryやピボットテーブルを使えるようにするために。~

※その他の参考記事:『動的な表』『静的な表』『SQL
「時系列に下に・下に・ひたすら下方向に、データを蓄積していく表」→『動的な表』のことです。

このルールは、中高生・・・、下手をしたら小学生でも守れるルールです。
それを大人がやれない、ということは、絶対にありません。

そしてこれを守れば、必ず、今の0.1割増し~ケース・部分によっては10割増し以上の「データ管理の」効率化(コスパアップ、コストダウン)、が図れます。

そちらの方向への展望が開けてきます。

「数字と愚かなVBA講師たち・迷惑な上司や同僚に振り回される・ウソを教えられる」ということから、少しでも早く、「さよなら」できます。
  
  

★ はじめに(想定シーンなど)

このプログラムは以下のような処理を想定しています。

(01)「まったく同じ列構成の表」を持つシートが、
(02)例えば1つのExcelファイルの中に30枚以上ある場合で、
(03)そこから任意の列と行を取り出し、新しいシートに縦に結合したい。

そのような場合、例えば「列と行を絞り込む条件」が複雑なものになると・・・・、例えばその処理を「If文やループを使ったプログラム」でおこなってしまうと、とても複雑になってしまいます。

結果、メンテがとても大変になってしまいます。

といいますか、メンテ以前に、(条件がコロコロ変更されるとなると)初版を作るだけでも大変です。

もちろんその後の修正はもっと大変になってしまいます。

・・・というわけで、誰もがある程度簡単に作ったり修正したりできるようにするには、「ループを使わなくて済む」、「SQL」という仕組みが便利だと思いますので、今回は、それを使ってみました。

同時に、「SQLとVBAのCopyFromRecordsetメソッド」を使いたかったので、「ADO」という機能も使っています。これは「DAO」でもイケると思います。

CopyFromRecordsetメソッドは、ADOかDAOの「レコードセット」と呼ばれるものしか扱えないようなので・・・。
  
  

★ その他の想定シーン

このサンプルは、「1つのファイルの中で複数のシートを縦にまとめる」ということをしていますが、作り変えれば、「複数のファイルの同じレイアウトの表を縦にまとめたいとき」にも、行けると思います。

参考」『Access2000VBA・Excel2000VBA独学~フォルダの中に含まれる全てのファイルを(全てのサブフォルダの中も全部)再帰的に順に編集するサンプルプログラム~

その際にも、If文やループで条件設定するのではなく、ADO+SQLで条件設定して縦に結合するほうが(まとめるほうが)、メンテもラクちんになるケースが多いとは思います。
(もちろん、絶対ではないので、ケースバーケース、ですが。)

※その他の参考記事:『動的な表』『静的な表』『SQL
「時系列に下に・下に・ひたすら下方向に、データを蓄積していく表」→『動的な表』のことです。
  
  

★ 前提条件

このプログラムは、自ブックの、2つ目から右への全シート、全行を、「一番左に作った転記先のシート」に転記する設定にしてあります。

なので、一番左に転記先のシートが在る前提です。
(なければ作ります。列名も何もいりません。白紙の状態でOKです。)

そのほか、以下のようなことも前提です。必ずお読みになってください。
でないとエラーになりますが、サンプルなので、エラー対策は何もしていません。

' ※残りのシートはすべて「同じ列構造」であることと、
'  「データがないシートは無い」ということも前提です。
'  最低限、同じ列名が存在すること。
'  でないとエラーになります。対策はしてありません。
'
'  さらには、各ソースシートは、1行目が列名で、
'  列名の抜けが絶対に無いことも前提です。
'  もし必要なら、各ソースシートの列名の抜けが無いかを
'  調べるプログラムを追加します。
'
' ※実際のソースシートの側の列名の末尾に、スペースなどが
'  隠れていないことも前提です。そのようなミスがあるとエラーで止まります。
'  その際の対策はしてありません。
'
' ※自ブックではなく、他のブックも一応は読みに行けるように
'  してありますが、ただし、他のブックのシートを読みに行った時も、
'  一番左にダミーのシートを作っておくことが必要です。
'  今のサンプルコードでは、2番目のシートからのすべての
'  シートを読みに行くかたちになっていますので。
'
' ※バージョン2013以降のSDIには対応していません。
'  というか、何も考えていません。
'  なので、もしかしたら、それでも動くかもです。

  
  
★ 必要な列や行を抜きだすための条件を書き換えるには

s_SQL01 = "SELECT 連番, 社員番号, 社員名 FROM [" & s_SrcWsNm & "]"

のところだけを、「SQL」というものを調べて書き直せば、指定した条件の行に絞り込みつつ転記できると思います。(行を絞り込むには「Where」や「Between」などの命令語句を使います。)

かなり複雑な条件でもイケます。
そして、ここを書き直すだけでOKです。
その他の箇所をいじる必要はありません。
(ExcelのSQLの「方言」で、テーブル名=シート名は [ ] か、バッククォートで囲む必要があります。また、最後の「;」(セミコロン)が無くても何故か大丈夫な仕様になっています。「$」は「システムテーブル」という意味のようです。)

複雑な条件を、If文やループでやろうと思うと「気が遠くなる」ですが、SQLを使うとそのような「データ管理・プログラミングのムリ・ムダ・ムラ」から解放されることが少なくないので、本当にありがたいです。これを作ってくださった偉大な先人の方々に本当に感謝しないといけません・・・。

このサンプルでは、自ブックの、全シートの「社員番号」列と「社員名」列、「連番」列の、3つの列だけを全行読み込む例です。

列を増やしたかったら、「SELECT」 のあとに列名とカンマを使って列の設定を追加します。(「SELECT 」のあとの、「複数の列名の最初と最後」にはカンマを書かないように注意します。)

逆に減らしたかったら、不要な列名とカンマを消します。

また、スペースは、全角スペースを使うとエラーになりますのでそちらもご注意ください。

行を絞り込みたいときは、前述しましたとおり、「SQL」というものを調べて、「Where」や「Between」、その他の命令語句をいくつか使って、絞りこみます。

SQL」での条件式の詳しい書き方については、SQLに詳しい先輩や同僚の方に聞いてみてください。
  
  

★ 他のブックを読みに行くには?

Set o_SrcWb01 = ThisWorkbook
'データを読み込みたい、そのソースとなるブックの設定
' Set o_SrcWb01 = Workbooks.Open("D:\1\縦結合テスト.xlsm")
' Set o_SrcWb01 = Workbooks.Open("\\Fsvr01\Fld01\test.xlsm")

のところに書いたように、
Set o_SrcWb01 = Workbooks.Open("D:\1\縦結合テスト.xlsm")
のように書くか、
もしファイルサーバのファイルでUNCパスが使えるなら、
Set o_SrcWb01 = Workbooks.Open("\\Fsvr01\Fld01\test.xlsm")
のように書いてもいいです。

「Set o_SrcWb01 = ThisWorkbook」の行はコメントアウトします。
  
  
★ SQLの「UNION ALL(縦結合命令)」を使わなかった理由
結合したいシートが100枚とか200枚とかあったときに、SQL文が長くなった時に、SQLの側は問題ないのですが、「Excel側が」ちゃんと動くか検証をサボったのでここではやりませんでした。
もし結合したいシートの数が、20か30枚、くらいまでで、それ以上の数は絶対に無い!、ということなら、ループで「UNION ALL(縦結合命令)」を使ったSQLの命令文を作るなどをして、それを使った方が簡単で早いですし、コードも、もっと短くなると思います。
  
  

★ 他のブックを読みに行ったときに、2013以降でエラーが出る場合

このサンプルは、バージョン2010で作ったプログラムなので、SDIに対応していません。
なので、2013以降ではいきなりエラーが出るかもしれません。

そうしたらエラーが出たところをご自分で書き換えてみてください。
  
  

★ サンプルプログラム(コメントなし)
このサンプルは、かならずこの設定をしてからお試しください。
『ExcelでADO・ADODBへの参照設定を』https://www.relief.jp/docs/excel-vba-referencing-to-adodb-library.html

  
  

★ サンプルプログラム(コメントあり)
このサンプルは、かならずこの設定をしてからお試しください。
『ExcelでADO・ADODBへの参照設定を』https://www.relief.jp/docs/excel-vba-referencing-to-adodb-library.html