我有一个包含多个标签的Excel文件。我有一个工作表,其中包含一些工作正常的代码。此代码还引用某些“主”选项卡上的数据。我需要复制这个表,所以我将常用功能从那里移到了一个模块。现在,我在尝试访问同一工作表上的范围时收到VBA 1004
错误。
Dim selectedRange As Range
Set selectedRange = Worksheets(name).Range("A1", _
Range("A" & Rows.count).End(xlUp)) 'Error Line
此代码工作正常,直到我将其移动到模块。如果我放一个
就可以了Worksheets(name).Select
之前,但我必须做太多次。基于此查询:VBA error 1004 - select method of range class failed
没有.Select
,代码应该可以正常工作。只要代码在工作表中,它就会发生。为什么将代码移动到模块会产生问题?
答案 0 :(得分:1)
使用不带对象限定符的范围和行属性。在没有对象限定符的情况下使用时,此属性是 ActiveSheet.Range / ActiveSheet.Rows的快捷方式。
所以代码执行此操作:
Worksheets(Name).Range("A1", ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp))
但是,工作表(名称)可能与活动工作表不同,因此更好:
Worksheets(Name).Range("A1", Worksheets(Name).Range("A" & Worksheets(Name).Rows.Count).End(xlUp))
With With-End With block:
With Worksheets(name)
Set selectedRange = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
End With
因此确保Range / Rows属性应用于Worksheets(name)工作表对象。
答案 1 :(得分:0)
当您在工作表上执行操作时,您实际上不需要对该工作表进行显式声明。
但是,在处理模块并与其他工作表交互时,您需要指定要使用的工作表。因此选择表格,然后才能选择范围。要说,在你选择孩子之前选择父母:) 请注意,以下只是逻辑解释。不是确切的代码语法。
因此,我建议您创建以下工作表变量,并将您需要的工作表对象设置为该变量。
e.g。
Dim WS as Worksheet
Dim selectedRange As Range
Set WS = Sheets("Shee1")
Set selectedRange = WS.Range("A1", _
Range("A" & Rows.count).End(xlUp)) 'Error Line
否则,如果您想引用所有工作表,您可以使用每个工作表的索引
E.g。 ThisWorkBook.Sheets(i) 'i is an integer
然后循环或任何它认为你的程序结构。
此外,您不必在工作表上使用Select
指向该工作表中的范围。根据上面的代码,您可以设置工作表并设置您需要处理的范围。优化VBA执行时,select
通常是禁忌。此外,Excel 2007不会像旧版本那样保留活动工作表。