2012-08-01 89 views
1

我使用Excel中VBA排序的过程,并希望有一个变量组更改为升序或降序,根据条件。 我试过这个,但得到了“类型不匹配”的错误。Excel中的常量排序

If SBF = 0 Then 
    S = "xlAscending" 
Else: S = "xlDescending" 
End If 
ActiveWorkbook.Worksheets(SN(x)).sort.SortFields.Add Key:=Range(_ 
     "B3:B" & last_cell), SortOn:=xlSortOnValues, Order:=S, DataOption:= _ 
     xlSortNormal 
+0

你没有包括在这个版本的变量声明。唯一的问题是围绕xlAscending和xlDescending使用引号。 Excel会将它们解释为字符串,而不是Sort方法所期望的Enumeration值。这假设S是没有Option Explicit的模块中的变体或未声明的变量。 – 2012-08-02 01:26:40

回答

2

这工作:

Public Enumeration, XlSortOrder, instance 

Dim instance As XlSortOrder 
If SBF = 0 Then 
    instance = xlAscending 
Else: instance = xlDescending 
End If 
ActiveWorkbook.Worksheets(SN(x)).sort.SortFields.Add Key:=Range(_ 
    "B3:B" & last_cell), SortOn:=xlSortOnValues, Order:=instance, DataOption:= _ 
    xlSortNormal 
+0

您拥有的代码将无法使用。你已经将Enumeration,XlSortOrder和instance声明为Variant类型的三个变量。然后,您尝试将实例设置为类型XlSortOrder。这会引发错误。 要么使用'公共实例作为XlSortOrder',这将使得该变量的模块之外,或'昏暗的实例作为XlSortOrder'这使得本地的模块(或子取决于在声明) – 2012-08-02 01:34:44

0

xlAscendingxlDescending是Excel的常量。要查看他们只有在立即窗口中打印它们的值。见下面的快照。

enter image description here

所以你其实可以写你的代码

If SBF = 0 Then S = 1 Else S = 2 

ActiveWorkbook.Worksheets(SN(x)).Sort.SortFields.Add _ 
Key:=Range("B3:B" & last_cell), _ 
SortOn:=xlSortOnValues, _ 
Order:=S, _ 
DataOption:=xlSortNormal 

同样的xlSortOnValuesxlSortNormal值是0。如果你愿意,你也可以写上面的代码为

If SBF = 0 Then S = 1 Else S = 2 

ActiveWorkbook.Worksheets(SN(x)).Sort.SortFields.Add _ 
Key:=Range("B3:B" & last_cell), _ 
SortOn:=0, _ 
Order:=S, _ 
DataOption:=0 

编辑

我假设S已被宣布为整数或长,而不是作为一个字符串。

+0

您可以删除常量/枚举值,但我认为他们提供了一个有用的线索,以什么样的代码试图做的,特别是对那些每天谁不代码在VBA或使用特定功能所有的时候。这也意味着在(非常不可能的)事件中值发生了变化,然后它仍然可以工作。 – 2012-08-02 02:29:07

+0

我在这里与你部分同意。就“线索”而言,总是可以对代码进行注释,以便了解这些值的用途。上面的演示是为了表明'xlAscending'和'xlDescending'是常量而不是字符串:) – 2012-08-02 02:34:55