VBA将数组赋值到单元格区域返回全零问题求助
问题排查与解决
核心问题分析
问题根源在于数组维度与Excel单元格区域的匹配性:
- Excel的单元格区域(如单列
E1:E10)在VBA中对应的是二维数组(格式为Arr(行号, 列号),默认下标从1开始)。 - 你的
NumMatches是一维数组,直接赋值给列区域时,Excel无法正确映射维度;test22的下标声明错误,导致赋值的有效数据不在目标区域对应的数组位置里。
具体修复方案
方案1:修正test22的数组声明
把test22的下标改为从1开始,匹配Excel单元格的行号:
' 改为从1开始的二维数组,对应10行1列 Dim test22(1 To 10, 1 To 1) As Integer
这样循环赋值test22(iNum, 1)时,数据会直接对应到F1:F10的每个单元格,写入后就能正常显示。
方案2:直接将一维数组NumMatches转为二维数组写入
如果不想额外用test22,可以直接把一维数组转换为二维数组后赋值给单元格:
' 先将一维数组转为二维数组 Dim tempArr() As Integer ReDim tempArr(1 To UBound(NumMatches), 1 To 1) For iNum = 1 To UBound(NumMatches) tempArr(iNum, 1) = NumMatches(iNum) Next iNum ' 再写入单元格 Sheets("Info").Range("G1:G10").Value2 = tempArr
优化后的完整代码
Sub Comparor() Dim dat1() As Variant Dim dat2() As Variant dat1() = Sheets("Data1").Range("E1:E10").Value2 dat2() = Sheets("Data2").Range("E1:E10").Value2 Dim iTemp As Integer iTemp = CInt(UBound(dat1)) Dim NumMatches() As Integer ReDim NumMatches(1 To iTemp) ' 明确指定下标从1开始,避免混乱 Dim iCompareInner As Integer 'dat 2 cycler Dim iCompareOuter As Integer 'dat 1 cycler For iCompareOuter = 1 To UBound(dat1) For iCompareInner = 1 To UBound(dat2) If dat1(iCompareOuter, 1) = dat2(iCompareInner, 1) Then NumMatches(iCompareOuter) = NumMatches(iCompareOuter) + 1 End If Next iCompareInner Next iCompareOuter ' 修正test22的下标声明 Dim test22(1 To 10, 1 To 1) As Integer Dim iNum As Integer For iNum = 1 To UBound(NumMatches) test22(iNum, 1) = NumMatches(iNum) Debug.Print test22(iNum, 1) Next iNum Sheets("Info").Range("E1:E10").Value2 = dat1 Sheets("Info").Range("F1:F10").Value2 = test22 ' 处理NumMatches的二维转换 Dim tempArr() As Integer ReDim tempArr(1 To UBound(NumMatches), 1 To 1) For iNum = 1 To UBound(NumMatches) tempArr(iNum, 1) = NumMatches(iNum) Next iNum Sheets("Info").Range("G1:G10").Value2 = tempArr End Sub
额外提示
- VBA中数组默认下标从0开始,除非用
Option Base 1声明全局下标从1开始,否则建议在声明数组时明确指定下标范围(如1 To 10),避免维度混乱。 - 从单元格区域读取的数组默认是二维数组,即使是单列/单行,格式为
Arr(行, 列),写入时也要保持相同维度格式。
内容的提问来源于stack exchange,提问作者Casual Engineering
相关产品推荐
相关产品推荐

