【发布时间】: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。我考虑过包含一个示例,但我认为它不会类似于“最小”:) 我不确定如何“伪造”数据库部分,没有它我怀疑我的示例实际上会按预期工作。