简体   繁体   English

VBA 从多个工作簿复制所有工作表

[英]VBA to copy all sheets from multiple workbooks

I'm trying to make a VBA that would open multiple workbooks ( only one also), copy all their sheets in another workbook.我正在尝试制作一个 VBA 可以打开多个工作簿(也只有一个),将所有工作表复制到另一个工作簿中。 I want to make my code functional directly from PersonalWorkbook so that i can use it in any new workbook that i want.我想直接从 PersonalWorkbook 使我的代码正常工作,以便我可以在我想要的任何新工作簿中使用它。

I know it's not a lot, but i got stucked with these incomplete versions (second one is not working as intended at all)...我知道这不是很多,但我被这些不完整的版本困住了(第二个根本没有按预期工作)......

Sub conso()
Dim folderpath As String
Dim file As String
Dim i As Long

folderpath = InputBox("Please paste the folder path", "Choose Folder") & "\"
file = Dir(folderpath)

Do While file <> ""
    Workbooks.Open folderpath & file
        ActiveWorkbook.Worksheets(1).Copy after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
        'ActiveSheet.Name = Right(Left(file, Len(file) - 5), Len(Left(file, Len(file) - 5)) - InStr(1, Left(file, Len(file) - 5), "("))
        'ActiveSheet.Name = file
        ActiveSheet.Name = Left(file, InStr(file, ".") - 1)
        Workbooks(file).Close
        
    file = Dir()
Loop

End Sub

Second:第二:

Sub open_and_copy_sheets()

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

Dim my_FileName As Variant
Dim nm As String
Dim nm2 As String
Dim i As Integer

nm = ActiveWorkbook.Name

my_FileName = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*")
If my_FileName <> False Then
    Workbooks.Open Filename:=my_FileName
End If

Workbooks(Workbooks.Count).Activate
nm2 = ActiveWorkbook.Name

For i = 1 To Workbooks(nm2).Worksheets.Count
      Sheets(i).Copy after:=Workbooks(nm).Sheets(Workbooks(nm).Sheets.Count)
Next i

Workbooks(nm2).Close SaveChanges:=False

Workbooks(nm).Activate
Worksheets(1).Activate

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Any help would be greately appreciated: I'm not that good in vba so any explanation would also be welcomed :)任何帮助将不胜感激:我在 vba 中不是那么好,所以也欢迎任何解释:)

If you want the function to be available in your PersonalWorkbook, then create a "Module" underneath your Personal.XLSB via the VBA Editor (see screen grab).如果您希望 function 在您的 PersonalWorkbook 中可用,然后通过 VBA 编辑器在 Personal.XLSB 下创建一个“模块”(参见屏幕截图)。 I've fixed your code a little:我已经修复了你的代码:

Option Explicit

Sub test()

    Dim destinationFile As Variant
    Dim sourceWbk As Workbook
    Dim destinationWbk As Workbook
    Dim sheet As Worksheet
    Dim index As Integer
    
    Application.ScreenUpdating = False
    Set sourceWbk = ActiveWorkbook
    
    destinationFile = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*")
    
    If destinationFile <> False Then
        
        Workbooks.Open fileName:=destinationFile
        Set destinationWbk = ActiveWorkbook
        
        For Each sheet In sourceWbk.Sheets
          
          sheet.Copy Before:=destinationWbk.Sheets(index)
          index = index + 1
        
        Next sheet
        
        MsgBox (index & " sheets copied")
        
    Else
    
        MsgBox ("No file selected. Action aborted.")
        
    End If
    
    Set sheet = Nothing
    Set sourceWbk = Nothing
    Set destinationWbk = Nothing
    Application.ScreenUpdating = True
    
End Sub

