Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在Excel单元格中创建组合框_Vba_Excel_Combobox - Fatal编程技术网

Vba 在Excel单元格中创建组合框

Vba 在Excel单元格中创建组合框,vba,excel,combobox,Vba,Excel,Combobox,我想创建一个选择或下拉列表或组合框(无论你想叫它什么) 我不想使用UserForm,因为它在单元格上显示一个窗口,我希望它在单元格中示例(见图) 我想在组合框中选择PERRO时,单元格显示数字1,如果是GATO单元格显示数字2,如果是VACA单元格显示数字3。除了QHarr在评论中提供的链接,您可以尝试完全VBA解决方案,每次用户选择想要的单元格时,代码都会显示验证列表 为此,您必须: 删除并在每个单元格选择处放回验证规则 用列表中的索引替换列表项 因此,您需要同时处理工作表\u选择更改(

我想创建一个选择或下拉列表或组合框(无论你想叫它什么)

我不想使用UserForm,因为它在单元格上显示一个窗口,我希望它在单元格中示例(见图)


我想在组合框中选择PERRO时,单元格显示数字1,如果是GATO单元格显示数字2,如果是VACA单元格显示数字3。

除了QHarr在评论中提供的链接,您可以尝试完全VBA解决方案,每次用户选择想要的单元格时,代码都会显示验证列表

为此,您必须:

  • 删除并在每个单元格选择处放回验证规则
  • 用列表中的索引替换列表项
因此,您需要同时处理
工作表\u选择更改()
工作表\u更改()
事件处理程序

在“工作表代码”窗格中放置以下代码

Option Explicit

Dim animals As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$2" Then ' if selected cell is the wanted one (change "$B$2" to any wanted address
        Dim element As Variant
        Dim position As Long
        For Each element In animals 'loop through validation list
            position = position + 1 'update index position
            If element = Target.Value Then 'if current loop element matches cell content
                Application.EnableEvents = False 'prevent subsequent sheet change (deleting and writing cell content) fire this event again and start an infinite loop
                Target.Validation.Delete 'remove data validation
                Target.Value = position ' write the element index position
                Application.EnableEvents = True 'restore proper event handling
                Exit For
            End If
        Next
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then ' if selected cell is the wanted one (change "$B$2" to any wanted address
        With Target
            If hasValidation(.Cells) Then
                .ClearContents 'clear any previous cell content
            Else
                animals = Array("Perro", "Gato", "Vaca", "Cerdo") 'set the validation list
                .ClearContents 'clear any previous cell content
                With .Validation 'set validation rules
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(animals, ",")
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
            End If
        End With
    End If
End Sub


Function hasValidation(rng As Range) As Boolean
    On Error Resume Next
    hasValidation = rng.SpecialCells(xlCellTypeSameValidation).Cells.Count = 1
End Function

你有三个选择

  • 如图所示,使用数据验证(数据>数据工具>数据验证),但必须将其与VLOOKUP函数相结合(有点痛苦)

  • 附加一个组合框表单控件(开发者>控件>插入)右键单击并转到格式控件。从这里,您可以指定数字格式的源列表和结果单元格。我的意思是如果选择Perro,因为它是第一个元素,所以结果单元格的值为1。这对我来说是最好的方法

  • 最后,您可以使用组合框ActiveX控件(开发人员>控件>插入),您可以使用AddItem方法从属性窗口或VBA脚本添加元素
  • 例如:

    With ComboBox
      .AddItem "perro"
      .AddItem "gato"
      .AddItem "vaca"
      .AddItem "cerdo"
    End With
    
    您可以创建一个带有条件的结果单元格

    Select Case Combobox.value
      Case "perro": range("a1")=1
      Case "gato": range("a1")=2
      Case "vaca": range("a1")=3
      Case "cerdo": range("a1")=4
    End Select
    

    对于初学者来说,这很容易。

    如果您想将其“放在”单元格中,这就是数据验证。不确定是否可以从给定列表中返回项的索引。这可能是以下内容的重复:获取下拉列表中所选项的数量中的位置参见Doug Glancy的答案您可能只需要使用数据验证下拉列表和查找Excel函数,如
    =Match(A1,{“PERRO”、“GATO”、“VACA”},0)
    @Slai这在同一个单元格中如何工作?我真的很感兴趣,因为我想不出办法。有一个带有匹配公式的帮助列来返回索引,并将数据验证单元格设置为白色字体,这是我所能想到的最好办法。@QHarr我猜1、2、3在另一个公式中使用了。谢谢,第二个选项帮助我轻松地解决了问题。