Excel VBA订阅超出范围

时间:2018-04-16 14:18:46

标签: excel vba

我只有2条简单的行,Excel VBA一直告诉我订阅超出范围......为什么?

Sub try_again()

'Dim res As Variant
Dim Per_Mnd As Variant
Dim Per_Mnd2 As Variant

Per_Mnd = Worksheets("Res_Lege").Range("F41:AD41")

Worksheets("Res_Kontor_over").Range("F6:AD6").Value = Per_Mnd

End Sub

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

Set Per_Mnd = Worksheets("Res_Lege").Range("F41:AD41")
Worksheets("Res_Kontor_over").Range("F6:AD6").Value = Per_Mnd.Cells(1, 1)

Set - s Per_MndRange,因此应该有效。然后,当您要求将值放在Range("F6:AD6")中时,它会占用Per_Mnd的第一个单元格并将其分配到那里。

答案 1 :(得分:0)

那将是下标超出范围,但从不关注错字,Rubberduck(免责声明:我拥有/管理这个开源项目)会在此处触发检查结果:< / p>

Per_Mnd = Worksheets("Res_Lege").Range("F41:AD41")

另一个在这里:

Worksheets("Res_Kontor_over").Range("F6:AD6").Value = Per_Mnd

检查结果会说:

  

隐式活动工作簿参考

     

对活动工作簿的隐式引用会使代码变得脆弱且难以调试。考虑在预期时使这些引用显式化,并且更喜欢处理对象引用。

换句话说,如果您100%确定工作表名称中没有拼写错误,那么看起来ActiveWorkbook不是您的代码[隐式]假设的工作簿。

即此代码完全等效:

Per_Mnd = ActiveWorkbook.Worksheets("Res_Lege").Range("F41:AD41").Value

如果您打算使用您的代码已打开的工作簿,请确保在打开它时保留对该对象的引用:

{ {2}}

如果您要使用包含此代码的工作簿,请使用Dim wb As Excel.Workbook Set wb = Application.Workbooks.Open(path) '... 'now qualify the Worksheets collection with this 'wb' object: Per_Mnd = wb.Worksheets("Res_Lege").Range("F41:AD41") 限定Worksheets来电:

ThisWorkbook

如果工作表在编译时存在,给它一个代码名称属性工具窗口/ F4中的Per_Mnd = ThisWorkbook.Worksheets("Res_Lege").Range("F41:AD41") 属性)而不是 - (Name)

ResLegeSheet