ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3127|回复: 8

[分享] 自定义数组转置函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-24 11:02 | 显示全部楼层 |阅读模式
本帖最后由 microyip 于 2018-12-25 08:30 编辑

很经常发生使用系统数组转置函数Application.WorksheetFunction.Transpose时出错的情况,目前个人碰到的原因无非就是两种:1、数组元素超过65536和某元素长度超过255字符
2、SQL读取得到的数据里存在Null数值或者读取表里的数值存在错误值
为此,个人就建立了一个自定义转置函数,以便转换。又加上最近有朋友在论坛里咨询转置出错的解决方案,特此分享。如有不当之处,敬请高手指正。2018.12.25,更新代码,增加了转置结果形式
  1. Function TranVariant(ByVal vData As Variant, Optional ByVal bNoDimension2 As Boolean = False) As Variant
  2. '对二维以下进行转置数组
  3. '参数说明:
  4. '   bNoDimension,vData(2 To 3, 4 To 4)转置后是否转为vData(1 To 2)形式或vData(2 To 2, 3 To 4)转置后是否转为vData(1 To 2)形式
  5. '返回值说明:
  6. '      错误信息:数组维数大于2
  7. '      原vData值:非数组
  8. '      数组:已经按要求转置的数组
  9.     Dim nDimension As Integer '维度
  10.     Dim vNewData As Variant, nRow As Double, nCol As Double
  11.    
  12.     nDimension = -1
  13.     If IsArray(vData) Then
  14.         On Error Resume Next
  15.         Do While Err.Number = 0
  16.             nDimension = nDimension + 1
  17.             If nDimension = 0 Then
  18.                 vNewData = vData(LBound(vData)) '检查是否vData(1)形式数组
  19.                 If Err.Number = 0 Then Exit Do
  20.             Else
  21.                 vNewData = UBound(vData, nDimension + 1)
  22.             End If
  23.         Loop
  24.         Err.Clear
  25.         On Error GoTo 0
  26.    
  27.         If nDimension > 2 Then
  28.             vNewData = "数组维数大于2!"
  29.         ElseIf nDimension = 0 Then
  30.             ReDim vNewData(1 To 1, 1 To UBound(vData) - LBound(vData) + 1)
  31.             For nCol = 1 To UBound(vNewData, 2)
  32.                 If Not IsNull(vData(nCol + LBound(vData) - 1)) Then _
  33.                     vNewData(1, nCol) = vData(nCol + LBound(vData) - 1)
  34.             Next
  35.         ElseIf bNoDimension2 And (UBound(vData) = LBound(vData) Or UBound(vData, 2) = LBound(vData, 2)) Then
  36.             If UBound(vData) = LBound(vData) Then
  37.                 ReDim vNewData(1 To UBound(vData, 2) - LBound(vData, 2) + 1)
  38.                 For nCol = 1 To UBound(vNewData)
  39.                     If Not IsNull(vData(LBound(vData), nCol + LBound(vData, 2) - 1)) Then _
  40.                         vNewData(nCol) = vData(LBound(vData), nCol + LBound(vData, 2) - 1)
  41.                 Next
  42.             Else
  43.                 ReDim vNewData(1 To UBound(vData) - LBound(vData) + 1)
  44.                 For nRow = 1 To UBound(vNewData)
  45.                     If Not IsNull(vData(nRow + LBound(vData) - 1, LBound(vData, 2))) Then _
  46.                         vNewData(nRow) = vData(nRow + LBound(vData) - 1, LBound(vData, 2))
  47.                 Next
  48.             End If
  49.         Else
  50.             ReDim vNewData(1 To UBound(vData, 2) - LBound(vData, 2) + 1, 1 To UBound(vData) - LBound(vData) + 1)
  51.             For nRow = 1 To UBound(vNewData)
  52.                 For nCol = 1 To UBound(vNewData, 2)
  53.                     If Not IsNull(vData(nCol + LBound(vData) - 1, nRow + LBound(vData, 2) - 1)) Then _
  54.                         vNewData(nRow, nCol) = vData(nCol + LBound(vData) - 1, nRow + LBound(vData, 2) - 1)
  55.                 Next
  56.             Next
  57.         End If
  58.         
  59.         vData = vNewData
  60.     End If
  61.     TranVariant = vData
  62. End Function
复制代码





评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-24 11:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-24 12:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-12-24 12:42 | 显示全部楼层
本帖最后由 aman1516 于 2018-12-24 12:52 编辑

谢谢分享,更方便应用
老师能否结合 System.Collections.Sortedlist 自动排序的特性,加上递归,做个任意多Key的数组排序,
之前想写一个,但一直不知对应多Key时,如何递归处理其它各列数据,困扰多日......


TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-24 13:08 | 显示全部楼层
aman1516 发表于 2018-12-24 12:42
谢谢分享,更方便应用
老师能否结合 System.Collections.Sortedlist 自动排序的特性,加上递归,做个任意 ...

任意多个Key就没做过,但任意Key就有,请参考3楼的链接

TA的精华主题

TA的得分主题

发表于 2018-12-26 07:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-5-29 09:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-11-10 12:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Application.WorksheetFunction.Transpose为什么这个函数在xlsm表格中运行失败,而在xlsx中可以正常运行

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-11-10 13:16 | 显示全部楼层
双夕 发表于 2020-11-10 12:05
Application.WorksheetFunction.Transpose为什么这个函数在xlsm表格中运行失败,而在xlsx中可以正常运行

估计是你的xlsm有引用失败的引用
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 15:00 , Processed in 0.043577 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表