我有一个与本例中讨论类似的问题。
其实我的更简单。
我的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 正在查找名为SetRange
的Property Let
成员(根据用于调用该成员的语法(,但找不到它。如果没有=
运算符,它将查找具有该名称的Sub
过程。
当你处理一个Worksheet
声明的局部变量时,问题从运行时移动到编译时(这更好!(,因为ActiveWorkbook.Worksheets("Summary_Cost")
返回一个Object
,而不是一个Worksheet
- 所以任何链式成员调用的解析都推迟到运行时(这是隐式的后期绑定(。
使用局部Worksheet
变量,编译器能够发现=
运算符使代码尝试执行它无法执行的操作。