尝试从Excel范围建立VBA数组时发生资料类型混淆

14ifxucb  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(145)

我在Excel中有两组数据,我正试图在VBA中比较它们。所有的数据都是数字(整数)。
“新”数据位于表中,该表作为一个范围复制到“旧”数据上,然后“新”数据表得到更新。
数据格式:
| 识别码|参数_1|参数_2|参数_3|等等....|
| - -|- -|- -|- -|- -|
| 小行星12345|三个|七个|九个|等等....|
| 小行星67890|一个|2个|三个|等等....|
| 等等....|等等....|等等....|等等....|等等....|
我的代码:

...
Sub sub1()

new_rows = ThisWorkbook.Sheets("new").Cells.SpecialCells(xlCellTypeLastCell).Row
old_rows = ThisWorkbook.Sheets("old").Cells.SpecialCells(xlCellTypeLastCell).Row
Dim new_data() As Variant
Dim old_data() As Variant
new_data = ThisWorkbook.Sheets("new").Range("A1:G" & new_rows).Value
old_data = ThisWorkbook.Sheets("old").Range("A1:G" & old_rows).Value
...
Dim update_tracker() As Variant
ReDim update_tracker(rows, columns)
...
updates_recorded = 0
For row_new = 2 To new_rows
     ID = new_data(row_new, 1)
     [code to match corresponding row in old_data that has same ID]

     new_Parameter_1 = new_data(row_new, 4)
     old_Parameter_1 = old_data(row_old, 4)
     new_Parameter_2 = etc....
     [all other data parameters]

     If new_Parameter_1 <> old_Parameter_1 Then
          update_tracker = track_updates(update_tracker, updates_recorded, ID, old_Parameter_1, new_Parameter_1, 1)
          updates_recorded = updates_recorded + 1
     End If
     [if statements for all other parameters]
Next row_new
[irrelevant code to put data into Excel]
End Sub

Function track_updates(update_tracker, updates_recorded, ID, old_Parameter, new_Parameter, parameter_number)
     If updates_recorded > 0 Then
          ReDim Preserve update_tracker(start To UBound(update_tracker, 1), [same columns])
     End If
     update_tracker(UBound(update_tracker, 1), col_1) = ID
     update_tracker(UBound(update_tracker, 1), col_2) = old_Parameter
     update_tracker(UBound(update_tracker, 1), col_3) = new_Parameter
     update_tracker(UBound(update_tracker, 1), col_4) = parameter_number

     track_updates = update_tracker
End Function

第4行出现错误:“类型不匹配”。这与数组是Integer还是Double无关。
VarType([range].Value)返回新区域和旧区域的8204,数据在字面上是相同的,但数据只能从表保存到第一个数组中。
如果我将所有的数组DimVariant,那么这部分代码就可以工作,但是稍后当ID的数字被保存到update_tracker时,同样的错误出现了。
即使所有3个数组都是Variant类型,但在调试时将?VarType(ID)放入“立即”窗口会返回5,这表明该数字以某种方式保存为Double
an answer I found on this site使用不同的方法:

Dim old_data() As Variant
Dim r As Range
Set r = ThisWorkbook.Sheets("old").Range("A1:G" & old_rows)
old_data = r

导致整个old_data阵列恰好充满零。
救命啊!

qlckcl4x

qlckcl4x1#

由于您要分配一个二维数组,因此请使用Dim old_data As Variant而不是Dim old_data() As Variant(删除大括号)

相关问题