我对编码很新...
工作表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 :(得分: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自动完成的需要,您可以使用此处演示的单元格验证(向后兼容旧版本):
或者这里(对于较新的版本):
Insert or delete a drop-down list
这样做的好处是它不需要代码,除非您想自动操作列表。
使用组合框对象肯定更复杂,所以你可以跳过它,直到你的编码达到对象所需的复杂性。
<强> == EDIT == 强>
好的,然后,2件事:每次单击新单元格时,此代码(Private Sub Worksheet_SelectionChange(ByVal Target As Range))都适用。如果您的值没有太大变化,您可以确保cbo仅填充在workbook_open或不太活跃的东西上。但是,如果组合框源数据在工作簿打开时频繁更改,那么频繁刷新源是值得的。
尝试命名您希望组合框从其获取数据的范围,并将ListFillRange指向该命名范围,例如:
.ListFillRange = "myNamedRange"
然后,如果您的源增长或缩小,请合并代码,根据更改重新定义命名范围。