首页 > 解决方案 > 是什么导致整个 ListBox 列为空?

问题描述

我正在开发一个 Excel 项目,其中有一个带有两个 ListBox 控件的 VBA 用户窗体。我通过将数组分配给 List 属性来加载它们。所有预期的数据都显示出来,除了完全空白的第七列。

为什么这一列是空白的?

其他详细信息:
该数组大约有 15 列和 25 行。
数组的第七列在 Locals 中列为 Variant/Decimal 类型。它包含以 DECIMAL(14,0) 形式存储在数据库中的UPC值(最多 14 位)。
所有 UPC 值都不是 NULL 或空白。它们确实出现在 Locals 窗口的数组中,并且可以从 ListBox 中检索,只是看不到。
ListBox 有 ListStyle fmListStylePlain 和 MultiSelect fmMultiSelectMulti。
尽管您不能将变量变暗(声明)为十进制,但您可以使用 CDec 函数转换为十进制:?typename(CDec(4.5))在立即窗口中。


最小示例:
使用 ListBox (Listbox1)、两个 TextBox 控件(TextBox1 和 TextBox2)和两个命令按钮(CommandButton1 和 CommandButton2)创建一个用户窗体。
在用户窗体的代码模块中,粘贴以下代码:

Private Sub CommandButton1_Click()
    Dim x(0 To 0, 0 To 0)

    x(0, 0) = CDec(TextBox1.Text)
    ListBox1.List = x

    TextBox2.Text = ListBox1.List(0, 0)
End Sub

Private Sub CommandButton2_Click()
    Dim x(0 To 0, 0 To 0)

    x(0, 0) = CDbl(TextBox1.Text)
    ListBox1.List = x

    TextBox2.Text = ListBox1.List(0, 0)
End Sub

带注释的屏幕截图

运行用户窗体,在 TextBox1 中键入一个数字(带或不带小数位),然后单击 CommandButton1。ListBox1 保持空白,但 Textbox2 显示一个值。
单击命令按钮 2。ListBox1 和 TextBox2 显示该值。

标签: excelvbalistbox

解决方案


显然,VBA ListBox 无法处理 Variant/Decimal 值。我无法找到权威来源来解释这一点,但我发现使用 Format 函数将 Decimal 值转换为文本是有效的。

Dim vData as Variant
Dim lRow as Long

'fill vData array from database here
...

'convert seventh column to zero-padded 14-character string in this loop:
For lRow = LBound(vData,1) to UBound(vData,1)
    vData(lRow, 6) = Format(vData(lRow, 6), "00000000000000")
Next lRow

推荐阅读