VBAでフォルダ内の複数ファイル名と中身をまとめる
- 評価
- クリップ 1
- VIEW 4,406
前提・実現したいこと
同一フォルダ内にある複数のファイル(同フォーマット)を1つのファイルにまとめたく、各ファイルの内容とファイル名(もしくはFullnameパス)を同一のシートにコピーして貼り付けたい。
各ファイルの中身は項目が同一なので列数は同じ、件数が違うため行数はまちまちです。
ファイルの中身をコピーして貼り付けるマクロはなんとかできたのですが、ファイル名を取得して貼り付けるマクロがうまくいきません。
取り出した中身が10行だとすると10行分ファイル名をH列に貼付け
その下に次のファイルの中身3行があればH列に3行分ファイル名を貼付け
のようになるのが理想です。
発生している問題・エラーメッセージ
Workbook_pathで取得しようとしてもそもそも何も起きない。
該当のソースコード
Sub matome()
Dim buf As String, i As Long
Dim Workbook_path As String
Dim j
buf = Dir(Sheets("Sheet1").Range("A2").Value & "\*.xls")
Do While buf <> ""
Workbooks.Open Worksheets("Sheet1").Range("A2").Value & "\" & buf
Sheets("貼付け元").Range("B4:H100").Copy
ThisWorkbook.Activate
Range("A65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Workbooks(buf).Activate
Application.CutCopyMode = False
Workbooks(buf).Close SaveChanges:=False
buf = Dir()
Workbook_path = ActiveWorkbook.FullName
ThisWorkbook.Activate
Range("H65536").End(xlUp).Offset(1, 0).Select
Loop
End Sub
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
処理の順番ですね。
Workbooks(buf).Close SaveChanges:=False
の後に
Workbook_path = ActiveWorkbook.FullName
としてるので。
ActiveSheet、ActiveWorkbook に頼っていると、
不要なバグに悩まされるのでご注意を。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/05/08 15:02
2018/05/08 15:21
順番を変えてみたのですがうまくいきませんでした…。
2018/05/08 15:27
Workbook_path = ActiveWorkbook.FullName を、
変えてないならうまくいかないでしょう。
「ThisWorkbook.Activate」の処理は何をしてるかご存知ですよね?
すると、「ActiveWorkbook」は何になってるでしょう?
ブレークポイント使って、ActiveWorkbookの箇所で止めて、
イミディエイトウィンドウで「?ActiveWorkbook.name」でEnter とすれば、
該当処理の時に「ActiveWorkbook」が何になっているか分かるでしょう。
それが分かれば、どうすればいいのか想像がつくはずです。
2018/05/08 15:33
けど、Active○○に頼るからバグになっている、
という事だけは強く覚えてください。
自分のミスもあるので、正解を
ActiveSheet.Paste
Application.CutCopyMode = False
Workbooks(buf).Activate
Workbook_path = ActiveWorkbook.FullName
Workbooks(buf).Close SaveChanges:=False
buf = Dir()
2018/05/08 15:46 編集
Active○○を排除することで、プログラムの信頼性が上がります。
そして、処理も高速になります。
※インデントは自分で調整してください(コメント欄ではインデントが残らないので)
Sub matome()
Application.ScreenUpdating = False
Dim Sheet_Paste As Worksheet
ThisWorkbook.Activate
Set Sheet_Paste = ActiveSheet
Dim Sheet_Path As Worksheet
Set Sheet_Path = ThisWorkbook.Worksheets("Sheet1")
Dim FolderPath As String
FolderPath = Sheet_Path.Range("A2").Value
Dim buf As String
buf = Dir(FolderPath & "\*.xls")
Do While buf <> ""
Dim Range_Paste As Range
Set Range_Paste = Sheet_Paste.Range("A65536").End(xlUp).Offset(1, 0)
Dim Book_Copy As Workbook
Set Book_Copy = Application.Workbooks.Open(FolderPath & "\" & buf)
Dim Sheet_Copy As Worksheet
Set Sheet_Copy = Book_Copy.Worksheets("貼付け元")
Call Sheet_Copy.Range("B4:H100").Copy(Range_Paste)
Dim Workbook_path As String
Workbook_path = Book_Copy.FullName
Call Book_Copy.Close(SaveChanges:=False)
buf = Dir()
Loop
Application.ScreenUpdating = True
End Sub
2018/05/08 16:19
今まで簡単なものしか作ってこなかったので、Active~に頼りっきりでした…。
自分で作っておきながらActiveActive言い過ぎて一体どれがActiveなのか見失っていました…。
ただ、頂いた回答と直したコード両方試してみたのですがH列にファイル名がどうしてもペーストされず…。
A~G列に各ファイルの中身が入るんですが、カーソルは移動しているのに貼り付けられず…なのがどうしてもうまくいかないです…。
何かヒントがあればご教授ください。
よろしくお願いします。
2018/05/08 17:10
ブックのフルパスは取れてますよね?
H列に出力(ペースト?)したいのであれば、
値を取得するだけでなく、
そういう処理を追加しないと。。。
こちらも時間ないので、ご自分で頑張ってください~
2018/05/08 17:14
続きは自分で頑張ってみます!
お忙しいところありがとうございました。