【问题标题】:ListBox or Combobox ADODB imported Decimal items invisible in the listListBox 或 Combobox ADODB 导入的十进制项目在列表中不可见
【发布时间】:2012-11-30 10:34:03
【问题描述】:

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

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

这里有一些sn-ps:

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

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

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

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

【问题讨论】:

  • 你的 ColumnWidths 属性是什么样的?
  • 您是否在控件的其他位置完成了 .visible=false ?您能否用不可见数据的组合框和列表框的外观来更新您的问题?
  • COlumnWidths 未设置(因此所有列的宽度相同,我已通过设置 ColumnHeads = True 进行了验证)。 Box 是可见的,我刚刚尝试使用另一个 .Visible=True 来查看这是否重要,但是唉。日期也和文本一样显示没有问题。

标签: sql vba excel combobox


【解决方案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.

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


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

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

我忘了问一件非常非常重要的事情,你声明了吗 选项 Base 1 以确保避免丢失数组的列之一 如果要转储二维数组,则值...?因为你没有任何 显式声明用于将数据转储到 列表框............ :)

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

*所以你有三个选择,*

  • 选项库 1

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

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

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

事实上你在评论中说过,

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

【讨论】:

  • 匹配的最大行数,除了这个“故障”之外,它的填充效果很好。迭代给出了相同的结果,只是你提到的更慢。当我确实进行迭代时,我可以将数字转换为字符串,但这仍然让我感到困惑,为什么它不能正常工作。
  • 我添加了 sn-ps 来显示我的数组的外观,它是一个二维矩阵,因此适合列表,除此之外它可以很好地填充。在数据库中使用保存的查询不会改变结果,数字保持缺失。我现在将尝试行源,但是我以前从未使用过它,因为它看起来对我来说有点狡猾......
  • 顺便说一句,如果您使用.List 属性,您不必担心它是一维数组还是二维数组。只有当您添加像.AddItem 这样的项目时,您才需要指定像0,0 这样的索引。我现在在这里闻到了一些东西.. 将您的数组变成一维数组,只需要您需要的数据,然后将其转储到 .List 并看看它是如何进行的。我有一种轻微的不好的感觉它会起作用的;)
  • 这是什么意思? “当我在我的代码中创建一个数组并在我的代码中填充它(逐个条目)时,它将毫无问题地显示出来” 1.这是否意味着您正在声明您的数组维度? 2.也就是说你可以使用那个方法,不是吗? 3. 或者你是说,即使在声明一个数组并填充列表框之后,你仍然有不显示数字的问题?请澄清。
  • 然后查询记录集并填充数组或仅使用记录集填充列表框。如果十进制有问题,则将其转换为整数/数字。
【解决方案2】:

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

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 将首先将 Decimal 转换为 String,然后 Listbox 才能获取它。

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

【讨论】:

  • 转换为字符串是我回答中的第一个解决方案,然后又回到了第一个解决方案! ;)
  • 同意,感谢您的帮助,但它没有回答我的主要问题:是什么原因造成的?在互联网上的各种搜索中也找不到...
  • 顺便说一句,这很有趣,但我很惊讶这些错误仍然存​​在,如果这几乎是导致你的灾难的原因。 listbox, combox decimal conversion bug 通常我们会在这些控件中显示之前将数据转换为字符串。特别是如果您碰巧使用 C# 类的平台。或者,它通过 rowsource 属性填充到 sql 语句中。不涉及数组。
  • 确实,软件中的这种错误/错误/故障已经很久了。这让我感到惊讶,也感谢那里的良好链接......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多