【问题标题】:Auto-Populating a Combobox with SQL data使用 SQL 数据自动填充组合框
【发布时间】:2013-10-14 23:15:42
【问题描述】:

我是这个论坛的新手,如果有人问过这个问题但我还没有找到,或者我在错误的地方发帖,我深表歉意。

我有一个多年来一直在使用的例程,它根据来自 SQL 的数据填充组合框。我有一个包含两个组合框的电子表格,第一个组合框工作正常,并直接从 SQL 表中提供文件夹名称列表。第二个组合框填充了与在第一个组合框中选择的文件夹相关联的所有合同。但是我无法让代码自动填充,为了让组合框更新,我必须先从下拉列表中选择一个项目,然后该值不被保留。我在下面粘贴了我的代码:

Private Sub CB_Company_Change()

With Application
     .Calculation = xlManual
     .EnableEvents = False
     .ScreenUpdating = False
 End With

Dim stSQL As String, sBook As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
Dim objConn As ADODB.Connection
Dim ConnectionString As String
ConnectionString = "Provider=sqloledb.1;data source=sql-server;Initial catalog=sql-db;Integrated Security = SSPI;"

Set objConn = New ADODB.Connection

sBook = CB_Book.Value
CB_Company.Clear

stSQL = "EXEC('SELECT Name FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.ID WHERE TABLE2.NAME = ''" & sBook & "''  ORDER BY TABLE1.NAME')"

With objConn
    .CursorLocation = adUseClient
    .Open ConnectionString
    Set rst = .Execute(stSQL)
End With

With rst
    Set .ActiveConnection = Nothing
    k = .Fields.Count
    vaData = .GetRows
End With

CB_Company.List = Application.Transpose(vaData)

objConn.Close

Set rst = Nothing
Set objConn = Nothing

bClear = True

With Application
    .Calculation = xlAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
End With

End Sub

任何关于为什么在运行时可能不会自动填充的帮助将不胜感激。

这里要求的是第一个组合框中的代码,它给了我我的账面价值:

Option Explicit
Public bClear As Boolean

Private Sub CB_Book_Change()

With Application
    .Calculation = xlManual
    .EnableEvents = False
    .ScreenUpdating = False
End With

Dim stSQL As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
Dim objConn As ADODB.Connection
Dim ConnectionString As String
ConnectionString = "Provider=sqloledb.1;data source=SQL-SERVER;Initial catalog=SQL-DB;Integrated Security = SSPI;"
Set objConn = New ADODB.Connection

stSQL = "EXEC('SELECT NAME FROM TABLE2')"

With objConn
    .CursorLocation = adUseClient
    .Open ConnectionString
    Set rst = .Execute(stSQL)
End With

With rst
    Set .ActiveConnection = Nothing
    k = .Fields.Count
    vaData = .GetRows
End With

CB_Book.List = Application.Transpose(vaData)

objConn.Close

Set rst = Nothing
Set objConn = Nothing

bClear = True

With Application
    .Calculation = xlAutomatic
    .EnableEvents = True
    .ScreenUpdating = True
End With

End Sub

【问题讨论】:

  • 填充第二个组合框的代码在哪里?据我所知,此过程仅填充 CB_Company
  • 参见this question - 您的事件会一次又一次地触发,因为在您执行CB_Company.Clear 之后,它会立即再次触发此方法。

标签: sql vba excel


【解决方案1】:

当您从 CB_Company 中选择一个值时,这看起来像是事件处理程序,但在代码中您清除了相同的组合框 (CB_Company.clear) 并重新填充它 (CB_Company.List = Application.Transpose(vaData))。

【讨论】:

  • 谢谢 Sebastiaan.Everyman,我可能有这个错误,但基本上我想做的是。每次有人单击组合框时,它都会清除当前列表,然后转到 SQL 并使用查询结果重新填充列表。我认为在 SQL 查询开始之前使用 CB_Company.clear 命令可以吗?注释掉 clear 命令确实会将我的值留在组合框中,但它们不是基于第一个组合框值的当前值。
【解决方案2】:

我最近遇到了这个确切的问题。正在发生的事情是“更改”方法在更新内容时经常在其内部被调用。例如:

CB_Company.Clear

实际上会导致整个方法再次被调用。在某些时候,Excel 会停止处理这些,留下一个空白框。

你应该简单地在这个模块的顶部包含一个全局变量:

Public updatingContent As Boolean

然后,在这个 sub 的开头包括:

If updatingContent Then Exit Sub
updatingContent = True

这将阻止调用链。

最后,在这个处理程序的最后,确保包括:

updatingContent = False

重置您的方法。


这是您的代码进行了这些更改。

Public updatingContent As Boolean
Private Sub CB_Company_Change()

    If updatingContent Then Exit Sub
    updatingContent = True

    With Application
         .Calculation = xlManual
         .EnableEvents = False
         .ScreenUpdating = False
     End With

    Dim stSQL As String, sBook As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
    Dim objConn As ADODB.Connection
    Dim ConnectionString As String
    ConnectionString = "Provider=sqloledb.1;data source=sql-server;Initial catalog=sql-db;Integrated Security = SSPI;"

    Set objConn = New ADODB.Connection

    sBook = CB_Book.value
    CB_Company.Clear

    stSQL = "EXEC('SELECT Name FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.ID WHERE TABLE2.NAME = ''" & sBook & "''  ORDER BY TABLE1.NAME')"

    With objConn
        .CursorLocation = adUseClient
        .Open ConnectionString
        Set rst = .Execute(stSQL)
    End With

    With rst
        Set .ActiveConnection = Nothing
        k = .fields.count
        vaData = .GetRows
    End With

    CB_Company.List = Application.Transpose(vaData)

    objConn.Close

    Set rst = Nothing
    Set objConn = Nothing

    bClear = True

    With Application
        .Calculation = xlAutomatic
        .EnableEvents = True
        .ScreenUpdating = True
    End With

    updatingContent = False
End Sub

【讨论】:

  • 感谢 Enderland,由于某种原因,我似乎仍然需要从下拉列表中单击一个选项来更新组合框。因此,例如,如果我更改组合框 1 中的值,则需要单击组合框 2 并选择一个值,以便它重新填充新的正确值。这有点像我想做的,但不是自动的。
  • @Carlos80 这回答了你的问题吗?
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多