查找并 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
声明变量并提供正确的数据类型
我没有对你的代码做太多改动,但想给你一些提示:
- 设置
Option Explicit
强迫自己声明变量(对象)
- 在您的
Sheet2!A1
单元格中提供输入案例,如果您将字符串或空字符串(而不是数字)与 ListIndex
数字进行比较,则可能会发生类型不匹配。
- 建议完全限定您的范围参考 (fqrr).
- 如果您仅指工作表,请使用术语
Worksheets
。
- 检查 Stack Overflow 的 Help Tour
关于 How do I ask a good question?,以及,
How to create a Minimal, Complete, and Verifiable example
- 尝试了解一些有关错误处理和调试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
祝以后学习顺利:-)
在下面的代码中,我检查 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
声明变量并提供正确的数据类型
我没有对你的代码做太多改动,但想给你一些提示:
- 设置
Option Explicit
强迫自己声明变量(对象) - 在您的
Sheet2!A1
单元格中提供输入案例,如果您将字符串或空字符串(而不是数字)与ListIndex
数字进行比较,则可能会发生类型不匹配。 - 建议完全限定您的范围参考 (fqrr).
- 如果您仅指工作表,请使用术语
Worksheets
。 - 检查 Stack Overflow 的 Help Tour 关于 How do I ask a good question?,以及, How to create a Minimal, Complete, and Verifiable example
- 尝试了解一些有关错误处理和调试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
祝以后学习顺利:-)