ListBox或Combobox ADODB导入的十进制项在列表中不可见

时间:2012-12-12 16:47:36

标签: sql excel vba excel-vba combobox

我已经多次遇到过这个问题,并且到目前为止已经能够解决这个问题了。全能的搜索引擎也没有帮助我。

问题是,当我从ADODB记录集填充了一个列表框或组合框时,所有十进制数据元素在框中都不可见,例如,使用以下内容(conn是ADODB连接):

Private Sub GetFilteredRecords()
    Dim strSQL As String
    Dim arr As Variant

    'create the SQL
    strSQL = "SELECT * FROM vwStandard_Fee2"

    'execute the SQL and fill the rs ( rsFiltered )
    Set rsFiltered = conn.Execute(strSQL)

    'Apply recordset to the listbox on the form
    If Not (rsFiltered.EOF = True And rsFiltered.BOF = True) Then
        arr = rsFiltered.GetRows()
        With lbDeeper
            .ColumnCount = rsFiltered.Fields.Count
            .List = TransposeArray(arr)
        End With
        With cbDeeper
            .ColumnCount = rsFiltered.Fields.Count
            .List = TransposeArray(arr)
        End With
    End If

End Sub

上面包含6列Ids(全部显示Type = Variant / Decimal),由于某些奇怪的原因,所包含的值都没有“显示”。只有String和Date列正常显示,Decimals在那里但是空了!

这里有一些片段:

General layout of arr

String is shown, decimal is not shown

See that EUR is shown and the decimal field next to it isnt!

现在在组合框的情况下,如果我选择该列表项时它的列为BoundColumn,则可以显示一列的值,但仅在组合框的值中(因此仍然不在列表中)。

我最初的解决方法是在添加到Listbox / Combobox之前将它们转换为String值,在这种情况下,我想直接将查询结果链接到Box.List而不查看详细信息。因此,我正在寻找一种解决方案,而不是一种解决方法。

简而言之:由于一些奇怪的原因,我的数字字段项是默认的。解决方法是使项目字符串值。我现在正在寻找这个错误/问题的解决方案:

  1. 造成这种情况的原因是什么?
  2. 如何解决?

2 个答案:

答案 0 :(得分:1)

所有字符串数据都出现了吗?并且,只有数字不会出现?

然后你可能想要将你的数字转换为字符串并将其传递给你的列表,组合框。 你已经注意到了我已经注意到了。

现在出于任何原因,如果您的最大行数和阵列/录像机行数的长度不匹配,也可能导致问题。但是,您似乎使用记录集行计数来设置组合框的行。您可以尝试迭代记录集来填充组合框,而不是使用数组吗?是的,这不是性能友好的,在优化之前猜猜我们需要它在没有错误的情况下工作。 ;-)

您是否将组合框绑定到记录集?你能否确认你的阵列是否是单一维度,并且它有数据可以提供给盒子吗?

如果问题仍然存在,您可以尝试使用数据库中保存的查询填充列表框。 但是,基于SQL语句的列表框和组合框比慢  基于已保存查询的列表框和组合框。

那么您可以尝试以下方法来设置rowsource属性吗?确保在数字和测试列上进行测试。以及旧的组合框和新组合框。

Rowsource->build query->
sqlview copy to rowsource property box-> 
delete or don't save that above built query since you already have SQL statement.

只是想让你尝试缩小问题的可能性。


以最可能的问题和解决方案更新答案

根据我的评论,他们主要假设你有填充listbox / combobox

的问题
  

我忘了问一些非常重要的事情,你宣布了吗?   选项基础1,以确保避免丢失其中一个数组的列   如果要转储2D数组的值...?因为你没有   显式声明您用于将数据转储到的数组   listbox ..........:)

确保您的列表框已启用,以显示多列数据。

* 所以你有三个选择,*

  • 选项基础1

  • 重新调整数组并进行循环以填充它并将其转储到.list中。

  • 由于ReDim数组需要你进行循环,你也可以 使用recorset iself添加数据。

您似乎对数组有一个维度问题,该数组未声明但是从记录集转换到listbox / combobox。因此,未声明的数组不能正确填充多列。当你声明数组proeprly时,这可能是它起作用的原因.......

事实上,你在评论中说过,

  

当我在我的代码中创建一个数组并在我的代码中填充它时(通过   它将显示没有任何问题 - K_B 14分钟前

答案 1 :(得分:1)

在经历各种可能的原因之后确定似乎是这样的情况:

VBA没有自己的十进制变体类型。 VBA可以在声明为Variant的变量中处理Decimal(从而变为Variant / Decimal) 这通常不会阻止您的程序工作,但在Listbox和Combobox等控件中,Type Variant / Decimal不可解释,因此不会绘制该特定条目。

例如,使用以下命令填充名为lbHigher的列表框:

Private Sub ListBoxProblem()

    Dim tempArray(2, 2) As Variant

    tempArray(0, 0) = "A"
    tempArray(0, 1) = 1
    tempArray(0, 2) = 1.1
    tempArray(1, 0) = "B"
    tempArray(1, 1) = CStr(CDec(5.2))
    tempArray(1, 2) = 2.3
    tempArray(2, 0) = "C"
    tempArray(2, 1) = DateSerial(2012, 12, 13)
    tempArray(2, 2) = 100
    tempArray(3, 0) = "D"
    tempArray(3, 1) = -1
    tempArray(3, 2) = CDec(5.2)

    lbHigher.ColumnCount = 3
    lbHigher.List = tempArray
End Sub

除CDec(5.2)外,一切正常。 CStr(CDec(5.2))工作正常,VBA首先将Decimal转换为String,然后Listbox才能获得它。

所以要么:不要让SQL生成任何十进制输出,或者在将它传递给列表框之前将任何十进制输出转换为VBA中的Single / Double / String / Integer / Long。