2011-09-27 184 views
1

我是VBA新手,雖然我在Visual Basic中有一些經驗。 我有一個Microsoft Excel 2010工作表。第29行具有表格的標題,數據來自第30行,依此類推。這張表有20列。Ms Excel VBA:設置排序組合框

我試圖在三個選項中插入一個組合在這個Worksheet中,所以當你選擇第一個時,它將按照列R和列S對所有表應用遞減排序。如果你選擇第二個,它將根據列S和列R進行降序排序。如果您選擇第一個,則將按列A進行降序排序。 列S和列R將被隱藏。 我希望你們能幫助我。謝謝你,我的英語很抱歉。

回答

2

只是把一個圖片的話,我假設你有一個Excel工作表,看起來像這樣類似:

Initial ScreenShot of Worksbook

(保持柱S和R在這個例子中可見)

你想要添加一個組合框,將根據組合框中選擇的值對列進行排序,如下所示:

  • Opt離子1:降序對R列,則S
  • 選項2:降序對列S,則R
  • 選項3:降序A列

第一件事,如果您還沒有這樣做,請添加Developer Tab to Excel

接下來,將表格中的單元格放在命名範圍中。如果此表中的行將發生更改,請確保您創建了dynamic named range。 (動態指定範圍是有點棘手,但對於動態數據非常有用)

通過單擊插入從開發選項卡並選擇組合框從添加組合框表單控件注:的的ActiveX組合框是一個完全不同類型的控制你可以用它來相同的結果,但代碼會有所不同)

將工作表上的組合框的地方:。 Add combo box

現在將選項值添加到組合中。您應該在工作簿中的某個位置爲組合框添加值(例如Sheet2,單元格A1,A2 & A3)。

Combo box values

返回到您的工作表所在的表和組合框住。用鼠標右鍵單擊組合框,然後選擇格式控制

enter image description here

輸入範圍範圍應包含您的排序選項細胞。它看起來像這樣:Sheet2的$ A $ 1:$ A $ 3

再次右鍵單擊組合框,然後選擇指定宏。給宏的名稱,並把宏在當前工作簿

Macro

單擊新建。您將被帶到Visual Basic編輯器。

在這裏,你可以申請您的排序代碼:

Option Explicit 

    Sub DropDown2_Change() 
     Dim comboValue As String 
     Dim Key1ColumnIndex As Integer 
     Dim Key2ColumnIndex As Integer 

     'You can get the name by doing something like this in the immediate window: "? Sheet1.Shapes(1).OLEFormat.Object.Name" 
     comboValue = Sheet1.Shapes("Drop Down 2").ControlFormat.List(Sheet1.Shapes("Drop Down 2").ControlFormat.ListIndex) 

     Select Case comboValue 

      Case "Option1" 
       Key1ColumnIndex = 18 
       Key2ColumnIndex = 19 
      Case "Option2" 
       Key1ColumnIndex = 19 
       Key2ColumnIndex = 18 
      Case "Option3" 
       Key1ColumnIndex = 1 
       Key2ColumnIndex = 1 
     End Select 


     Range("DataValues").Sort Key1:=Range("DataValues").Cells(1, Key1ColumnIndex), _ 
           Order1:=xlDescending, Header:=xlNo, DataOption1:=xlSortNormal, _ 
           Key2:=Range("DataValues").Cells(1, Key2ColumnIndex), order2:=xlDescending 
    End Sub 

現在應該會好到哪裏去。如果您需要一個實例,請查看我創建的示例表here;請注意,它沒有表格的動態名稱範圍。

+0

謝謝@ ray023這非常有幫助。還有一個問題。我想在一個模板中定義這個宏,以便第三方應用程序用不同數量的數據填充多張表單併爲表單設置個性化名稱。如果你不知道你得到了多少數據,你將如何處理數據範圍?您如何在同一工作簿中爲幾張紙做這項工作?再次感謝! – Jorge

+0

我將不得不提出更多問題以給出完整答案。一般情況下,如果模式不改變(例如名爲「Customers」的工作表將始終存在且列不會更改),那麼您的預定義動態範圍應該可以工作。如果你想深入研究,你可以創建基於被導入的數據的動態範圍,但這更適合於一個新的問題而不是評論。另外,如果可能的話(我知道我們並不總是被賦予這種奢侈),我會考慮將數據放入數據庫(例如Access);更簡單的方法來維護數據。 – ray