繁体   English   中英

Excel中工作表的自动完成代码在使用VB的其他工作表中不起作用

[英]Autocomplete code for a worksheet in Excel not working in other worksheets using VB

我的目标是使下拉列表的自动填充功能处于活动状态,并且我已经在单个工作表上实现了自动完成功能,但是将代码复制到其他工作表上却无法正常工作。

我首先在包含下拉列表的初始工作表上创建一个组合框,然后进行了以下更改-在“名称”字段中将名称更改为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上运行。

我喜欢这是一个非常有趣的想法。

经过以下修改,我可以使它在多张纸上工作:

  • 删除Cancel = True ,此行引发了错误,并且Cancel不是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM