0

我已经多次遇到这个问题,并且直到现在都能够解决它。万能的搜索引擎也没有帮助我。

问题是,当我从 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),其中包含的值由于某种奇怪的原因都没有“显示”。只有字符串和日期列正常显示,小数在那里但为空!

这里有一些片段:

arr的总体布局

显示字符串,不显示小数

看到显示了欧元,而它旁边的小数字段没有!

现在,如果是组合框,当我选择该列表项时,如果它们的列是 BoundColumn,我可以获得一列的值,但只能在组合框的值中(所以仍然不在列表中)。

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

简而言之:由于某种奇怪的原因,我的数字字段项默认不可见。解决方法是使项目字符串值。我现在正在寻找解决此错误/问题的方法:

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

2 回答 2

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.

只是想让您尝试缩小问题范围的可能性。


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

根据我的评论,他们主要假设您在填充列表框/组合框时遇到问题

我忘了问一些非常重要的问题,您是否声明了 Option Base 1 以确保在转储二维数组时避免丢失数组的列值之一......?因为您对用于将数据转储到列表框的数组没有任何明确的声明............ :)

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

*所以你有三个选择,*

  • 选项基础 1

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

  • 由于 ReDim 数组无论如何都需要您循环遍历,因此您也可以使用 recorset 本身来添加数据。

您似乎对未声明但从记录集转置到列表框/组合框的数组存在维度问题。所以你未声明的数组没有正确填充多列。这可能是您正确声明数组时它起作用的原因......

事实上,在您的评论中,您已经说过,

当我在我的代码中创建一个数组并将其填充到我的代码中(逐个条目)时,它将毫无问题地显示 – K_B 14 分钟前

于 2012-12-13T03:51:34.860 回答
1

好的,在经历了各种可能的原因之后,似乎是这样的:

VBA 没有自己的 Decimal Variant Type。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 将首先将十进制转换为字符串,然后列表框才能获取它。

所以要么:不要让 SQL 生成任何十进制输出或将任何十进制输出转换为 VBA 中的 Single/Double/String/Integer/Long,然后再将其交给 Listbox。

于 2012-12-13T10:06:35.877 回答