Excel数据验证组合框单击

时间:2015-02-10 00:03:11

标签: excel vba excel-vba

我对编码很新...

工作表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
'====================================

2 个答案:

答案 0 :(得分:1)

您只需填充活动工作表中的Combobox即可获得大量代码。 由于您使用的是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

答案 1 :(得分:0)

如果您可以放弃根据用户条目进行Excel自动完成的需要,您可以使用此处演示的单元格验证(向后兼容旧版本):

Dependent Drop-down Lists

或者这里(对于较新的版本):

Insert or delete a drop-down list

这样做的好处是它不需要代码,除非您想自动操作列表。

使用组合框对象肯定更复杂,所以你可以跳过它,直到你的编码达到对象所需的复杂性。

<强> == EDIT ==

好的,然后,2件事:每次单击新单元格时,此代码(Private Sub Worksheet_SelectionChange(ByVal Target As Range))都适用。如果您的值没有太大变化,您可以确保cbo仅填充在workbook_open或不太活跃的东西上。但是,如果组合框源数据在工作簿打开时频繁更改,那么频繁刷新源是值得的。

尝试命名您希望组合框从其获取数据的范围,并将ListFillRange指向该命名范围,例如:

.ListFillRange = "myNamedRange"

然后,如果您的源增长或缩小,请合并代码,根据更改重新定义命名范围。