【发布时间】: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 <> "Consolidated" Then wks.Delete这条线。由于For Each wks In Worksheets不是完全限定的,它可能引用了错误的工作簿并且无法找到“合并”工作表,因此试图删除所有工作表:)