Excel (VBA) |
![]() ![]() |
(指定なし : Excel 2016)
複数のエクセルブックから特定のシートのみをコピーする方法について
投稿日時: 23/05/19 15:48:10
投稿者: コアラ
|
---|---|
お忙しいところ大変恐縮ですが、お教え頂ければ幸いです。
|
![]() |
投稿日時: 23/05/19 17:01:22
投稿者: WinArrow
|
---|---|
内容の確認
引用: 基本的に、同じ名前のシートが複数存在することはできないので、 この表現は、実際と異なると思います。 正確に説明してください。 |
![]() |
投稿日時: 23/05/19 17:06:19
投稿者: WinArrow
|
---|---|
追加レス
|
![]() |
投稿日時: 23/05/19 18:17:23
投稿者: sk
|
---|---|
引用: ・1 つのブックの中に、社内におよそ 50 ある部署の それぞれの名前がそのままシート名として使用されている ワークシートが、全ての部署の数だけ作成されている。 引用: ・上記のブックをマスターとして全ての部署の数だけコピーし、 その際にそれぞれの部署の名前をそのままファイル名としてリネームしている。 (例: 総務部.xlsx、税務課.xlsx ) ・コピーされたブック(レプリカ)は、そのブックと同じ名前を持つ部署に対して 配布される。 ・各部署の担当者は、配布された(自分の部署と同じ名前がつけられた)ブックの 自分の部署と同じ名前を持つワークシートのみを編集する。 (例えば、「総務部.xlsx」を受け取った総務部の担当者は、 そのブックの「総務部」という名前のワークシートのみを編集する) 引用: ・各部署の担当者が編集したレプリカブックのコピーを全ての部署から収集して ある 1 つのフォルダに保存し、それぞれの部署の担当者の手によって 編集されたワークシートを 1 つのブックに統合して 新しいマスターブックを作成しようとしている。 恐らくこんなところでしょうか。 |
![]() |
投稿日時: 23/05/19 19:36:12
投稿者: コアラ
|
---|---|
お世話になっております。
|
![]() |
投稿日時: 23/05/19 22:11:15
投稿者: WinArrow
|
---|---|
参考コードを掲示します。
Option Explicit Sub Sample() Dim FTBL, FS, FX As Long, Tx As Long Dim myPATH As String, F '対象ファイル取得⇒パス配列へ格納 myPATH = "D:\新しいフォルダー" With CreateObject("Scripting.FileSystemObject") Set FS = .Getfolder(myPATH).Files ReDim FTBL(1 To FS.Count) Tx = 0 For Each F In FS Tx = Tx + 1 FTBL(Tx) = F.Path Next End With Dim wbk As Workbook, NewBook As Workbook Dim wSht As Worksheet Dim FXX As Long, FX1 As Long For FX = LBound(FTBL) To UBound(FTBL) Set wbk = Workbooks.Open(Filename:=FTBL(FX)) With wbk For Each wSht In .Worksheets If wSht.Name = Left(.Name, InStr(wbk.Name, ".") - 1) Then wSht.Copy Set NewBook = ActiveWorkbook FXX = FX Exit For End If Next .Close False End With GoSub FilePUT Set NewBook = Nothing Next Exit Sub FilePUT: For FX1 = LBound(FTBL) To UBound(FTBL) If FX1 <> FXX Then Set wbk = Workbooks.Open(Filename:=FTBL(FX)) For Each wSht In wbk.Sheets If wSht.Name = NewBook.Sheets(1).Name Then wSht.Copy after:=NewBook.Sheets(NewBook.Sheets.Count) wbk.Close False Exit For End If Next End If Next NewBook.SaveAs Filename:=myPATH & "\NEW_" & NewBook.Sheets(1).Name & ".xlsX" NewBook.Close False Return End Sub |
![]() |
投稿日時: 23/05/20 00:10:01
投稿者: simple
|
---|---|
既に回答いただいていますが、別の書き方も挙げておきます。
Sub main() Dim newBook As Workbook Dim myPATH As String Dim f As Object Dim wb As Workbook Dim baseName As String '50個のブックを順次開き、ブック名と同じ名前を持つシートを、 '新規作成ブックにコピーする '新規ブックの作成 Set newBook = Workbooks.Add myPATH = "D:\フォルダー" ' 50個のブックがあるフォルダ With CreateObject("Scripting.FileSystemObject") For Each f In .Getfolder(myPATH).Files Set wb = Workbooks.Open(f.Path) baseName = .GetBaseName(f.Path) '拡張子を除くファイル名 wb.Worksheets(baseName).Copy _ after:=newBook.Worksheets(newBook.Worksheets.Count) wb.Close False Next End With '集約したブックを保存 newBook.SaveAs "結果.xlsx", xlWorkbookDefault End Sub |
![]() |
投稿日時: 23/05/20 04:26:50
投稿者: コアラ
|
---|---|
ウィンアロー 様
|
![]() |
投稿日時: 23/05/20 07:19:15
投稿者: WinArrow
|
---|---|
参考のコードをアップしてから気が付いたのですが、
|
![]() |
投稿日時: 23/05/20 08:37:11
投稿者: WinArrow
|
---|---|
いまさらですが
|
![]() |
投稿日時: 23/05/20 11:18:10
投稿者: コアラ
|
---|---|
WinArrow 様
|
![]() |
投稿日時: 23/05/20 11:18:24
投稿者: コアラ
|
---|---|
WinArrow 様
|
![]() |
投稿日時: 23/05/20 13:01:32
投稿者: WinArrow
|
---|---|
整理して頂き、話が見えるようになってきました。
Sub sample() Dim FileTBL, Fx As Long, F Dim myPATH As String, NewBook As Workbook Dim sht As Worksheet, shtnm, Sx As Long myPATH = "D:\確認用フォルダー" ReDim FileTBL(1 To 1): Fx = 0 With CreateObject("Scripting.FileSystemObject") For Each F In .Getfolder(myPATH).Files If Left(F.Name, 3) = "02_" Then Fx = Fx + 1 ReDim Preserve FileTBL(1 To Fx) FileTBL(Fx) = F.Path End If Next End With Set NewBook = Workbooks.Add ReDim shtnm(1 To 1): Sx = 0 For F = LBound(FileTBL) To UBound(FileTBL) With Workbooks.Open(Filename:=FileTBL(Fx)) For Each sht In .Sheets If .Name Like "*" & sht.Name & "*" Then sht.Copy after:=NewBook.Sheets(NewBook.Sheets.Count) Sx = Sx + 1 ReDim Preserve shtnm(1 To Sx) shtnm(Sx) = sht.Name Exit For End If Next If sht Is Nothing Then MsgBox "「ブック名」(" & .Name & "」に対応するシートは存在しません" End If .Close False End With Next ' With NewBook.Sheets(1) ' .Name = "目次" ' ' End With NewBook.SaveAs Filename:=myPATH & "\取り纏め用.xlsx" NewBook.Close False Set NewBook = Nothing End Sub |
![]() |
投稿日時: 23/05/20 13:20:45
投稿者: Suzu
|
---|---|
現状は、その業務フローなのでしょうが、それを見直した方がすっきりしませんでしょうか。
Sub シート個別ファイル保存() Dim wbk As Workbook Dim wst As Worksheet Dim TargetFile As Variant Dim TargetFolder As Variant With Application.FileDialog(msoFileDialogFilePicker) .Title = "対象ファイルを選択" If .Show = True Then TargetFile = .SelectedItems(1) End If End With If TargetFile = "" Then Exit Sub With Application.FileDialog(msoFileDialogFolderPicker) .Title = "保存先フォルダを指定" If .Show = True Then TargetFolder = .SelectedItems(1) End If End With If TargetFolder = "" Then Exit Sub Set wbk = Application.Workbooks.Open(TargetFile, , True) For Each wst In wbk.Worksheets wst.Copy With ActiveWorkbook .SaveAs TargetFolder & "\" & wst.Name, xlWorkbookDefault .Close End With Next wbk.Close Set wst = Nothing Set wbk = Nothing End Sub Sub ファイル統合() Dim wbk0 As Workbook Dim wbk1 As Workbook Dim FSO As Object 'Scripting.FileSystemObject Dim Fil As Object 'Scripting.File Dim i As Long Dim TargetFile As Variant Dim TargetFolder As Variant With Application.FileDialog(msoFileDialogFolderPicker) .Title = "保存されているフォルダを選択" If .Show = True Then TargetFolder = .SelectedItems(1) End If End With If TargetFolder = "" Then Exit Sub Set FSO = CreateObject("Scripting.FileSystemObject") For Each Fil In FSO.GetFolder(TargetFolder).Files If FSO.GetExtensionName(Fil.Path) = "xlsx" Then i = i + 1 Set wbk1 = Workbooks.Open(Fil.Path, , True) If i = 1 Then wbk1.Worksheets.Copy Set wbk0 = ActiveWorkbook Else wbk1.Worksheets.Copy After:=wbk0.Worksheets(wbk0.Worksheets.Count) End If wbk1.Close End If Next Stop wbk0.SaveAs TargetFolder & "\" & "保存ファイル名.xlsx" wbk0.Close Set wbk1 = Nothing Set wbk0 = Nothing End Sub |
![]() |
投稿日時: 23/05/20 21:04:53
投稿者: コアラ
|
---|---|
WinArrow 様
|
![]() |
投稿日時: 23/05/20 21:26:43
投稿者: WinArrow
|
---|---|
申し訳ありません。
|
![]() |
投稿日時: 23/05/21 18:07:07
投稿者: コアラ
|
---|---|
WinArrow 様
|