【问题标题】:VBA Explicitly Request Variant Array As Opposed to String ValueVBA 显式请求变体数组而不是字符串值
【发布时间】:2016-08-18 23:27:36
【问题描述】:

我有一个组合框,我正在尝试使用 Excel 工作表中的范围来填充。我提取该列的最后一行,然后将该范围内的所有值添加到组合框中。问题是,如果只有一个条目,Excel 将只从数组中提取单个值作为字符串,而不是变量数组。

这会导致类型不匹配,因为它试图将值作为字符串分配给变量数组。有没有办法显式请求变体数组而不是字符串值?

这里是原始代码:

Dim hvVals() As Variant
lastRow = getLastRowInCol(Sheets("MySheet"), "B")
hvVals = Sheets("MySheet").Range("B2:B" & CStr(lastRow)).value
If Not isEmpty(hvVals) And lastRow <> 1 Then
Me.CECB.list = hvVals

这是我对解决方案的尝试,但这确实会减慢我的代码速度,而且我不知道它是否非常健壮:(此外,表格中的第一行在技术上是 2,这就是它在if statement)

Dim hvVals() As Variant
lastRow = getLastRowInCol(Sheets("MySheet"), "B")
If lastRow = 2 Then
    ReDim hvVals(1) As Variant
    hvVals(0) = Sheets("MySheet").Range(hvCol & "2:" & hvCol & CStr(lastRow)).value
Else
    hvVals = Sheets("MySheet").Range(hvCol & "2:" & hvCol & CStr(lastRow)).value
End If
If Not isEmpty(hvVals) And lastRow <> 1 Then
    Me.CECB.list = hvVals

【问题讨论】:

  • 当你选择一个(多单元格)范围的值时,你会得到一个二维变量数组(1 到 #rows,1 到 #columns):如果你想为单个单元格模拟它您还需要一个二维数组(1 对 1、1 对 1)

标签: vba excel


【解决方案1】:

试试这个方法
1。从变量声明中取出“()”——如果它是一个数组,你的代码逻辑应该处理它——。
2。这行Sheets("MySheet").Range("B2:B" &amp; CStr(lastRow)).value中的数字不需要转换成字符串,我不会冒险导致随机错误,改成Sheets("MySheet").Range("B2:B" &amp; lastRow).value

之前的“()”

在“()”之后


3.我的建议 - 如果你真的需要它变量 - 将检查变量的 Ubound,如果它大于 0,则意味着找到了多个值并相应地进行处理。
4.为什么不创建一个范围数组呢?您可以更轻松地使用它,因为您可以通过这种方式获得“.value”属性。

【讨论】:

  • 尝试 1 似乎有效。如果我遇到更多问题,我也认为我会尝试 4。我想我最初选择了一个变体,因为我不确定combobox.list 是否会处理range.value 类型。但我通常会使用范围。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多