1

我有一个带有多个选项卡的 Excel 文件。我有一个工作表,其中包含一些运行良好的代码。此代码还引用了某些“主”选项卡上的数据。我需要复制这张表,所以我将常用功能从那里移到了一个模块中。现在我1004在尝试访问同一个工作表上的范围时收到 VBA 错误。

 Dim selectedRange As Range
 Set selectedRange = Worksheets(name).Range("A1", _
 Range("A" & Rows.count).End(xlUp)) 'Error Line

这段代码运行良好,直到我将它移到一个模块中。如果我放一个

Worksheets(name).Select 

在它之前,但我将不得不这样做太多次。基于此查询:VBA 错误 1004 - 范围类 的选择方法失败代码应该可以在没有.Select. 只要代码在工作表中,它就可以。为什么将代码移动到模块会产生问题?

4

2 回答 2

1

U 使用没有对象限定符的 Range 和 Rows 属性。在没有对象限定符的情况下使用时,此属性是ActiveSheet.Range / ActiveSheet.Rows 的快捷方式。

所以代码是这样做的:

Worksheets(Name).Range("A1", ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp))

但是 Worksheets(name) 可能与活动工作表不同,所以更好的是:

Worksheets(Name).Range("A1", Worksheets(Name).Range("A" & Worksheets(Name).Rows.Count).End(xlUp))

在 With-End With 块中:

With Worksheets(name)
      Set selectedRange = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
End With

因此可以确保 Range/Rows 属性应用于 Worksheets(name) 工作表对象。

于 2012-11-28T11:31:30.910 回答
0

当您在工作表上执行操作时,您实际上并不需要对该工作表进行显式声明。

但是,在处理模块并与其他工作表交互时,您需要指定要使用的工作表。因此,在选择范围之前选择工作表。要说,在选择孩子之前先选择父母 :)请注意,以下只是逻辑解释。不是确切的代码语法。

所以我建议您创建以下工作表变量并将您需要的工作表对象设置到其中。

例如

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

否则,如果您想引用所有工作表,您可以使用每个工作表的索引

例如ThisWorkBook.Sheets(i) 'i is an integer ,然后循环或它认为对您的程序结构的任何内容。

此外,您不必Select 在工作表上使用来指向该工作表中的范围。根据上面的代码,您可以设置工作表并设置您需要处理的范围。在优化 VBA 执行时,select通常是一个禁忌。此外,Excel 2007 不会像旧版本那样保留活动工作表。

于 2012-11-28T06:31:04.707 回答