VBA中水平数组转置为垂直数组后MsgBox失效问题排查
VBA Transpose转置数组后Join运行异常问题
VBA开发中,将水平数组通过Transpose方法转置为垂直数组后,即使两个数组返回的VarType完全相同,MsgBox仍无法正常运行,具体复现场景如下:
水平数组转置场景(运行异常)
Dim Horizontal_Array As Variant Horizontal_Array = Worksheets(sh.name).Range("A1:C1") Horizontal_Array = Application.WorksheetFunction.Transpose(Horizontal_Array) MsgBox Join(Horizontal_Array, vbCrLf)
预期输出:Key1 Key2 Key3
垂直数组转置场景(运行正常)
Dim Vertical_Array As Variant Vertical_Array = Worksheets(sh.name).Range("A1:A4") Vertical_Array = Application.WorksheetFunction.Transpose(Vertical_Array) MsgBox Join(Vertical_Array, vbCrLf)
实际输出:Key1 One Four Seven
测试数据源
| Key1 | Key2 | Key3 |
|---|---|---|
| One | Two | Three |
| Four | Five | Six |
| Seven | Eight | Nine |
故障原因
- 所有从Excel单元格区域直接读取赋值的数组均为二维数组,单行区域维度为
(1 To 1, 1 To 列数),单列区域维度为(1 To 行数, 1 To 1) Join函数仅支持一维数组作为入参,无法直接处理二维数组WorksheetFunction.Transpose存在特殊转置逻辑:- 对多行1列的二维数组做1次转置,会直接返回长度为原数组行数的一维数组,因此垂直数组场景下单次转置后即可被
Join正常处理 - 对1行多列的二维数组做1次转置,返回的是多行1列的二维数组,不符合
Join的入参要求,因此运行报错
- 对多行1列的二维数组做1次转置,会直接返回长度为原数组行数的一维数组,因此垂直数组场景下单次转置后即可被
修复方案
处理单行水平区域数组时,连续执行2次Transpose即可得到符合要求的一维数组:
Dim Horizontal_Array As Variant Horizontal_Array = Worksheets(sh.name).Range("A1:C1") ' 两次转置:第一次将单行二维数组转为单列二维数组,第二次将单列二维数组转为一维数组 Horizontal_Array = Application.WorksheetFunction.Transpose( _ Application.WorksheetFunction.Transpose(Horizontal_Array) _ ) MsgBox Join(Horizontal_Array, vbCrLf)
内容的提问来源于stack exchange,提问作者Finntech
相关产品推荐
相关产品推荐

