【问题标题】:Runtime Error 9 - Subscript Out Of Range运行时错误 9 - 下标超出范围
【发布时间】:2015-02-10 06:28:40
【问题描述】:

我正在尝试使用 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。有谁知道为什么它不起作用?我非常感谢您的帮助。谢谢!

【问题讨论】:

  • 你想用这条线wb.Sheets(ActiveSheet.Name)实现什么?您要引用哪个ActiveSheet?也许您需要完全限定要使用哪个ActiveSheet?也许wb.ActiveSheet.Name
  • wb.Sheets(ActiveSheet.Name) 是指用户打开的文件,在该文件中将提取信息并将其粘贴到NewWB.Sheets(ActiveSheet.Name)

标签: vba excel


【解决方案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

【讨论】:

  • 它正在工作。显然wb.Sheet 需要使用ActiveSheet.Name 才能工作。谢谢!
  • @CynthiaThen 很高兴我能帮上忙。但是,原始代码中有一点很奇怪:为什么要关闭 wb 而不保存更改?
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多