下标超出范围错误-VBA错误

下标超出范围错误-VBA错误,vba,excel,subscript,indexoutofrangeexception,Vba,Excel,Subscript,Indexoutofrangeexception,对于下面的代码,我不断得到超出范围的下标,我是VBA新手,因此非常感谢您的帮助 我试图引用一个包含各种源工作簿的表,并将数据从这里复制到同样包含在稳定范围内的“目标”工作簿 谢谢, 罗南 造成此问题的原因是,当您打开一个新工作簿时,您正在更改活动工作簿的内容,并且默认情况下,您的代码是使用ActiveWorkbook,因为您没有限定工作表集合来说明它们真正引用的工作簿 解决此问题的最简单方法是创建一个引用,该引用在启动代码时处于活动状态: 'Define source(s) and target

对于下面的代码,我不断得到超出范围的下标,我是VBA新手,因此非常感谢您的帮助

我试图引用一个包含各种源工作簿的表,并将数据从这里复制到同样包含在稳定范围内的“目标”工作簿

谢谢, 罗南


造成此问题的原因是,当您
打开一个新工作簿时,您正在更改
活动工作簿
的内容,并且默认情况下,您的代码是使用
ActiveWorkbook
,因为您没有限定
工作表
集合来说明它们真正引用的工作簿

解决此问题的最简单方法是创建一个引用,该引用在启动代码时处于活动状态:

'Define source(s) and target(t) sheets
sTable = "rng_SourceData"

Dim wbTable As Workbook
Set wbTable = ActiveWorkbook

'Shorten some code by using a With block
With wbTable.Worksheets("I.Import").Range(sTable)
    'loop through source table to copy and paste requred data
    sRow = .Rows.Count
    For cRow = 1 To sRow

        sFileName = .Cells(cRow, 1)
        sInputSheet = .Cells(cRow, 2)
        sRange = .Cells(cRow, 3)
        tFileName = .Cells(cRow, 4)
        tRange = .Cells(cRow, 5)
        tSheet = .Cells(cRow, 6)

        'Include all ranges in the input table
        ImportDataSpreadsheet sFileName, sInputSheet, sRange, tSheet, tRange

    Next cRow
End With
由于代码现在总是引用在打开任何其他工作簿之前设置的
wbTable
,因此代码将引用正确的工作表


注意:理论上,我们实际上不需要
wbTable
,我们可以使用

With ActiveWorkbook.Worksheets("I.Import").Range(sTable)

块,但我个人倾向于设置临时对象。

问题的原因是,当您打开新工作簿时,您正在更改什么是
ActiveWorkbook
,默认情况下,您的代码是使用
ActiveWorkbook
,因为您没有限定
工作表
集合来说明它们真正引用的工作簿

解决此问题的最简单方法是创建一个引用,该引用在启动代码时处于活动状态:

'Define source(s) and target(t) sheets
sTable = "rng_SourceData"

Dim wbTable As Workbook
Set wbTable = ActiveWorkbook

'Shorten some code by using a With block
With wbTable.Worksheets("I.Import").Range(sTable)
    'loop through source table to copy and paste requred data
    sRow = .Rows.Count
    For cRow = 1 To sRow

        sFileName = .Cells(cRow, 1)
        sInputSheet = .Cells(cRow, 2)
        sRange = .Cells(cRow, 3)
        tFileName = .Cells(cRow, 4)
        tRange = .Cells(cRow, 5)
        tSheet = .Cells(cRow, 6)

        'Include all ranges in the input table
        ImportDataSpreadsheet sFileName, sInputSheet, sRange, tSheet, tRange

    Next cRow
End With
由于代码现在总是引用在打开任何其他工作簿之前设置的
wbTable
,因此代码将引用正确的工作表


注意:理论上,我们实际上不需要
wbTable
,我们可以使用

With ActiveWorkbook.Worksheets("I.Import").Range(sTable)

块,但我个人倾向于设置该临时对象。

在哪一行出现错误?@ScottCraner我在这一行出现错误:sInputSheet=Worksheets(“I.Import”).Range(稳定)。Cells(cRow,2)当前活动工作簿中是否有名为“I.Import”的工作表?(当
cRow
为1时,它会崩溃吗?或者直到
cRow
为2时才会崩溃?如果它适用于1而不是2,那么错误可能在
importdata电子表格中,这可能会更改活动工作簿。)感谢您指出我的愚蠢错误@YowE3K-我使用了I.Import而不是I.Import(空格)@YowE3K我遇到了另一个问题,希望您能提供帮助:您在哪一行收到错误?@ScottCraner我在这一行收到错误:sInputSheet=Worksheets(“I.Import”)。范围(稳定)。单元格(cRow,2)当前活动工作簿中是否有名为“I.Import”的工作表?(当
cRow
为1时,它会崩溃吗?或者直到
cRow
为2时才会崩溃?如果它适用于1而不是2,那么错误可能在
importdata电子表格中,这可能会更改活动工作簿。)感谢您指出我的愚蠢错误@YowE3K-我使用了I.Import而不是I.Import(空格)@YowE3K我遇到了另一个问题,我希望您能提供帮助: