VBA数组写入Excel工作表仅填充首个元素问题求助
问题原因与解决办法
问题根源
这是VBA数组与Excel单元格区域赋值的方向不匹配导致的:
- 你声明的
HighScoreOneHourDates、HighScoreOneHourData是一维数组,VBA中一维数组默认按**横向(行方向)**存储数据。 - 而目标区域
A1:Axx、B1:Bxx是**纵向(列方向)**的单元格区域。直接将横向数组赋值给纵向区域时,Excel会把数组的首个元素重复填充到区域的所有单元格中。
解决办法
有两种实用的修复方式:
方式1:转置数组匹配区域方向
将最后两行代码修改为:
SortSheet.Range("A1:A" & UBound(HighScoreOneHourDates)) = WorksheetFunction.Transpose(HighScoreOneHourDates) SortSheet.Range("B1:B" & UBound(HighScoreOneHourData)) = WorksheetFunction.Transpose(HighScoreOneHourData)
通过Transpose函数把横向数组转为纵向结构,和目标单元格区域方向对齐,就能正确写入所有元素。
方式2:直接声明二维数组(推荐)
从一开始就把数组声明为单列二维数组,从根源上匹配单元格区域的纵向结构:
Dim HighScoreOneHourData() As Integer Dim HighScoreOneHourDates() As String ' 声明为行数可变、列数固定为1的二维数组 ReDim HighScoreOneHourData(1 To UBound(SA, 1) - 3, 1 To 1) ReDim HighScoreOneHourDates(1 To UBound(SA, 1) - 3, 1 To 1) For j = 4 To UBound(SA, 1) HighScoreOneHourData(j - 3, 1) = CInt(Val(SA(j, PositionInArray + DataColumn + 2))) HighScoreOneHourDates(j - 3, 1) = SA(j, 1) Next j ' 直接赋值,无需转置 SortSheet.Range("A1:A" & UBound(HighScoreOneHourDates, 1)) = HighScoreOneHourDates SortSheet.Range("B1:B" & UBound(HighScoreOneHourData, 1)) = HighScoreOneHourData
这种方式无需额外转置操作,运行效率也更高。
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

