Excel (VBA) |
![]() ![]() |
(Windows 10 Pro : Excel 2016)
複数のエクセルシート(60個程度)をまとめるVBAについて
投稿日時: 23/01/25 06:53:11
投稿者: マイルストン
|
---|---|
いつもお世話になっております。
|
![]() |
投稿日時: 23/01/25 09:41:30
投稿者: 半平太
|
---|---|
>全てシート1の同じ場所
|
![]() |
投稿日時: 23/01/25 09:43:53
投稿者: WinArrow
|
---|---|
まず、どの様にしたいのかを説明してください。
|
![]() |
投稿日時: 23/01/25 10:47:31
投稿者: simple
|
---|---|
こちらの質問掲示板のなかに、即効テクニックという記事群があります。
|
![]() |
投稿日時: 23/01/25 10:51:19
投稿者: マイルストン
|
---|---|
半平太 様
|
![]() |
投稿日時: 23/01/25 11:01:29
投稿者: マイルストン
|
---|---|
【補足説明】
|
![]() |
投稿日時: 23/01/25 11:34:33
投稿者: simple
|
---|---|
よく読んでいただきたいですね。
|
![]() |
投稿日時: 23/01/25 11:38:50
投稿者: Suzu
|
---|---|
60個 のブック と言いますが、その 60個を どう指定するのですか?
Sub Sample() '※ 要参照設定 Microsoft Scripting Runtime Dim FSO As Scripting.FileSystemObject Dim Fld As Scripting.Folder Dim Fil As Scripting.File Dim FldPath As String Dim FileName As String Dim wbk As Workbook Dim c As Long FldPath = "フォルダフルパス指定" Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FolderExists(FldPath) = False Then MsgBox "フォルダなし" GoTo Exit_Sample End If Set Fld = FSO.GetFolder(FldPath) With ThisWorkbook.Worksheets("Sheet1") c = .Cells(2, .Columns.Count).End(xlToLeft).Column End With If c <= 6 Then c = 6 For Each Fil In Fld.Files If FSO.GetExtensionName(Fil) = "xlsx" Then Stop Set wbk = Application.Workbooks.Open(Fil.Path) wbk.Worksheets(1).Range("E4:E44").Copy ThisWorkbook.Worksheets("Sheet1").Cells(2, c) ThisWorkbook.Worksheets("Sheet1").Cells(1, c).Value = FSO.GetBaseName(Fil) wbk.Close c = c + 1 End If Next Exit_Sample: Set wbk = Nothing Set Fil = Nothing Set Fld = Nothing Set FSO = Nothing End Sub |
![]() |
投稿日時: 23/01/25 12:02:27
投稿者: マイルストン
|
---|---|
[quote="simple"]よく読んでいただきたいですね。
|
![]() |
投稿日時: 23/01/25 12:04:36
投稿者: 半平太
|
---|---|
質問のメインは、こっちなんですけどねぇ・・
Sub TEST1() Dim A, FileX, RwtoRite As Long ' ファイルパスを指定 A = ThisWorkbook.Path & "\TEST001\" FileX = Dir(A & "*.xls*") Application.ScreenUpdating = False Do While FileX <> "" RwtoRite = RwtoRite + 41 With Workbooks.Open(A & FileX, , True).Sheets(1) '読み取り専用でブックを開く .Range("E4:E44").Copy ThisWorkbook.Sheets("Sheet1").Cells(RwtoRite - 39, "F") .Parent.Close False End With FileX = Dir() Loop ThisWorkbook.Sheets("Sheet1").Range("F2").ColumnWidth = 55 Application.ScreenUpdating = True End Sub |
![]() |
投稿日時: 23/01/25 12:26:50
投稿者: マイルストン
|
---|---|
Suzu 様
|
![]() |
投稿日時: 23/01/25 13:18:10
投稿者: マイルストン
|
---|---|
Suzu 様
|
![]() |
投稿日時: 23/01/25 14:29:07
投稿者: Suzu
|
---|---|
引用: 何よりです。 引用: テスト時の確認用に入れていました。 削除して問題ありません。 |
![]() |
投稿日時: 23/01/25 16:43:33
投稿者: マイルストン
|
---|---|
Suzu 様
|
![]() |
投稿日時: 23/01/25 17:46:43
投稿者: マイルストン
|
---|---|
Suzu 様
|
![]() |
投稿日時: 23/01/25 20:08:35
投稿者: simple
|
---|---|
横から失礼。
|
![]() |
投稿日時: 23/01/26 05:52:11
投稿者: マイルストン
|
---|---|
半平太 様
|
![]() |
投稿日時: 23/01/26 05:58:34
投稿者: マイルストン
|
---|---|
simple 様
|
![]() |
投稿日時: 23/01/26 06:21:31
投稿者: simple
|
---|---|
私の記憶違いで、FSOのFolderオブジェクトのFilesコレクションの順序は
|
![]() |
投稿日時: 23/01/26 10:35:13
投稿者: マイルストン
|
---|---|
半平太 様
|
![]() |
投稿日時: 23/01/26 10:36:53
投稿者: マイルストン
|
---|---|
simple 様
|
![]() |
投稿日時: 23/01/26 11:00:04
投稿者: Suzu
|
---|---|
ファイルオブジェクトの順番 については、昇順の保証はないです。
引用: ・出力後に、Excelの機能を使い並べ替えを行う ・出力前に、コード内で並べ替えを行う で対応ください。 前者の方が簡単でしょうね。 データ範囲(ヘッダー無し)を選択 「データ」-「並べ替えとフィルター」 先頭行をデータの見出しとして使用する チェック オプション の 方向 を 列単位 でOK 優先させるキー を ファイル名の行に指定し OK 上記をマクロの自動記録で記録し、VBAコードの参考にし コーディングしてみてください。 |
![]() |
投稿日時: 23/01/26 11:27:05
投稿者: マイルストン
|
---|---|
お世話になっております。
|
![]() |
投稿日時: 23/01/26 17:28:56
投稿者: WinArrow
|
---|---|
出来た・・・・
引用: の中の > c = .Cells(2, .Columns.Count).End(xlToLeft).Column は、大丈夫ですか? E2にデータが入っていると、E2のデータは消えてしまうと思いますが・・・ Max関数を使うと > If c <= 5 Then c = 5 は不要になります。 |
![]() |
投稿日時: 23/01/26 18:15:56
投稿者: マイルストン
|
---|---|
お世話になっております。
|
![]() |
投稿日時: 23/01/26 18:19:02
投稿者: マイルストン
|
---|---|
WinArrow 様
|
![]() |
投稿日時: 23/01/26 20:58:11
投稿者: WinArrow
|
---|---|
引用: 最初に7個のアイルを取込んだ時には、 何処の列までデータが書き込まれていますか? E列から始まるから E,F,G,H,I,J、K までなら理解できます。 ですから、最初の処理では、「K2」まで、書き込まれていて 2回目取込んだ時、「K]列が2回目のデータで、上書きされている というのでしたら、理解できます。・・・・コードがそのようになっていますから・・・ 「H2」・・・・は分かりません。 ステップ実行で、次のコードを実行時に 変数:cの値を確認してみましょう。 |
![]() |
投稿日時: 23/01/27 11:21:47
投稿者: マイルストン
|
---|---|
WinArrow 様
|
![]() |
投稿日時: 23/01/27 12:36:02
投稿者: マイルストン
|
---|---|
お世話になっております。
|
![]() |
投稿日時: 23/01/27 13:08:00
投稿者: WinArrow
|
---|---|
マイルストン さんの引用: 他人(回答者の提供を含む)からのコードを単純にコピペするのではなく、 コードの意味をキチンと理解することが大切です。 >> c = .Cells(2, .Columns.Count).End(xlToLeft).Column は、データの入っている最右列を取得する ことを理解すれな、その右は「+1」すればよいことが分かりますね。 でも、そこに空白のセルがあると、 このコードでは使えませんね? > ThisWorkbook.Worksheets("Sheet1").Cells(1, c).Value = FileX は、1行目には、必ずデータが入るので、1行目を利用する方法もありますね・・・ Max関数を利用について With ThisWorkbook.Worksheets("Sheet1") c = WorksheetFunction.Max(.Cells(2, .Columns.Count).End(xlToLeft).Column + 1, 5) End With |
![]() |
投稿日時: 23/01/27 13:49:50
投稿者: simple
|
---|---|
感想だけですみません。
|
![]() |
投稿日時: 23/01/27 16:25:55
投稿者: マイルストン
|
---|---|
WinArrow 様
|
![]() |
投稿日時: 23/01/27 16:51:10
投稿者: マイルストン
|
---|---|
質問が長くなってしまい大変申し訳ございません。
|
![]() |
投稿日時: 23/01/27 17:57:39
投稿者: WinArrow
|
---|---|
引用: メッセージ表示の目的にあっていれば、よいのでは? 目的が赤らない他人に訊くことではありません。 あなたが考えることです。 |
![]() |
投稿日時: 23/01/27 19:27:47
投稿者: マイルストン
|
---|---|
WinArrow 様
引用: ご指摘のとおり、私自身で考えるべきことがらですね。 日々研鑽を積んで勉強していきたいと思います。 今回は、多くの皆様からご指導いただき大変勉強になりました。 今回の学びを活かしてスキルアップを目指していきます。 本当にありがとうございました。 |