アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excelで、ファイル内にシートを統合するVBAを書いてみたいと思うのですが、ネットなどでは同一のファイル内にVBEを書き実行するものがほとんどのようにお見受けします。
すなわち、VBAのあるファイル(マクロファイル)にシートが5枚あれば5つドラッグしてくる、10枚あらえば10枚、100枚あれば100枚ドラッグするということになります。

スタート(統合)ボタンなどを付けることを考えると、どのみちマクロ用に準備というか統合用のシートは必要なので、そこでパスとファイル名を指定すれば、当該Excelファイル内のシートを全部統合してくれるというVBAが理想的なのですが、どなたかそういうコードをご教授いただけないでしょうか。

よろしくお願い申し上げます。

A 回答 (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行の列数で決定しています。
「Excel ファイルを指定し、指定された」の回答画像8
    • good
    • 1
この回答へのお礼

tatsumaru77様

この度は手取り足取りで本当にありがとうございます!
感謝感謝です!
ここまでご親切にしてくださって、日本も捨てたもんじゃないなと思っております。

で、頂戴したコードをコピーして、統合管理というフォルダを作り、
A2にフォルダのパス、B2にファイル名を入れましたが、

newname = "案件" & Left(book_name, pos - 1) & "統合" & Right(book_name, Len(book_name) - pos + 1)

のところでエラーが出てとまってしまいます。

しかし、tatsumaru77さんの別のファイルを作成するというマクロは、まさに私の理想とするものでしたので、
こちらを参考に少しずつ工夫して、A列・B列だけでなくAR列までコピーできるように
頑張って修正していきたいと思います。

本当にありがとうございました。

お礼日時:2023/07/10 20:18

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)
    • good
    • 1
この回答へのお礼

何度もありがとうございます。
感謝です!

  >以下のようにされたいということでしょうか。
おっしゃるとおりです。

  >①の場合、A.xlsx内のSheet1,Sheet2,Sheet3は全て同じレイアウトであることが前提になります。
はい同じレイアウトのものになります。

  >同じレイアウトの場合、見出し行は、最初のSheet1だけ付加し、
  >Sheet2,Sheet3はデータ行のみを統合するのが通常の考えかたです。
おっしゃるとおりですが、そこまで凝ったものは求めず、
逆に表頭があることでここからまた別のシートが統合されたんだなとわかればいいくらいに考えております。
(確認後は、非表示または削除します)

  >1つのファイル内の各シートが同じレイアウトだとしても、見出し行に関する情報は、
  >ファイルごとに異なるのではないでしょうか。
こちらもまったく同じにありますので、先頭の一行だけ残し、そこを固定しておくことで共通の表頭で運用しております。

  >現在、統合用のシートで提示されているのは、以下の情報のみです。
  >1.パス名(例 c:\data)
  >2.ファイル名(例 A.xlsx)

データはデータごとに件数がことなりますが、列に収まる情報は同じで44個程です。
少ないと1案件しかありませんが、多いと20案件くらいになります。

すなわちセル数でいうと、最低で1行×44列=44セルから
20行×44セル=880セルということになります。

よろしくお願いいたします。

お礼日時:2023/07/10 14:52

>「スタート(統合)ボタンなどを付けることを考えると、どのみちマクロ用に準備というか統合用のシートは必要なので、そこでパスとファイル名を指定すれば、当該Excelファイル内のシートを全部統合してくれる」



具体的にどのようなレイアウトになりますか。正確なレイアウトが判る画像を提示していただけませんでしょうか。

また、統合時にシート名はどうするのでしょうか。
例として
A.xlsx内にSheet1,Sheet2,Sheet3
B.xlsx内にSheet1,Sheet2,Sheet3
があったとき、
統合先のシート名は、どのようにしたいのでしょうか。
    • good
    • 1
この回答へのお礼

ご回答、ありがとうございます。

  >具体的にどのようなレイアウトになりますか。正確なレイアウトが判る画像を提示していただけませんでしょうか。

