Sql 列表框或组合框ADODB导入的十进制项在列表中不可见
我已经多次遇到这个问题,并且一直能够解决它。而且万能的搜索引擎也帮不了我 问题是,当我从ADODB记录集中填充列表框或组合框时,所有十进制数据元素在框中都不可见,例如,在以下情况下(conn是ADODB连接): 上面包含6列ID(all show Type=Variant/Decimal),由于某些奇怪的原因,其中包含的值都没有“显示”。通常只显示字符串和日期列,小数点在那里,但为空 以下是一些片段: 现在,在组合框的情况下,我可以得到一个列的值,如果我选择该列表项时它们的列是BoundColumn,则显示该列的值,但仅显示在组合框的值中(因此仍然不在列表中) 我最初的解决方法是在添加到Listbox/Combobox之前将它们转换为字符串值,但在本例中,我希望直接将查询结果链接到Box.List,而不查看详细信息。因此,我正在寻找一个解决方案,而不是一个变通办法 简而言之:由于某些奇怪的原因,我的数字字段项在默认情况下是不可见的。解决方法是将项目设置为字符串值。我现在正在寻找此错误/问题的解决方案:Sql 列表框或组合框ADODB导入的十进制项在列表中不可见,sql,vba,excel,combobox,Sql,Vba,Excel,Combobox,我已经多次遇到这个问题,并且一直能够解决它。而且万能的搜索引擎也帮不了我 问题是,当我从ADODB记录集中填充列表框或组合框时,所有十进制数据元素在框中都不可见,例如,在以下情况下(conn是ADODB连接): 上面包含6列ID(all show Type=Variant/Decimal),由于某些奇怪的原因,其中包含的值都没有“显示”。通常只显示字符串和日期列,小数点在那里,但为空 以下是一些片段: 现在,在组合框的情况下,我可以得到一个列的值,如果我选择该列表项时它们的列是BoundC
那么所有的字符串数据都出现了?而且,只有数字不会出现 然后,您可能希望将数字转换为字符串,并将其传递到列表、组合框中。 我注意到你已经这么做了 现在,由于任何原因,如果最大行数和阵列/记录器行数的长度不匹配,也可能会导致问题。不过,似乎您可以使用记录集行数设置combobox的行。您可以尝试迭代记录集来填充组合框,而不是使用数组吗?是的,这不是性能友好型的,在优化之前,猜猜我们需要什么才能在没有bug的情况下工作。;-) 您是否已将组合框绑定到记录集?您能否确认您的数组是否为一维,并且它是否有数据要馈送到框中 如果问题仍然存在,您可以尝试使用数据库中保存的查询填充列表框。 但是,基于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时遇到问题 我忘了问一些非常重要的问题,你申报了吗 选项Base 1以确保避免丢失数组的一列 值,如果您正在转储二维数组。。。?因为你没有 用于将数据转储到阵列中的数组的显式声明 列表框…………) 确保您的列表框已启用以显示多列数据。 *所以你有三个选择*
- 选项基数1
- 重拨数组并进行循环以填充数组并将其转储到.list中
- 由于ReDim阵列需要您循环使用,因此您也可以 使用recorset iself添加数据
好的,在经历了各种可能的原因之后,似乎是这样的: VBA没有自己的十进制变量类型。 VBA可以从声明为Variant的变量中处理Decimal(从而成为Variant/Decimal) 这通常不会停止程序的工作,但在诸如Listbox和Combobox之类的控件中,类型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中将任何十进制输出转换为单/双/字符串/整数/长。ColumnWidths属性是什么样子的?是否在控件的其他地方执行了.visible=false?你能更新你的问题吗?你的组合框和列表框在不可见数据的情况下是什么样子的?列宽没有设置(因此所有的列都一样宽,我通过设置ColumnHeads=True来验证)。盒子是可见的,我刚刚试过另一个。visible=True看看这是否重要,但唉。此外,日期和文本显示一样没有问题。最大行数匹配,除了这个“小故障”之外,它填充得很好。迭代会得到相同的结果,只是比您提到的要慢。当我迭代时,我确实可以将数字转换为字符串,但是这仍然让我感到困惑,为什么这不能正常工作。我添加了一些片段来显示我的数组的外观,它是一个二维矩阵,因此适合列表,除了这个之外,它填充得很好。在数据库中使用已保存的查询不会更改结果,但会丢失数字。我现在将尝试rowsource,但是我以前从未使用过它,因为它在我看来有点不可靠…顺便说一句,如果您使用的是
.List
属性,那么您可以使用它
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