vba - Excel组合框问题

标签 vba combobox excel

我有一个带有组合框控件的 Excel 表单。我希望在打开组合框时使用已输入的类似条件从数据库表中填充值。这是我迄今为止为 DropButtonClick 事件实现此目的的代码。

Private Sub cboVariety_DropButtonClick()
    Static search_text As String
    Static is_open As Boolean
    Dim rs As New Recordset

    If is_open Then
        is_open = False
        Exit Sub
    End If
    is_open = True

    If search_text = cboVariety Then Exit Sub
    search_text = cboVariety

    cboVariety.Clear
    cboVariety.AddItem search_text
    If Len(search_text) > 2 Then
        rs.Open _
            "SELECT Name FROM tbl_Varieties " & _
            "WHERE Name LIKE '%" & search_text & "%' " & _
            "ORDER BY Name", connect_string, adOpenStatic
        Do Until rs.EOF
            If rs!Name <> search_text Then cboVariety.AddItem rs!Name
            rs.MoveNext
        Loop
        rs.Close
    End If
End Sub

问题是 DropButtonClick 事件在组合框打开和关闭时都会触发。如果在组合框关闭时执行此子函数,则清除组合框的代码会导致删除用户的选择。

我试图使用 is_open 变量来判断框何时关闭,每次执行事件子时,该变量都会在 true 和 false 之间交替。这似乎是解决问题的一个脆弱的方法。有更好的办法吗?

最佳答案

使用 is_open bool 值来跟踪组合框的状态是正确的,但您真正想要跟踪的是“我应该重新填充组合框吗”的状态与数据库数据?”

您希望何时填充列表框?目前,您希望每次用户单击下拉框时都会填充列表框(不考虑您的 is_open 状态变量)。这真的是你想要的吗?

我想您真正想要的是让组合框仅在其他内容发生更改后才更新。也许您只希望在表单首次打开时更新下拉列表。也许您只希望当搜索框中的文本更改时数据也更改。如果是这种情况,您需要根据实际想要执行更新时的状态来制定逻辑。

例如,假设您只想在搜索框中的文本发生更改时更新组合框。我现在没有查看 Excel,但假设您有一个名为 txtSearch 的文本框,其中包含 Text 属性。我首先添加一个模块或类级别变量来维护前一个文本条目的状态:

Private mPreviousSearchText As String

然后我会像这样更新我的事件代码:

Private Sub cboVariety_DropButtonClick()                                      
    Dim rs As New Recordset                    
    Dim search_text As String

              search_text = txtSearch.Text

    If mPreviousSearchText = search_text Then                      
       'The current search matches the previous search,'
       'so we do not need to perform the update.'
        Exit Sub                    
    End If                                                    

    cboVariety.Clear                    
    cboVariety.AddItem search_text                    
    If Len(search_text) > 2 Then                    
        rs.Open _                    
            "SELECT Name FROM tbl_Varieties " & _
            "WHERE Name LIKE '%" & search_text & "%' " & _
            "ORDER BY Name", connect_string, adOpenStatic
        Do Until rs.EOF                    
            If rs!Name <> search_text Then cboVariety.AddItem rs!Name
            rs.MoveNext                    
        Loop                    
        rs.Close                                
    End If             
    'Set the previousSearchText var to be the search_text so that it does'
    'not run unless the value of my text box changes.'
    mPreviousSearchText = search_text 
End Sub

重点是确定您真正想要执行更新的时间,并找到一种方法将您的逻辑决策与您想要执行操作的时间相关联的状态联系起来,这只是巧合的是,与用户点击下拉框有关。

关于vba - Excel组合框问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3670644/

相关文章:

arrays - 将项目添加到数组VBA excel

ajax - 如何将 jQuery 自动完成组合框与 AJAX JSON 数据一起使用?

arrays - 隐藏重复的单元格而不使用辅助列

vba - 超链接到 Excel 中另一个工作表上的单元格

string - Excel VBA - 在调用的子中使用现有字符串

vba - Excel VBA 导入 .txt 文件导致日期格式错误

Java 为 ComboBox 赋值

c# - Winforms ComboBox DataBinding DisplayMember 到 SubObject 属性

excel - 获取选定的数据透视表名称 - Excel VBA

vba - Range.find 不适用于 Excel VBA