运行时错误9 - 下标超出范围

时间:2014-10-13 15:39:35

标签: excel vba excel-vba

我正在尝试使用VBA创建基于表单的界面。我遇到了一个我无法弄明白的问题。所以在我的代码中,我尝试创建一个新工作簿然后保存它。之后,它将扫描复选框,看看哪一个被选中。如果它被选中,它将创建一个新工作表并复制预制模板。用户将打开他们想要的另一个工作簿,它会将该工作簿中的信息复制到刚刚创建的工作簿中。以下是检索数据的代码:

Sub mil10_data()

Dim NewWB As Workbook
Dim thisWB As Workbook
Dim wb As Workbook
Dim Ret

Set thisWB = ThisWorkbook
Set NewWB = ActiveWorkbook
With NewWB
    'Copy the pre-made template to new workbook
    thisWB.Sheets("Data 10").Range("A1:AZ3000").Copy NewWB.Sheets(ActiveSheet.Name).Range("A1:AZ3000")

    'Retriving the data
    Ret = Application.GetOpenFilename("Excel Files (*.CSV), *.CSV", Title:="Select File To Be Opened")
    If Ret = False Then Exit Sub
    Set wb = Workbooks.Open(Ret)
    **'This is where the error is show up
    wb.Sheets(ActiveSheet.Name).Range("E21:E2136").Copy NewWB.Sheets(ActiveSheet.Name).Range("C2:C2117")** 
    wb.Close SaveChanges:=False

    Set wb = Nothing
    Set NewWB = Nothing
    End With
End Sub

我认为可能是因为有三个工作簿打开,它不知道哪一个是活动工作簿,但事实并非如此。我使用MsgBox进行了测试,它显示了我想要的正确工作簿和工作名称。如果我将ActiveSheet.Name更改为实际的工作表名称,它可以工作,但我不想使用该方法。我有不同的工作表需要创建,所以我更喜欢使用ActiveSheet.Name。任何人都知道它为什么不起作用?我真的很感激帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

ActiveWorkbookActiveSheet是获取用户输入的笨拙方法。您应该在变量中保存您感兴趣的属性(尽快),然后直接停止引用它们。

在您的情况下,代码可能看起来像

Sub mil10_data()

    Dim NewWB As Workbook
    Dim thisWB As Workbook
    Dim wb As Workbook
    Dim Ret

    Dim active_sheet_name  As String

    Set thisWB = ThisWorkbook
    Set NewWB = ActiveWorkbook
    Let active_sheet_name = Application.ActiveSheet.Name

    With NewWB
        'Copy the pre-made template to new workbook
        thisWB.Sheets("Data 10").Range("A1:AZ3000").Copy NewWB.Sheets(active_sheet_name).Range("A1:AZ3000")

        'Retrieving the data
        Ret = Application.GetOpenFilename("Excel Files (*.CSV), *.CSV", Title:="Select File To Be Opened")
        If Ret = False Then Exit Sub
        Set wb = Workbooks.Open(Ret)
        wb.Sheets(active_sheet_name).Range("E21:E2136").Copy NewWB.Sheets(active_sheet_name).Range("C2:C2117") 
        wb.Close SaveChanges:=False

        Set wb = Nothing
        Set NewWB = Nothing
    End With
End Sub

如果仍然出现“下标超出范围”错误,则表示您在运行脚本之前未正确选择ActiveSheet,或者工作簿中不存在该工作表wb