excel - 无法合并具有相同工作表名称的 Excel 文件
问题描述
我对 VB 编码很陌生,正在尝试合并 Excel 电子表格,然后将数据合并到一个电子表格中。在遇到具有相同工作表名称的文件之前,我发现此代码运行良好。
Sub MergeExcelFiles()
Dim fnameList, fnameCurFile As Variant
Dim countFiles, countSheets As Integer
Dim wksCurSheet As Worksheet
Dim wbkCurBook, wbkSrcBook As Workbook
fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)
If (vbBoolean <> VarType(fnameList)) Then
If (UBound(fnameList) > 0) Then
countFiles = 0
countSheets = 0
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set wbkCurBook = ActiveWorkbook
For Each fnameCurFile In fnameList
countFiles = countFiles + 1
Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)
For Each wksCurSheet In wbkSrcBook.Sheets
countSheets = countSheets + 1
wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
Next
wbkSrcBook.Close SaveChanges:=False
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Processed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
End If
Else
MsgBox "No files selected", Title:="Merge Excel files"
End If
End Sub
运行此代码时,我得到一个
运行时错误“1004”:无法将工作表重命名为与另一个工作表、引用的对象库或 Visual Basic 引用的工作簿相同。
我需要帮助在导入工作表时重命名它们。
解决方案
在 Excel2016 中无法重新创建此问题,因为 Excel 会自动将“(1)”、“(2)”... 添加到与复制工作表同名的工作表名称中。
如果您使用的是旧版本的 Excel,则解决此问题需要重新创建此行为。
要重命名工作表,我参考了这个答案:Excel rename sheet with if sheet name already exists
创建一个新函数来检查两个工作簿中的工作表名称:
Private Function VerifySheetName(ByVal sourceWorkbook As Workbook, ByVal targetWorkbook As Workbook, ByVal sheetName As String) As String
Dim combinedSheets As New Collection
Dim tempSheet As Worksheet
For Each tempSheet In sourceWorkbook.Sheets
combinedSheets.Add tempSheet
Next tempSheet
For Each tempSheet In targetWorkbook.Sheets
combinedSheets.Add tempSheet
Next tempSheet
For Each tempSheet In combinedSheets
If tempSheet.Name = sheetName Then
VerifySheetName = sheetName & "_" & combinedSheets.Count
End If
Next tempSheet
End Function
在循环中调用此函数:
For Each wksCurSheet In wbkSrcBook.Sheets
tempSheetName = VerifySheetName(wbkSrcBook, wbkCurBook, wksCurSheet.Name)
If Not wksCurSheet.Name = tempSheetName Then
wksCurSheet.Name = tempSheetName
End If
countSheets = countSheets + 1
wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
Next
如果你正在使用,不要忘记添加新的变量声明Option Explicit
(你应该!)
Dim tempSheetName As String
PS 在同一行中启动多个变量时,如果省略变量类型,默认情况下将其转换为变体:
Dim countFiles, countSheets As Integer
在这种情况下,countFiles 是变体类型,而 countSheets 是整数类型。如果需要显式变量类型,则需要为每个变量分配类型:
Dim countFiles as Integer, countSheets As Integer
推荐阅读
- java - 如何记录提供另一种类型(MyClass 与 String)的 Rest 参数?
- javascript - 在模块 ExpoDocumentPicker 上执行导出的方法 getDocumentAsync 时发生异常
- python - 如何使用 Selenium 和 Python 从元素中检索值 355.60
- c# - 子网站的 IdentityServer 身份验证
- python - tkinter 进度条不匹配“for i”迭代
- android - HMS中TimeAwareness中getTimeCategories()返回整数数组的顺序是什么
- google-sheets - Google 表格 - 比较 2 (4) 列
- r - 对大型栅格进行算术运算的最快方法
- typescript - 为对象动态属性赋值时理解 TS 错误(哪个键来自联合类型)
- python - 替换列表中的项目