我的目标是使自动完成功能对下拉菜单有效,我已经在单个工作表上实现了它,但是将代码复制到其他工作表上却无法正常工作。
我首先在包含下拉列表的初始工作表上创建一个组合框,然后进行了以下更改- 在名称字段中将名称更改为TempCombo 在MatchEntry字段中选择1-fmMatchEntryComplete;
然后我为该工作表插入以下代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Update by Extendoffice: 2017/8/15
Dim xCombox As OLEObject
Dim xStr As String
Dim xWs As Worksheet
Set xWs = Application.ActiveSheet
On Error Resume Next
Set xCombox = xWs.OLEObjects("TempCombo")
With xCombox
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
End With
If Target.Validation.Type = 3 Then
Target.Validation.InCellDropdown = False
Cancel = True
xStr = Target.Validation.Formula1
xStr = Right(xStr, Len(xStr) - 1)
If xStr = "" Then Exit Sub
With xCombox
.Visible = True
.Left = Target.Left
.Top = Target.Top
.Width = Target.Width + 5
.Height = Target.Height + 5
.ListFillRange = xStr
.LinkedCell = Target.Address
End With
xCombox.Activate
Me.TempCombo.DropDown
End If
End Sub
Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
`Shift As Integer)`
Select Case KeyCode
Case 9
Application.ActiveCell.Offset(0, 1).Activate
Case 13
Application.ActiveCell.Offset(1, 0).Activate
End Select
End Sub
此实现非常适合该工作表,但是当我尝试在同一文件的另一个工作表上使用相同的代码时,自动完成功能不起作用。
我尝试将sheet2上的组合框名称修改为TempCombo2,并更改了以下行:
Set xCombox = xWs.OLEObjects("TempCombo")
to
Set xCombox = xWs.OLEObjects("TempCombo2")
即使未引发任何错误,自动完成功能也无法在工作表2上运行。
答案 0 :(得分:0)
这是一个非常有趣的主意,我喜欢它。
通过以下修改,我可以在多张纸上工作:
Cancel = True
,此行引发错误,并且“取消”不是Worksheet_SelectionChange中的参数;我认为这没有任何作用。Set xCombox = xWs.OLEObjects("TempCombo")
更新为Set xCombox = xWs.OLEObjects("TempCombo2")
Me.TempCombo.DropDown
已更新为Me.TempCombo2.DropDown
,因为这是我在第二张工作表上命名的组合框。此外,更改的幅度没有假设的大,它似乎仅适用于ActiveX控件,因此我认为这就是添加新框时要使用的内容。
作为后续,只要组合框在所有工作表上都被命名为“ TempCombo”(您必须在每个工作表上添加一个名为“ TempCombo”的组合框),我就可以使用工作簿模块使它正常工作。按照这种方式,您只需在工作簿模块上只需一次代码,它就会使用每个工作表本地的组合框。
进行测试-在新的工作簿中:使用范围引用将列表验证添加到范围中,在列表范围中添加一些值,在工作表中添加ActiveX组合框,并将其命名为“ TempCombo” ,将以下代码放入工作簿模块中,然后在启用列表验证的范围内的任何位置单击。
请注意,请确保您还没有处于开发人员标签上的设计模式!
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Update by Extendoffice: 2017/8/15
Dim xCombox As OLEObject
Dim xStr As String
Dim xWs As Worksheet
Set xWs = Sh
On Error Resume Next
Set xCombox = xWs.OLEObjects("TempCombo")
With xCombox
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
End With
If Target.Validation.Type = 3 Then
Target.Validation.InCellDropdown = False
'Cancel = True
xStr = Target.Validation.Formula1
xStr = Right(xStr, Len(xStr) - 1)
If xStr = "" Then Exit Sub
With xCombox
.Visible = True
.Left = Target.Left
.Top = Target.Top
.Width = Target.Width + 5
.Height = Target.Height + 5
.ListFillRange = xStr
.LinkedCell = Target.Address
End With
xCombox.Activate
Sh.TempCombo.DropDown
End If
End Sub
Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 9
Application.ActiveCell.Offset(0, 1).Activate
Case 13
Application.ActiveCell.Offset(1, 0).Activate
End Select
End Sub