2015-02-10 49 views
0

我是很新的編碼...Excel數據驗證組合框點擊

表1進行了滾動列表我的數據驗證它,片2具有它從驗證數據的列表。我試圖在表單1上創建一個組合框,在您輸入時自動填充,而不必輸入確切的名稱。下面的代碼僅適用於數據列表與我嘗試打開組合框的工作表位於同一張紙上的情況。任何想法如何更改代碼,以便從所有數據列表所在的工作表2中提取出來?

任何幫助,將不勝感激

'========================================= 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim str As String 
Dim cboTemp As OLEObject 
Dim ws As Worksheet 
Set ws = ActiveSheet 
On Error GoTo errHandler 

If Target.Count > 1 Then GoTo exitHandler 

Set cboTemp = ws.OLEObjects("TempCombo") 
    On Error Resume Next 
If cboTemp.Visible = True Then 
    With cboTemp 
    .Top = 10 
    .Left = 10 
    .ListFillRange = "" 
    .LinkedCell = "" 
    .Visible = False 
    .Value = "" 
    End With 
End If 

    On Error GoTo errHandler 
    If Target.Validation.Type = 3 Then 
    'if the cell contains a data validation list 
    Application.EnableEvents = False 
    'get the data validation formula 
    str = Target.Validation.Formula1 
    str = Right(str, Len(str) - 1) 
    With cboTemp 
     'show the combobox with the list 
     .Visible = True 
     .Left = Target.Left 
     .Top = Target.Top 
     .Width = Target.Width + 15 
     .Height = Target.Height + 5 
     .ListFillRange = ws.Range(str).Address 
     .LinkedCell = Target.Address 
    End With 
    cboTemp.Activate 
    'open the drop down list automatically 
    Me.TempCombo.DropDown 
    End If 

exitHandler: 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
    Exit Sub 
errHandler: 
    Resume exitHandler 

End Sub 
'==================================== 
'Optional code to move to next cell if Tab or Enter are pressed 
'from code by Ted Lanham 
'***NOTE: if KeyDown causes problems, change to KeyUp 

Private Sub TempCombo_KeyDown(ByVal _ 
     KeyCode As MSForms.ReturnInteger, _ 
     ByVal Shift As Integer) 
    Select Case KeyCode 
     Case 9 'Tab 
      ActiveCell.Offset(0, 1).Activate 
     Case 13 'Enter 
      ActiveCell.Offset(1, 0).Activate 
     Case Else 
      'do nothing 
    End Select 
End Sub 
'==================================== 
+0

如果問題僅僅是第二個工作表,您可能會使用Workbook作用域的命名範圍。說'Name'和'= Name'作爲驗證列表的來源。 – pnuts 2015-02-10 00:39:30

回答

0

如果你可以放棄,需要根據用戶的進入讓Excel自動完成,可以使用如下證明(與舊版本向後兼容),電池驗證:

Dependent Drop-down Lists

或者這裏(較新版本):

Insert or delete a drop-down list

這樣做的好處是不需要代碼,除非您想自動操作列表。

使用組合框對象肯定是比較複雜的,所以你可以直接跳過,直到你的編碼達到了對象所需的複雜度。

== ==編輯

OK的話,兩件事情:該代碼(私人小組Worksheet_SelectionChange(BYVAL目標作爲範圍))適用於你點擊一個新的細胞每次。如果你的值沒有太大的改變,你可以確保cbo只填充在workbook_open上,或者不活躍的東西。但是,如果組合框源數據在工作簿打開時頻繁更改,則頻繁刷新源代碼是值得的。

嘗試命名你想要的範圍內,組合框從中獲取其數據和指向ListFillRange到命名的範圍,如:

.ListFillRange = "myNamedRange" 

然後,如果你的源增大或縮小,包括重新定義命名代碼範圍基於變化。

+0

是的,我理解簡單的驗證,但是我擁有的列表是400+,所以每次都是一種痛苦。這就是爲什麼我試圖找出一種方式讓它在輸入時自動填充。 – 2015-02-10 00:22:24

1

您有很多代碼只是在活動工作表中填充組合框。 由於您正在使用Worksheet_Change事件,因此您不必將工作表設置爲活動工作表,它已經是。 此示例代碼將使用Sheet2的一系列單元格填充ComboBox1, 代碼和Combobox1位於Sheet1中。

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim ws As Worksheet, Rws As Long, Rng As Range 
    'ComboBox1 and this code are in Sheet1 
    Set ws = Sheets("Sheet2") 'sheet2 column 1 is the list to populate Combobox1 

    With ws 'set the list range 
     Rws = .Cells(Rows.Count, "A").End(xlUp).Row 
     Set Rng = .Range(.Cells(1, 1), .Cells(Rws, 1)) 
    End With 

    With ComboBox1 'populate the combobox 
     .Clear 
     .List = Rng.Value 
    End With 

End Sub