【问题标题】:What causes an entire ListBox column to be blank?是什么导致整个 ListBox 列为空?
【发布时间】:2019-06-18 14:18:12
【问题描述】:

我正在处理一个 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 显示值。

【问题讨论】:

  • 您的数组是否遵循与 List 属性相同的索引(即从 0 而不是 1 开始)?如果您尝试从第 17 列(即在即时窗口类型 ?FormName.ListBoxName.List(0,13) 中)获取值,也会发生什么情况。它返回一个值还是什么都不返回?这将指示数据是否进入列表
  • UPC 代码不应存储为数值...它们是字符串,就像电话号码或信用卡号码一样(例如,1234568901234 在 Excel 中默认显示为 1.23457E+13 )。如果您在 locals 工具窗口中检查数组元素,它似乎包含 UPC 代码吗?您是否有此类 UPC 代码的示例?此外,请随时 edit 将您的问题嵌入 minimal reproducible example 以重现问题 - 让回答者更容易提供帮助。
  • @DavidN 是的,我的数组使用 0 的基本索引。当我从您的示例中的列表中获取值时,我确实得到了一个值(类似于 6757583452)。
  • @MathieuGuindon 我了解将 UPC 代码存储为数字的一些问题。在这一点上,数据库结构是我无法控制的。 Locals 窗口确实显示 UPC 值,例如 6757583452。我考虑过包含一个示例,但我认为它不会类似于“最小”:) 我不确定如何“伪造”数据库部分,没有它我怀疑我的示例实际上会按预期工作。

标签: excel vba listbox


【解决方案1】:

显然,VBA 列表框无法处理 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

【讨论】:

  • 不错的发现!可能与 Decimal 不是 VBA 中的真实数据类型有关(您不能合法地声明 As Decimal),即使关键字已正确保留。
  • @MathieuGuindon 没错,你不能声明一个小数,但你可以转换成一个:?typename(cdec(5.1))
  • 我知道.. 只是指出它不是真正处理过的数据类型,也许可以解释为什么 ListBox 不喜欢它 ;-)
  • @MathieuGuindon 够公平的。 :) 我非常感谢您的反馈!我做了一些修改,包括一个“最小”的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-07-24
  • 2012-04-20
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多