【问题标题】:Userform combobox take first value only - Excel VBA用户表单组合框仅采用第一个值 - Excel VBA
【发布时间】:2015-11-23 17:05:25
【问题描述】:

我设置了一个包含 ComboBox 的用户表单。 ComboBox 填充了来自动态命名范围“List1”的值..一切都很好..当我从列表中选择第一个值时,它可以工作并且我可以完成我的任务..但是当我从列表中选择另一个值时该值消失,组合框值变为空.. 这是代码:

Private Sub ComboBox1_Change()
ComboBox1.RowSource = "'[" & ActiveWorkbook.Name & "]DATA'!List1"
ComboBox1.DropDown
Worksheets("TEMP").Range("A3").Value = ComboBox1.Value
End Sub

谁能给我一个解决方案..

更新: 我按照本教程中的说明进行操作..但我是在用户表单中进行的: http://trumpexcel.com/2013/10/excel-drop-down-list-with-search-suggestions

【问题讨论】:

  • 通常您从 Initialize 事件填充组合框。然后在更改事件中执行一些操作。您不会使用相同的列表重新填充相同的组合框。每次你改变它。
  • 您的动态名称的公式可能有问题吗?
  • 问题在于动态范围公式。
  • =DATA!$D$4:INDEX(Table1[H3];MAX(Table1[H2]);1)
  • 这是公式..请帮我改一下..

标签: vba excel combobox


【解决方案1】:

我无法让它在单元格 A3 中显示为空白 - 一切正常,但我必须在组合框中键入才能显示值(即触发更改事件)。还可以尝试将ActiveWorkbook 更改为ThisWorkbook(包含代码的书)。

第一次打开表单时尝试填充组合框:

Private Sub UserForm_Initialize()
    ComboBox1.RowSource = "'[" & ActiveWorkbook.Name & "]DATA'!List1"
End Sub

Private Sub ComboBox1_Change()
    Worksheets("TEMP").Range("A3").Value = ComboBox1.Value
End Sub

【讨论】:

  • 不幸的是它不起作用..仍然当我从列表中选择另一个值而不是第一个值时,组合框变为空!
  • @Abeer 我已经测试了这个解决方案,它按预期工作。
【解决方案2】:

主要问题:组合框将根据所选项目更改其值

选择项目 5 -> 项目 5 被选中(如果值改变) 如果源已更改(不存在第 5 项或有空字符串),则该框将为空。你没有选择一个值!试试这样:

Private Sub UserForm_Initialize()
  Dim ListCB As Variant, TmpText As String
  If Not IsArray(Sheets("Data").Range(Names("List1"))) Then
    temptext = Worksheets("TEMP").Range("A3").Value
    Worksheets("TEMP").Range("A3").Value = ""
  End If
  ListCB = Sheets("Data").Range(Names("List1"))
  If Len(temptext) Then Worksheets("TEMP").Range("A3").Value = temptext
  ComboBox1.List = ListCB
End Sub

ListCB 不会在选择项目时更改 -> 您的组合框保持原样。

编辑:
试试这个方法:

Dim ListCB As Variant

Private Sub UserForm_Initialize()
  Dim TmpText As String
  If Not IsArray(Sheets("Data").Range(Names("List1"))) Then
    temptext = Worksheets("TEMP").Range("A3").Value
    Worksheets("TEMP").Range("A3").Value = ""
  End If
  ListCB = Sheets("Data").Range(Names("List1"))
  If Len(temptext) Then Worksheets("TEMP").Range("A3").Value = temptext
  GetCBList
End Sub

Sub GetCBList()
  Dim b As Variant, i As Long
  Dim a() As Variant: ReDim a(UBound(ListCB))
  For Each b In ListCB
    If Len(b) Then
      If InStr(1, b, ComboBox1.Value, vbTextCompare) > 0 Or ComboBox1.Value = "" Then: a(i) = b: i = i + 1
    End If
  Next
  If i > 0 Then ReDim Preserve a(i - 1)
  ComboBox1.List = a
End Sub

Private Sub ComboBox1_Change()
  GetCBList
  ComboBox1.DropDown
  Worksheets("TEMP").Range("A3").Value = ComboBox1.Value
End Sub

注意:Dim ListCB As Variant 需要在子/函数之外(在这种形式中应该是第一行)。用此代码替换 Private Sub UserForm_Initialize()Private Sub ComboBox1_Change() 并检查是否是您想要的。

【讨论】:

  • 我尝试运行此解决方案,但出现错误 1004 的消息显示“应用程序定义或对象定义错误”
  • 再试一次 -> 从您的链接下载 -> 复制我的代码 -> 替换用户表单的 Private Sub UserForm_Initialize()- 部分 -> 可以正常工作...
  • 我希望组合框列表值在我键入时更改 .. 就像在本教程中一样:trumpexcel.com/2013/10/excel-drop-down-list-with-search- 建议 .. 你能帮忙使它与用户表单一起使用吗? .. 附件中的一切都准备好了..
  • 您可以简单地在Worksheets("TEMP").Range("A3").Value = ComboBox1.Value 之后放置ComboBox1.Value = Worksheets("TEMP").Range("A3").Value... 组合框本身不会为空(但列表会)...但是,请确保您没有以无限循环......我会调查它......
  • @Abeer 我编辑了我的答案...请检查是否符合您的需要(您可以将 ListCB = Sheets("Data").Range(Names("List1")) 替换为全范围或什至更大范围...空单元格将被忽略并且无需您的List1 使其工作。
猜你喜欢
  • 2011-02-07
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2015-10-09
  • 2018-03-21
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
相关资源
最近更新 更多