いやいや、そんなレイアウトなんてほどのものではなく、
パスとファイル名を指定できるセルを用意し、
そこに入力されたファイル内のシートを統合できたらよいなと思っております。

  >また、統合時にシート名はどうするのでしょうか。
統合されるシート名は、「統合」でよいと思っておりますし、
統合のマクロのファイル名を変えて当該案件名

  >例として
  >A.xlsx内にSheet1,Sheet2,Sheet3
  >B.xlsx内にSheet1,Sheet2,Sheet3

という場合でしたら、
「案件A統合」、「案件B統合」という感じにリネームして
(人力で)保存できればと考えております。

お礼日時:2023/07/10 12:07

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …

せめてどのようなデータ群になっている物をどのように纏めたいのかは欲しいかも。
で、実際5~100シートと幅が広いのでしょうか?
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
少ないと2シートくらいなのですが、多いと30シート(もしくはそれ以上)くらいあるので、一括でまとめるにしてもドラッグ&ドロップするのが大変だなと思っている次第です。

お礼日時:2023/07/10 12:06

少量であれば、わざわざパスとファイル名をシートに指定しなくても


シートを統合したいエクセルをActiveにしておいてVBAを実行すれば
出来ます。
    • good
    • 1
この回答へのお礼

ありがとうございました。
おそらくNo.3の方と同じことをおっしゃってくださっているんだと思いますが、参考になりました。ありがとうございました。

お礼日時:2023/07/10 10:54

こんにちは



>同一のファイル内に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

上記はご質問の内容とは少し異なる内容ですが、ブック内のシートを統合するものは既にお持ちでしょうから、それを、同じ内容のまま「他ブックを操作」できるように修正することで、ご質問の内容を実現できるものと思います。
    • good
    • 1
この回答へのお礼

ありがとうございました。
上記VBAを参考に自分でやってみます。
大変、参考になりました。ありがとうございました。

お礼日時:2023/07/10 10:55

>そんな風に読めましたか?



ごめんね。

>>どなたかそういうコードをご教授いただけないでしょうか。

これがそう見えちゃうんだな。

・・・本題・・・

>VBAの書かれているファイルにシートを持ってこないと、統合できないかと思うので質問した次第です。

ええと……「マクロを置く場所」について調べると解決するような気がするんです。
たぶんこの知識が不足していることから生じている疑問と思います。
チョット遠回りかもしれませんが、自身で調べることで理解を深めることができます。(いじわるじゃないんです)
もう少しだけ調べてみましょう。
    • good
    • 1
この回答へのお礼

そうですね。勉強不足なのは否めませんが、業務必要なのでお伺いしたまでです。ありがとうございました。

お礼日時:2023/07/10 10:52

ファイル名を取得する方法を調べてみましたか。


普通にインターネット上にありますよ。
そういったものを参考にしましょう。
そのうえでそのコードが理解できないのであれば、解説を求める質問をすると良いと思います。

・・・

(´・ω・`) ここは「代わりにマクロを作れ!俺様の成果として使ってやるwww」のように作業依頼をする場所ではありません。
自力でマクロを作れるようになるアドバイスを貰う場所です。
(勘違いしている人がいるので真似しないようにしましょう)
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございました。

  >ファイル名を取得する方法を調べてみましたか。
  >普通にインターネット上にありますよ。
先週から探しているのですが、ファイルを指定してというのはないように思います。
つまり、VBAの書かれているファイルにシートを持ってこないと、統合できないかと思うので質問した次第です。

とはいえ、わたしの見方が悪いのかもしれませんので、できましたらご紹介いただけますと大変助かります。
お願いできませんでしょうか。

  >(´・ω・`) ここは「代わりにマクロを作れ!俺様の成果として使ってやるwww」
そんな、滅相もないです。
そんな風に読めましたか?

まったくそんな意図はありません。

お礼日時:2023/07/10 10:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!