It's a little more compact than you had, which had one or two errors, also the code was continuing to attempt to copy even if no destination workbook was selected.它比你有一个或两个错误更紧凑,即使没有选择目标工作簿,代码也会继续尝试复制。 You will just need to add a line to save the final new workbook (you could use the "index" variable to see if it is > 1 as a check to see if there is anything to save. "Option Explicit" is a good idea to have at the top of the module, it checks your code to make sure that any variable you use has explicitly been declared, which helps to avoid typing errors.您只需要添加一行来保存最终的新工作簿(您可以使用“index”变量来查看它是否 > 1 作为检查是否有任何要保存的内容。“Option Explicit”是个好主意在模块的顶部,它会检查您的代码以确保您使用的任何变量都已明确声明,这有助于避免输入错误。 在此处输入图像描述

UPDATE HERE IS A COMPLETE SOLUTION:更新这里是一个完整的解决方案:

You need to break this down into separate chunks to get what you want.您需要将其分解为单独的块以获得您想要的。

STEP 1 - Ask the user whether they are copying sheets to a single file or multiples:第 1 步 - 询问用户他们是将工作表复制到单个文件还是多个文件:

    Public Function MasterCopy()

    Dim choice As Variant
    
    choice = InputBox("Enter S or M:", "Select whether to copy to a single or multiple sheets")
    
    Select Case UCase(choice)
        
        Case "S"
        
            Call FncSingleFileCopy
        
        Case "M"
        
            Call FncMultiFileCopy
            
        Case Else
        
            MsgBox ("Cancelled.")
            
    End Select
    
    
End Function

STEP 2: Add two functions, one for copying multiples and one for singles: STEP 2:添加两个功能,一个是复制倍数,一个是单数:

    Private Function FncMultiFileCopy()

    Dim destinationFile As Variant
    Dim sourceWbk As Workbook
    Dim folderPath As String
    Dim copied As Integer
    
    Set sourceWbk = ActiveWorkbook
    
    folderPath = InputBox("Please paste the folder path", "Choose Folder")
    
    If (folderPath) <> "" Then
        
        folderPath = folderPath & "\"
        destinationFile = Dir(folderPath)

        Do While destinationFile <> ""
        
            If InStr(destinationFile, ".xls") > 1 Then
        
                Call FncCopySheets(sourceWbk, folderPath & destinationFile)
        
            End If
        
            destinationFile = Dir()
    
        Loop
        
        MsgBox ("Finished.")
        
    Else
    
        MsgBox ("Cancelled.")
        
    End If
    
    Set sourceWbk = Nothing
    
End Function

Private Function FncSingleFileCopy()

    Dim destinationFile As Variant
    Dim sourceWbk As Workbook
    Dim copied As Integer
    
    Set sourceWbk = ActiveWorkbook
    
    destinationFile = Application.GetOpenFilename(FileFilter:="Excel Files,*.xl*;*.xm*")
    
    If destinationFile <> False Then
        
        copied = FncCopySheets(sourceWbk, destinationFile)
        
        MsgBox (copied & " sheets copied")
        
    Else
    
        MsgBox ("No file selected. Action aborted.")
        
    End If
    
    Set sourceWbk = Nothing
    
End Function

STEP 3: Finally, a function that takes a source workbook and destination file to copy the sheets, which can be called from either of the previous two functions:第 3 步:最后,一个 function 采用源工作簿和目标文件来复制工作表,可以从前两个函数中的任何一个调用:

    Private Function FncCopySheets(sourceWbk As Workbook, destinationFile As Variant) As Integer
    
    Dim destinationWbk As Workbook
    Dim sht As Worksheet
    Dim shtsCopied As Integer
    
    Application.ScreenUpdating = False
    
    Set destinationWbk = Workbooks.Open(destinationFile)
    
    For Each sht In sourceWbk.Sheets
          
        sht.Copy Before:=destinationWbk.Sheets(1)
        shtsCopied = shtsCopied + 1
        
    Next sht
        
    destinationWbk.Close (True)
    
    Application.ScreenUpdating = True
    
    FncCopySheets = shtsCopied
    
    Set destinationWbk = Nothing
    
End Function

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM