Excelで、ファイル内にシートを統合するVBAを書いてみたいと思うのですが、ネットなどでは同一のファイル内にVBEを書き実行するものがほとんどのようにお見受けします。
すなわち、VBAのあるファイル(マクロファイル)にシートが5枚あれば5つドラッグしてくる、10枚あらえば10枚、100枚あれば100枚ドラッグするということになります。
スタート(統合)ボタンなどを付けることを考えると、どのみちマクロ用に準備というか統合用のシートは必要なので、そこでパスとファイル名を指定すれば、当該Excelファイル内のシートを全部統合してくれるというVBAが理想的なのですが、どなたかそういうコードをご教授いただけないでしょうか。
よろしくお願い申し上げます。
No.8ベストアンサー
- 回答日時:
No6,7です。
以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub シート統合()
Dim ws As Worksheet
Dim maxrow As Long
Dim wrow As Long
Set ws = Worksheets("統合管理")
maxrow = ws.Cells((Rows.Count), 1).End(xlUp).Row
For wrow = 2 To maxrow
Call bind_sheets(ws.Cells(wrow, "A").Value, ws.Cells(wrow, "B").Value)
Next
MsgBox ("完了")
End Sub
Private Sub bind_sheets(ByVal folder_name As String, ByVal book_name As String)
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim i As Long
Dim maxrow As Long
Dim maxcol As Long
Dim row2 As Long
Dim pos As Long
Dim newname As String
Set wb1 = Workbooks.Open(folder_name & "\" & book_name)
Set wb2 = Workbooks.Add
Set ws2 = wb2.Worksheets(1)
ws2.Name = "統合"
row2 = 1
For i = 1 To wb1.Worksheets.Count
Set ws1 = wb1.Worksheets(i)
maxrow = ws1.Cells((Rows.Count), 1).End(xlUp).Row
maxcol = ws1.Cells(1, Columns.Count).End(xlToLeft).Column
ws2.Cells(row2, 1).Resize(maxrow, maxcol).Value = ws1.Cells(1, 1).Resize(maxrow, maxcol).Value
row2 = row2 + maxrow
Next
pos = InStrRev(book_name, ".")
newname = "案件" & left(book_name, pos - 1) & "統合" & right(book_name, Len(book_name) - pos + 1)
Application.DisplayAlerts = False
wb2.SaveAs (folder_name & "\" & newname)
Application.DisplayAlerts = True
wb2.Close
wb1.Close
End Sub
添付資料のような状態で定義されているものとします。
①シート名:統合管理
②A列 フォルダ名
③B列 ブック名
ブックを格納しているフォルダの中に統合したブックが作成されます。
例では、
d:\goo\data下に案件○○統合.xlsx
d:\goo\data2下に案件△△統合.xlsx
が作成されます。
統合元の各シートの最大行数はA列の行数で決定しています。
統合元の各シートの最大列数は1行の列数で決定しています。
tatsumaru77様
この度は手取り足取りで本当にありがとうございます!
感謝感謝です!
ここまでご親切にしてくださって、日本も捨てたもんじゃないなと思っております。
で、頂戴したコードをコピーして、統合管理というフォルダを作り、
A2にフォルダのパス、B2にファイル名を入れましたが、
newname = "案件" & Left(book_name, pos - 1) & "統合" & Right(book_name, Len(book_name) - pos + 1)
のところでエラーが出てとまってしまいます。
しかし、tatsumaru77さんの別のファイルを作成するというマクロは、まさに私の理想とするものでしたので、
こちらを参考に少しずつ工夫して、A列・B列だけでなくAR列までコピーできるように
頑張って修正していきたいと思います。
本当にありがとうございました。
No.7
- 回答日時:
No6です。
補足ありがとうございました。
以下のようにされたいということでしょうか。
A.xlsx内にSheet1,Sheet2,Sheet3
B.xlsx内にSheet1,Sheet2,Sheet3
があった場合、
①A.xlsx内のSheet1,Sheet2,Sheet3をシート名:統合 にまとめ
案件A統合.xlsxの名称で保存する。
②B.xlsx内のSheet1,Sheet2,Sheet3をシート名:統合 にまとめ
案件B統合.xlsxの名称で保存する。
①の場合、A.xlsx内のSheet1,Sheet2,Sheet3は全て同じレイアウトであることが前提になります。(レイアウトが異なるものを統合できなくはないが、統合する意味がないです)
同じレイアウトの場合、見出し行は、最初のSheet1だけ付加し、Sheet2,Sheet3はデータ行のみを統合するのが通常の考えかたです。
そうすると、見出し行が何行あり、データ行は何行から開始しているのか
の情報も必要になります。
1つのファイル内の各シートが同じレイアウトだとしても、見出し行に関する情報は、ファイルごとに異なるのではないでしょうか。
そうすると、そのような情報も、統合用のシートには必要ではないでしょうか。
現在、統合用のシートで提示されているのは、以下の情報のみです。
1.パス名(例 c:\data)
2.ファイル名(例 A.xlsx)
何度もありがとうございます。
感謝です!
>以下のようにされたいということでしょうか。
おっしゃるとおりです。
>①の場合、A.xlsx内のSheet1,Sheet2,Sheet3は全て同じレイアウトであることが前提になります。
はい同じレイアウトのものになります。
>同じレイアウトの場合、見出し行は、最初のSheet1だけ付加し、
>Sheet2,Sheet3はデータ行のみを統合するのが通常の考えかたです。
おっしゃるとおりですが、そこまで凝ったものは求めず、
逆に表頭があることでここからまた別のシートが統合されたんだなとわかればいいくらいに考えております。
(確認後は、非表示または削除します)
>1つのファイル内の各シートが同じレイアウトだとしても、見出し行に関する情報は、
>ファイルごとに異なるのではないでしょうか。
こちらもまったく同じにありますので、先頭の一行だけ残し、そこを固定しておくことで共通の表頭で運用しております。
>現在、統合用のシートで提示されているのは、以下の情報のみです。
>1.パス名(例 c:\data)
>2.ファイル名(例 A.xlsx)
データはデータごとに件数がことなりますが、列に収まる情報は同じで44個程です。
少ないと1案件しかありませんが、多いと20案件くらいになります。
すなわちセル数でいうと、最低で1行×44列=44セルから
20行×44セル=880セルということになります。
よろしくお願いいたします。
No.6
- 回答日時:
>「スタート(統合)ボタンなどを付けることを考えると、どのみちマクロ用に準備というか統合用のシートは必要なので、そこでパスとファイル名を指定すれば、当該Excelファイル内のシートを全部統合してくれる」
具体的にどのようなレイアウトになりますか。正確なレイアウトが判る画像を提示していただけませんでしょうか。
また、統合時にシート名はどうするのでしょうか。
例として
A.xlsx内にSheet1,Sheet2,Sheet3
B.xlsx内にSheet1,Sheet2,Sheet3
があったとき、
統合先のシート名は、どのようにしたいのでしょうか。
ご回答、ありがとうございます。
>具体的にどのようなレイアウトになりますか。正確なレイアウトが判る画像を提示していただけませんでしょうか。
いやいや、そんなレイアウトなんてほどのものではなく、
パスとファイル名を指定できるセルを用意し、
そこに入力されたファイル内のシートを統合できたらよいなと思っております。
>また、統合時にシート名はどうするのでしょうか。
統合されるシート名は、「統合」でよいと思っておりますし、
統合のマクロのファイル名を変えて当該案件名
>例として
>A.xlsx内にSheet1,Sheet2,Sheet3
>B.xlsx内にSheet1,Sheet2,Sheet3
という場合でしたら、
「案件A統合」、「案件B統合」という感じにリネームして
(人力で)保存できればと考えております。
No.5
- 回答日時:
せめてどのようなデータ群になっている物をどのように纏めたいのかは欲しいかも。
で、実際5~100シートと幅が広いのでしょうか?
ご回答、ありがとうございます。
少ないと2シートくらいなのですが、多いと30シート(もしくはそれ以上)くらいあるので、一括でまとめるにしてもドラッグ&ドロップするのが大変だなと思っている次第です。
No.3
- 回答日時:
こんにちは
>同一のファイル内にVBEを書き実行するものがほとんどのようにお見受けします。
他のブックの処理をしたいということと解釈しました。
多分、ご覧になっているコードではセル範囲を指定するのに
Worksheets(n).Range(~~)
のような記述を用いているのではないかと想像します。
実はこれは、
Workbook("book名").Worksheets(n).Range(~~)
を省略した描き方で、ブックを省略した場合には、ActiveWorkbookと見做されます。
シートオブジェクトも省略して
Range(~~)
と記述すれば、ActiveSheetのセル範囲と見做されるという仕組みになっています。
つまり、他のブックを操作したいときはブックオブジェクトを省略せずに指定してあげれば良いということです。
コードにいちいちブックオブジェクトを記述していると長くなりがちなので、With構文を利用して省略するという方法もあります。
https://learn.microsoft.com/ja-jp/office/vba/lan …
実際には、他のブックが閉じている状態であれば、対象ブックを開く処理から記述する必要があります。
以下のサイトに、「複数ブックの、特定のシートを統合する」例の説明がありますので、「他のブックを操作する」ことに関する述方法のご参考になると思います。
https://www.moug.net/tech/exvba/0060003.html
上記はご質問の内容とは少し異なる内容ですが、ブック内のシートを統合するものは既にお持ちでしょうから、それを、同じ内容のまま「他ブックを操作」できるように修正することで、ご質問の内容を実現できるものと思います。
No.2
- 回答日時:
>そんな風に読めましたか?
ごめんね。
>>どなたかそういうコードをご教授いただけないでしょうか。
これがそう見えちゃうんだな。
・・・本題・・・
>VBAの書かれているファイルにシートを持ってこないと、統合できないかと思うので質問した次第です。
ええと……「マクロを置く場所」について調べると解決するような気がするんです。
たぶんこの知識が不足していることから生じている疑問と思います。
チョット遠回りかもしれませんが、自身で調べることで理解を深めることができます。(いじわるじゃないんです)
もう少しだけ調べてみましょう。
No.1
- 回答日時:
ファイル名を取得する方法を調べてみましたか。
普通にインターネット上にありますよ。
そういったものを参考にしましょう。
そのうえでそのコードが理解できないのであれば、解説を求める質問をすると良いと思います。
・・・
(´・ω・`) ここは「代わりにマクロを作れ!俺様の成果として使ってやるwww」のように作業依頼をする場所ではありません。
自力でマクロを作れるようになるアドバイスを貰う場所です。
(勘違いしている人がいるので真似しないようにしましょう)
早速のご回答、ありがとうございました。
>ファイル名を取得する方法を調べてみましたか。
>普通にインターネット上にありますよ。
先週から探しているのですが、ファイルを指定してというのはないように思います。
つまり、VBAの書かれているファイルにシートを持ってこないと、統合できないかと思うので質問した次第です。
とはいえ、わたしの見方が悪いのかもしれませんので、できましたらご紹介いただけますと大変助かります。
お願いできませんでしょうか。
>(´・ω・`) ここは「代わりにマクロを作れ!俺様の成果として使ってやるwww」
そんな、滅相もないです。
そんな風に読めましたか?
まったくそんな意図はありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数ブックの統合について Excel VBA 1 2022/05/13 09:48
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) エクセルのマクロで複数シートを両面印刷するには? 2 2022/12/08 23:23
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
- Excel(エクセル) ワードのマクロについて教えてください。 1 2023/03/11 13:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ワイルドカード「*」を使うとう...
-
エクセルVBAが途中で止まります
-
(マクロ)データをAブックからB...
-
VBA シート名が一致した場合の...
-
VBA シートをコピーする際に Co...
-
VBA 別ブックからコピペしたい...
-
VBA コードを実行すると画面が...
-
複数のエクセルブックをひとつ...
-
【VBA】全シートの計算式を全て...
-
VBAで別ブックのシートを指定し...
-
EXCELのブック名を引数(変数)...
-
【前回の続き続きです、ご教示...
-
別ブックの列同士の値が一致し...
-
ブックの選択について
-
VBS Bookを閉じるコード
-
現在開いているbook全てを対象...
-
拡張メタファイルにて貼り付け
-
エクセルのマクロについて教え...
-
VBA アプリケーション定義また...
-
vbaで他のブックに転記したい。...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
エクセルVBAが途中で止まります
-
別ブックをダイアログボックス...
-
ワイルドカード「*」を使うとう...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBS Bookを閉じるコード
-
【ExcelVBA】インデックスが有...
-
VBA コードを実行すると画面が...
-
【ExcelVBA】zip圧縮されたCSV...
-
vbaでvbaProjectのパスワード解...
-
VBAで別ブックのシートを指定し...
-
ExcelのVBAです。フォルダ内の...
-
vbaで他のブックに転記したい。...
-
フォルダ内の全てのファイルに...
-
VBAで複数のブックを開かずに処...
-
VBSでExcelのオープン確認
-
VBA 実行時エラー 2147024893
-
【Excel VBA】書き込み先ブック...
-
VBA シート名が一致した場合の...
おすすめ情報