2012-08-01 64 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