作者:绿色风
分类:
时间:2022-08-18
浏览:104
楼主 DJ_Soo |
基本上,我们在VBA中需要将数组转置的时候都会用application.Transpose(arr)这样的形式. 但是一定有人会发现这样做的弊端. 比如,我是一个二维数组,我转置的时候希望这个二维数组不要变成一维的.什么样的情况二维会被转为一维呢?我们举例来看: Sub Test() Dim arr As Variant Dim arrTmp arr = [A1:A15] arrTmp = Application.Transpose(arr) Stop End Sub arr本来结构是arr(1 to 15,1 to 1)的,但是转置之后变成了一维的arrTmp(1 to 15),但是我想要的结果是arr(1 to 1,1 to 15)这样的啊! 另外,application.index()的用法也会将二维截取为一维,有时我们会喜欢并且确实的想转换为一维,但有时这样用却会导致意想不到的错误.所以,为了区别开来,我们最好还是自定义一个专用于二维数组的转置函数:
- Function Transpose(arr As Variant)
- Dim arrTmp() As String
- Dim lstRo As Long
- Dim Ro As Long
- Dim lstCol As Long
- Dim Col As Long
- Dim lRo As Byte
- Dim lCol As Byte
- lstRo = UBound(arr, 1)
- lstCol = UBound(arr, 2)
- lRo = LBound(arr, 1)
- lCol = LBound(arr, 2)
- ReDim arrTmp(lCol To lstCol, lRo To lstRo)
- For Ro = lRo To lstRo
- For Col = lCol To lstCol
- arrTmp(Col, Ro) = arr(Ro, Col)
- Next Col
- Next Ro
- Transpose = arrTmp
- End Function
写代码的时候根据需要调用工作表函数或者自定义函数,这样会感觉方便许多. |
2楼 i彳亍 |
多谢楼主无私共享!学习了! |
3楼 i彳亍 |
多谢楼主无私共享!学习了! |
4楼 angel928 |
保存下来学习。 |
5楼 DJ_Soo |
最小下标固定为1- Function Transpose(arr As Variant)
- Dim arrTmp() As String
- Dim lstRo As Long
- Dim Ro As Long
- Dim lstCol As Long
- Dim Col As Long
- Dim lRo As Byte
- Dim lCol As Byte
- lstRo = UBound(arr, 1)
- lstCol = UBound(arr, 2)
- lRo = LBound(arr, 1)
- lCol = LBound(arr, 2)
- ReDim arrTmp(1 To lstCol - lCol + 1, 1 To lstRo - lRo + 1)
- For Ro = 1 To lstRo - lRo + 1
- For Col = 1 To lstCol - lCol + 1
- arrTmp(Col, Ro) = arr(Ro + lRo - 1, Col + lCol - 1)
- Next Col
- Next Ro
- Transpose = arrTmp
- End Function
|
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一