查找并 select 在组合框列表中找到的项目

Find and select the item found in the combobox list

在下面的代码中,我检查 Sheet2 单元格 A1 的值是否包含在 combobox1 列表中,如果找到,则将其放入 'selection mode'.但它不起作用。应该更正代码的哪一部分?

Private Sub UserForm_Initialize()
  Set xRg = Worksheets("Sheet1").Range("A1:B5")
  Me.ComboBox1.List = xRg.Columns(1).Value
End Sub

Private Sub CommandButton1_Click()
  Dim foundRng As Range
  Set findrange = Sheets("Sheet1").Range("A1:B5")
  Set foundRng = findrange.Find(Sheets("Sheet2").Range("A1"))

  If foundRng Is Nothing Then
    MsgBox "Nothing found"
  Else
    MsgBox "I Found"
    Me.ComboBox1.ListIndex = foundRng.Value
  End If
End Sub

声明变量并提供正确的数据类型

我没有对你的代码做太多改动,但想给你一些提示:

  1. 设置Option Explicit强迫自己声明变量(对象)
  2. 在您的 Sheet2!A1 单元格中提供输入案例,如果您将字符串或空字符串(而不是数字)与 ListIndex 数字进行比较,则可能会发生类型不匹配。
  3. 建议完全限定您的范围参考 (fqrr).
  4. 如果您仅指工作表,请使用术语 Worksheets
  5. 检查 Stack Overflow 的 Help Tour 关于 How do I ask a good question?,以及, How to create a Minimal, Complete, and Verifiable example
  6. 尝试了解一些有关错误处理调试VBA的知识,以便能够提供更准确的信息有关发生错误的信息。 "It doesn't work" 对本站更有经验的程序员来说,牛的红布精确 这里 :-;

一些小改动...

Option Explicit      ' declaration head of your UserForm code module
Dim xrg As Range     ' possibly declared here to be known in all UserForm procedures

Private Sub UserForm_Initialize()
Set xrg = ThisWorkbook.Worksheets("Sheet1").Range("A1:B5")  ' << fully qualified range reference (fqrr)
Me.ComboBox1.List = xrg.Columns(1).Value
End Sub

Private Sub CommandButton1_Click()
Dim foundRng As Range, findrange As Range
Set findrange = ThisWorkbook.Worksheets("Sheet1").Range("A1:B5") ' fqrr
Set foundRng = findrange.Find(Thisworkbook.Worksheets("Sheet2").Range("A1")) ' fqrr
If foundRng Is Nothing Then
    MsgBox "Nothing found"
    Me.ComboBox1.ListIndex = -1
ElseIf foundRng.Value = vbNullString Then
    MsgBox "Empty search item"
    Me.ComboBox1.ListIndex = -1
Else
    MsgBox "1 item found"
    If IsNumeric(foundRng.Value) Then
       Me.ComboBox1.ListIndex = CLng(foundRng.Value) + 1
    Else
       Me.ComboBox1.ListIndex = foundRng.Row - 1
    End If
End If
End Sub

推荐link

您可以在 Chip Pearson 的网站上找到有关 Debugging VBA 的有用指南。

补充评论

为了定义不跟随空行的动态范围,您可以重写 Initialize 过程,如下所示:

Private Sub UserForm_Initialize()
Dim n&                           ' ... As Long 
With ThisWorkbook.Worksheets("Sheet1")
    n = .Range("A" & .Rows.Count).End(xlUp).Row
    Set xrg = .Range("A1:B" & n)  ' << fully qualified range reference 
End With
Me.ComboBox1.List = xrg.Columns(1).Value
End Sub

祝以后学习顺利:-)