【问题标题】:Run time error while combining more than one excel files into one worksheet将多个 Excel 文件合并到一个工作表中时出现运行时错误
【发布时间】:2016-09-03 07:20:36
【问题描述】:

我正在尝试使用以下代码将放置在特定文件夹中的多个 Excel 文件合并到一个工作表中。该代码是我个人宏工作簿的一部分。

    Sub Combined_Sheets()
    Dim strFolder
    strFolder = GetFolder
    Path = strFolder
    Dim NumSheets As Integer
    Dim NumRows As Double
    Dim wks As Worksheet
    Dim wb As Workbook
    Set wb = ActiveWorkbook
    Dim number As Integer
    number = 1
    Filename = Dir(Path & "*.*")
    Do While Filename <> ""
        Workbooks.Open Filename:=Path & Filename, ReadOnly:=True, CorruptLoad:=xlRepairFile
        For Each Sheet In ActiveWorkbook.Sheets
            ActiveSheet.Name = number
            Sheet.Copy After:=wb.Sheets(1)
            number = number + 1
        Next Sheet
        Workbooks(Filename).Close savechanges:=False
        Filename = Dir()
    Loop
    Application.DisplayAlerts = False
    wb.Worksheets("Sheet1").Delete
    Application.DisplayAlerts = True
    NumSheets = ActiveWorkbook.Worksheets.Count
    Worksheets(1).Select
    Sheets.Add
    ActiveSheet.Name = "Consolidated"
    For x = 1 To NumSheets
        Worksheets(x + 1).Select
        Range("A1").Select
        Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
        Selection.Copy
        Worksheets("Consolidated").Select
        ActiveSheet.Paste
        ActiveCell.SpecialCells(xlLastCell).Offset(1, 0).Select
        Selection.End(xlToLeft).Select
        Selection.End(xlToLeft).Select
        Worksheets(x + 1).Select
        Range("A1").Select
    Next x
    Worksheets("Consolidated").Select
    Range("A1").Select
    Application.DisplayAlerts = False
    For Each wks In Worksheets
        If wks.Name <> "Consolidated" Then wks.Delete
    Next wks
    Application.DisplayAlerts = True
End Sub
Function GetFolder() As String
    Dim oFolder As Object
    GetFolder = ""
    Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Choose a folder", 0)
    If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
    Set oFolder = Nothing
End Function

运行时出现以下错误。

运行时错误“1004”:

工作簿必须至少包含一个可见的工作表。

要隐藏、删除或移动选定的工作表,请先插入新工作表或取消隐藏已隐藏的工作表。

请在这方面提供帮助。

【问题讨论】:

  • 哪一行会抛出这个错误?
  • wb.Worksheets("Sheet1").Delete 行很可能会给出错误,因为现在有天新工作台打开了 1 个工作表,而不是旧版本中的 3 个。因此你得到了错误:)
  • @SiddharthRout,你说的可能有点不太可能,因为你提到的那一行是在循环填充 wb 之后使用所有文件夹文件中的表格
  • @user3598756 - 循环不会做任何事情,因为路径会出错。如果用户选择“C:\abc\def”文件夹,则Dir("C:\abc\def.") 不会返回任何文件。因此不会复制任何工作表。因此,如果一开始工作簿中的唯一工作表是“Sheet1”,则删除时 Excel 会报错。
  • @user3598756:是的,你是对的。然后我猜是If wks.Name &lt;&gt; "Consolidated" Then wks.Delete 这条线。由于For Each wks In Worksheets 不是完全限定的,它可能引用了错误的工作簿并且无法找到“合并”工作表,因此试图删除所有工作表:)

标签: vba excel macros


【解决方案1】:

更改以下行

If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path

If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path & "\"

您还应该在主代码中使用 GetFolder 之前检查它是否返回了非空字符串,可能如下:

strFolder = GetFolder
If strFolder = "" Then
    MsgBox "No directory selected - cannot continue"
    End
End If

【讨论】:

  • 感谢 YowE3K,建议的更改效果很好。问候金
【解决方案2】:

您的代码确实有效,但有很多不必要的步骤。

你的 getfolder 函数也有问题。

我只是在代码中使用了这一行来选择文件夹

    With Application.FileDialog(msoFileDialogFolderPicker)
    .Show
    MyDir = .SelectedItems(1) & "\"
End With

然后您可以遍历每个工作表并将范围复制到“合并”工作表。无需复制和删除工作表。

  For Each sh In Sheets

            With sh

                Set FrNg = .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell))
                FrNg.Copy Wb.Worksheets("Consolidated").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)

            End With

        Next sh

这是我将在您的情况下使用的完整版本。

Sub Combined_Sheets()
    Dim MyFile As String, MyDir As String, Wb As Workbook
    Dim sh As Worksheet, FrNg As Range

    Set Wb = ThisWorkbook

    With Application.FileDialog(msoFileDialogFolderPicker)
        .Show
        MyDir = .SelectedItems(1) & "\"
    End With

    'MyDir = "C:\TestWorkBookLoop\"
    MyFile = Dir(MyDir & "*.xls*")    'change file extension
    ChDir MyDir

    Application.ScreenUpdating = 0
    Application.DisplayAlerts = 0

    Do While MyFile <> ""
        Workbooks.Open (MyFile)

        For Each sh In Sheets

            With sh

                Set FrNg = .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell))
                FrNg.Copy Wb.Worksheets("Consolidated").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)

            End With

        Next sh

        ActiveWorkbook.Close True
        MyFile = Dir()

    Loop

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    相关资源
    最近更新 更多