我已经多次遇到过这个问题,并且到目前为止已经能够解决这个问题了。全能的搜索引擎也没有帮助我。
问题是,当我从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在那里但是空了!
这里有一些片段:
现在在组合框的情况下,如果我选择该列表项时它的列为BoundColumn,则可以显示一列的值,但仅在组合框的值中(因此仍然不在列表中)。
我最初的解决方法是在添加到Listbox / Combobox之前将它们转换为String值,在这种情况下,我想直接将查询结果链接到Box.List而不查看详细信息。因此,我正在寻找一种解决方案,而不是一种解决方法。
简而言之:由于一些奇怪的原因,我的数字字段项是默认的。解决方法是使项目字符串值。我现在正在寻找这个错误/问题的解决方案:
答案 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。