How to populate a ComboBox with a Recordset using VBA

前端 未结 6 762
星月不相逢
星月不相逢 2021-02-15 13:34

There is some literature available at expert\'s exchange and at teck republic about using the combobox.recordset property to populate a combobox in an Access form.

The

6条回答
  •  野趣味
    野趣味 (楼主)
    2021-02-15 14:08

    good method with using the Recordset property, thanks for that hint!

    Patrick, the method you shown on your page has a big disadvantage (I tried that too on my own): The value list can only be 32 KB, if you exceed this limit the function will throw an error. The callback method has the big disadvantage that it is very slow and it is called once for every entry which makes it unuseable for a longer list. Using the recordset method works very well. I needed this because my SQL string was longer than 32 KB (lot of index values for WHERE ID IN(x,x,x,x,x...)).

    Here's a simple function which uses this idea to set a recordset to the combobox:

    ' Fills a combobox with the result of a recordset.
    '
    ' Works with any length of recordset results (up to 10000 in ADP)
    ' Useful if strSQL is longer than 32767 characters
    '
    ' Author: Christian Coppes
    ' Date: 16.09.2009
    '
    Public Sub fnADOComboboxSetRS(cmb As ComboBox, strSQL As String)
        Dim rs As ADODB.Recordset
        Dim lngCount As Long
    
       On Error GoTo fnADOComboboxSetRS_Error
    
        Set rs = fnADOSelectCommon(strSQL, adLockReadOnly, adOpenForwardOnly)
    
        If Not rs Is Nothing Then
            If Not (rs.EOF And rs.BOF) Then
                Set cmb.Recordset = rs
                ' enforces the combobox to load completely
                lngCount = cmb.ListCount
            End If
        End If
    
    fnADOComboboxSetRS_Exit:
        If Not rs Is Nothing Then
            If rs.State = adStateOpen Then rs.Close
            Set rs = Nothing
        End If
        Exit Sub
    
    fnADOComboboxSetRS_Error:
        Select Case Err
            Case Else
                fnErr "modODBC->fnADOComboboxSetRS", True
                Resume fnADOComboboxSetRS_Exit
        End Select
    End Sub
    

    (The function fnADOSelectCommon opens an ADO recordset and gives it back. The function fnErr shows a message box with the error, if there was one.)

    As this function closes the opened recordset there should be no problem with the memory. I tested it and didn't saw any increasing of memory which wasn't released after closing the form with the comboboxes.

    In the Unload Event of the form you can additionaly use a "Set rs=Me.Comboboxname.Recordset" and then close it. This should not be necessary regarding memory, but it may be better to free up open connections (if used with a backend database server).

    Cheers,

    Christian

提交回复
热议问题