2015-09-09 72 views
0

我想讓代碼知道數據表有多大,然後對它進行排序。我認爲,一旦我知道表格有多大,我就會聲明一個變量範圍,並告訴Excel首先按變量範圍「Account」,然後「Symbol」和「Quantity」進行排序。按變量排序範圍

問題與對象的ActiveWorkbook.Worksheets("Mutual Funds").Sort.SortFields.Add Key:=Range("Account")...

方法範圍出現」全球失敗是我的錯誤信息。看來,這不是給它一個可變範圍的正確方法。

任何人都知道如何解決這個問題?

Sub Macro1() 
    ' 
ActiveWorkbook.Sheets("Mutual Funds").Activate 
Range("A12").Select 

Do Until IsEmpty(ActiveCell) 
     ActiveCell.Offset(1).Select 
Loop 

ActiveCell.Offset(-1).Select 


Dim Account As Range 
Dim Symbol As Range 
Dim Quantity As Range 
Dim EntireRange As Range 

Set Account = Range(ActiveCell, "A11") 
Set Symbol = Range(ActiveCell.Offset(, 9), "J11") 
Set Quantity = Range(ActiveCell.Offset(, 7), "H11") 
Set EntireRange = Range(ActiveCell, "AS11") 

ActiveWorkbook.Worksheets("Mutual Funds").Sort.SortFields.Clear 
ActiveWorkbook.Worksheets("Mutual Funds").Sort.SortFields.Add Key:=Range("Account"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers 
ActiveWorkbook.Worksheets("Mutual Funds").Sort.SortFields.Add Key:=Range("Symbol"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
ActiveWorkbook.Worksheets("Mutual Funds").Sort.SortFields.Add Key:=Range("Quantity"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 

With ActiveWorkbook.Worksheets("Mutual Funds").Sort 
    .SetRange Range("EntireRange") 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

End Sub 
+0

你可以使用什麼是ActiveWorkbook.Worksheets(「共同基金」)UsedRange.Address來確定數據有多大。我猜測你只需要一個範圍,並想通過某種東西來排序所有數據。爲什麼你要指定多個範圍?你是否需要通過一個以上的穀物進行排序? –

+0

我希望做一個多層次的排序。所以它會按列A和formost排序,但如果有重複的話,它也會對J列進行排序,然後列H –

+0

我不認爲排序功能是這樣的,除非你願意忽略數據例如,如果單元格A1中包含「this」,並且B1中包含「that」,那麼A2中包含「A」,而B2中包含「Z」。如果按A列升序排序並且不包含B列,則它將在單元格A1中具有「A」,並在單元格A2中具有「this」。 B列將保持不變。這個可以嗎? –

回答

0

使用Range("Account")引用一個Range變量是錯誤的。

只需使用Account

其他問題:

  • Key的需要排除的頭,
  • 你的獲得使用範圍是非常低效的方法。

這是你的代碼重構:

Sub Macro1() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim Account As Range 
    Dim Symbol As Range 
    Dim Quantity As Range 
    Dim EntireRange As Range 

    Set wb = ActiveWorkbook 
    Set ws = wb.Sheets("Mutual Funds") 

    With ws 
     Set Account = .Range(.Cells(12, 1), .Cells(12, 1).End(xlDown)) 
    End With 
    Set Symbol = Account.Offset(, 8) 
    Set Quantity = Account.Offset(, 6) 
    Set EntireRange = Account.Offset(-1, 0).Resize(Account.Rows.Count + 1, 45) 

    With ws.Sort ' EntireRange 
     .SortFields.Clear 
     .SortFields.Add Key:=Account, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers 
     .SortFields.Add Key:=Symbol, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .SortFields.Add Key:=Quantity, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 

     .SetRange EntireRange 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

End Sub