修改录制的宏,自定义排序顺序

时间:2018-04-05 05:36:30

标签: excel vba excel-vba

我需要一张桌子的自定义排序顺序 排序顺序取决于字体颜色。

首先记录自定义排序顺序的宏:

Application.AddCustomList ListArray:=Array("onsdag", "torsdag", "fredag", _
    "lördag", "söndag", "måndag", "tisdag") ' wednsday -> tuesday sort order
ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Add Key:=Range("A2:A5031") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Add Key:=Range("I2:I5031") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
    "onsdag,torsdag,fredag,lördag,söndag,måndag,tisdag", DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("SAP 1").Sort
    .SetRange Range("A1:I5031")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

上面的代码完成了它应该做的事情 然后为了使自定义排序顺序更加自定义,我尝试了这段代码:

shtD = "Data 1703"

If Sheets(shtD).Range("V3").Font.Color = vbGreen Then
    ordn = "måndag,tisdag,onsdag,torsdag,fredag,lördag,söndag" ' Monday -> Sunday
    Application.AddCustomList ListArray:=Array("måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag", "söndag") 

ElseIf Sheets(shtD).Range("W3").Font.Color = vbGreen Then
    ordn = "tisdag,onsdag,torsdag,fredag,lördag,söndag, måndag" ' Tuesday -> Monday
    Application.AddCustomList ListArray:=Array("tisdag", "onsdag", "torsdag", "fredag", "lördag", "söndag", "måndag")

ElseIf Sheets(shtD).Range("X3").Font.Color = vbGreen Then
    ordn = "onsdag,torsdag,fredag,lördag,söndag,måndag,tisdag"
    Application.AddCustomList ListArray:=Array("onsdag", "torsdag", "fredag", "lördag", "söndag", "måndag", "tisdag")

ElseIf Sheets(shtD).Range("Y3").Font.Color = vbGreen Then
    ordn = "torsdag,fredag,lördag,söndag,måndag,tisdag,onsdag"
    Application.AddCustomList ListArray:=Array("torsdag", "fredag", "lördag", "söndag", "måndag", "tisdag", "onsdag")

ElseIf Sheets(shtD).Range("Z3").Font.Color = vbGreen Then
    ordn = "fredag,lördag,söndag,måndag,tisdag,onsdag,torsdag"
    Application.AddCustomList ListArray:=Array("fredag", "lördag", "söndag", "måndag", "tisdag", "onsdag", "torsdag")

ElseIf Sheets(shtD).Range("AA3").Font.Color = vbGreen Then
    ordn = "lördag,söndag,måndag,tisdag,onsdag,torsdag,fredag"
    Application.AddCustomList ListArray:=Array("lördag", "söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag")

ElseIf Sheets(shtD).Range("AB3").Font.Color = vbGreen Then
    ordn = "söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag"
    Application.AddCustomList ListArray:=Array("söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag")

Else
    Exit Sub
End If

Application.ScreenUpdating = False
Sheets("SAP 1").Visible = xlSheetVisible
Sheets("SAP 1").Activate


ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Add Key:=Range("A2:A5031") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Add Key:=Range("I2:I5031") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
    ordn, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("SAP 1").Sort
    .SetRange Range("A1:I5031")
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

简而言之,我首先创建CustomOrder字符串和Application.AddCustomList ListArray,然后将其应用于录制的宏。
但我得到错误13,这一行不兼容的类型:
ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Add Key:=Range("I2:I5031"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=ordn, DataOption:=xlSortNormal

当我打开对话框手动执行自定义排序顺序时,似乎没有保存自定义顺序。我只能看到录制宏时手动创建的那个 谁知道问题是什么?

2 个答案:

答案 0 :(得分:1)

CustomOrder参数需要Variant,因此请使用CVar()将String投射到Variant

ActiveWorkbook.Worksheets("SAP 1").Sort.SortFields.Add Key:=Range("I2:I5031") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
cVar(ordn), DataOption:=xlSortNormal

答案 1 :(得分:0)

查看以下网站。在您所描述的自定义顺序中,您似乎面临变量问题 https://explorationsintoexcel.wordpress.com/2016/11/06/set-custom-sort-order-from-range-values-in-excel-vba/

似乎不可能只输入没有引号的变量,但你可以通过使用多个引号和&来规避它。输入变量:

CustomOrder:=""" & ordn & """