下标超出范围错误 - 组合工作表

时间:2017-03-07 06:40:04

标签: excel vba

我有多个工作表,其工作表名为' SUMMARY-F'。我需要将这些工作表合并到一个工作簿中,并使用以下代码:

Sub CopySheets1()
Dim wkb As Workbook
Dim sWksName As String

sWksName = "SUMMARY-F"
For Each wkb In Workbooks
    If wkb.Name <> ThisWorkbook.Name Then
        wkb.Worksheets(sWksName).Copy _
          Before:=ThisWorkbook.Sheets(1)
    End If
Next
Set wkb = Nothing


End Sub

代码完美地工作了4次但是现在当我运行它时,我得到一个超出范围的下标错误9.有关如何解决此问题的任何提示吗?

谢谢, 辛达

1 个答案:

答案 0 :(得分:0)

如果您打开的工作簿不包含名为SUMMARY-F的工作表,那么您将收到超出范围的错误,因为Excel无法找到具有指定的工作表名称。如果您已使用PERSONAL.xlsm记录宏,则此错误也适用于隐藏的工作簿。

当打开的工作簿没有名为SUMMARY-F的工作表时,您应该在代码中包含一个检查来处理这种情况。

请参阅此问题,提供有关如何识别工作表是否存在的选项,例如定义可以从代码中首先调用的函数:

How to check whether certain sheets exist or not in Excel-VBA?

您只需要修改它以检查另一个工作簿中的工作表,例如:

Public Function CheckSheet(ByVal sWB As String, ByVal sSheetName As String) As Boolean

Dim oSheet As Excel.Worksheet
Dim bReturn As Boolean

For Each oSheet In Workbooks(sWB).Sheets

    If oSheet.Name = sSheetName Then

        bReturn = True
        Exit For

    End If

Next oSheet

CheckSheet = bReturn

End Function

然后您可以在代码中添加一个检查:

Sub CopySheets1()
Dim wkb As Workbook
Dim sWksName As String

sWksName = "SUMMARY-F"
For Each wkb In Workbooks
    If wkb.Name <> ThisWorkbook.Name Then
        If CheckSheet(wkb.Name,sWksName)
            wkb.Worksheets(sWksName).Copy Before:=ThisWorkbook.Sheets(1)
        End If
    End If
Next
Set wkb = Nothing


End Sub