.设置范围问题 - 不允许公式?



我有一个与本例中讨论类似的问题。

其实我的更简单。

我的VBA代码检查列中最后使用的行,然后定义排序范围。

Dim LastRow As Long
Dim KeyR As Range
LastRow = ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row
Set KeyR = ActiveWorkbook.Worksheets("Summary_Cost").Range("E10:AS" & LastRow)

KeyR.Select
ActiveWorkbook.Worksheets("Summary_Cost").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Summary_Cost").Sort.SortFields.Add _
Key:=Range("E10:AS" & LastRow), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Summary_Cost").Sort
.SetRange = Range("E10:AS" & LastRow)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

出于某种原因,我的 Excel (Office 365( 给了我一条我不明白的错误消息 #438。并且总是在.设置范围表达式。似乎我的 Excel 不允许在这里使用任何公式 - 而我发现了许多相反的例子,就像这里讨论的那样。

任何提示都受到高度赞赏。谢谢!乐

With ActiveWorkbook.Worksheets("Summary_Cost").Sort
.SetRange = Range("E10:AS" & LastRow)

此处的With块持有的Sort对象属于ActiveWorkbook.Worksheets("Summary_Cost")工作表对象,并且期望在同一工作表上被赋予Range

.SetRange = Range("E10:AS" & LastRow)

有关范围和标识符解析在 VBA 中如何工作的更多详细信息,请参阅此答案,但长话短说(假设代码是在标准过程模块中编写的(,这里的Range成员调用是针对一个恰当命名为[_Global]隐式全局对象进行的,该对象动态(在运行时(获取当前ActiveSheet是什么, 并调用其Range成员。

如果在工作表模块中编写完全相同的代码,则Range成员调用现在解析为Me.Range,因此Sheet1.Range它是否在Sheet1模块中,或者Sheet2.Range是否在Sheet2模块中。

虽然隐式代码表面上看起来"对初学者友好"(看,代码太少了,太简单了!(,但它很快就会变得混乱和容易出错:有太多的隐式代码正在进行,读者/维护者无法仅从代码中正确推断发生了什么。

解决方案是始终明确您正在使用哪些Worksheet对象 - 我们可以通过声明(和使用(Worksheet局部变量来做到这一点:

Dim summarySheet As Worksheet
Set summarySheet = ActiveWorkbook.Worksheets("Summary_Cost")
With summarySheet.Sort
.SetRange = summarySheet.Range("E10:AS" & lastRow)

现在,代码不再隐式引用活动工作表。

橡皮鸭有一个检查可以警告你这一点。(<~我的网站和宠物开源项目:)

。现在,这不会按原样编译,因为SetRange是一个方法,而不是一个属性- 赋值运算符右侧的内容需要成为成员调用的参数,如下所示:

With summarySheet.Sort
.SetRange summarySheet.Range("E10:AS" & lastRow)

当对对象进行后期绑定成员调用,并且对象没有该成员时,会发生错误 438;由于=运算符,VBA 正在查找名为SetRangeProperty Let成员(根据用于调用该成员的语法(,但找不到它。如果没有=运算符,它将查找具有该名称的Sub过程。

当你处理一个Worksheet声明的局部变量时,问题从运行时移动到编译时(这更好!(,因为ActiveWorkbook.Worksheets("Summary_Cost")返回一个Object,而不是一个Worksheet- 所以任何链式成员调用的解析都推迟到运行时(这是隐式的后期绑定(。

使用局部Worksheet变量,编译器能够发现=运算符使代码尝试执行它无法执行的操作。

最新更新