ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 自定义函数-多个区域/数组/常量转换为一维数组

自定义函数-多个区域/数组/常量转换为一维数组

作者:绿色风 分类: 时间:2022-08-18 浏览:117
楼主
DJ_Soo
写代码时有时会需要把多个数据整合起来,此代码达到一个整合的目的,且转换为一维数组.
参数中可以放入单元格区域,数组(二维或一维)或常量.或混合使用.
代码如下:
  1. Option Explicit


  2. '自定义函数Multi2Param
  3. '此函数对于多选区域/多个数组/多个常量参数或以上的几种混合情况下都可以将所有的数据整理为一维数组
  4. '如{1,2,3},4,5,{6,7,8},整理后为{1,2,3,4,5,6,7,8},且最小下标为1
  5. 'by Gao Dawei 2012.10.24

  6. Function Multi2Param(ParamArray arrRng() As Variant) As Variant
  7.     Dim arr() As Variant    '定义一个存放多个区域数据的数组,此数组为纯数据,而不存在object类型
  8.     Dim Rng As Variant      '定义临时的数组,可以接受单元格,数组和常量
  9.     Dim n As Integer        'Cnt的循环参数,从1开始循环
  10.     Dim Cnt As Integer      'Cnt对arrRng()中的数量进行统计
  11.     Dim arrRes() As Variant '定义最终的结果
  12.     Dim nElement As Long    '定义最终结果的个数,可能是单元格个数,数组个数和常数个数的相加总和
  13.     Dim i As Long           'nElement的循环参数
  14.    
  15.     Cnt = UBound(arrRng) + 1
  16.     ReDim arr(1 To Cnt) As Variant
  17.    
  18.     For Each Rng In arrRng
  19.         n = n + 1
  20.         arr(n) = Rng
  21.         If IsArray(arr(n)) Then
  22.             '判断是否为一维
  23.             If Dimension(arr(n)) = 1 Then
  24.                 nElement = nElement + (UBound(arr(n), 1) - LBound(arr(n), 1) + 1)
  25.             Else
  26.                 nElement = nElement + (UBound(arr(n), 1) - LBound(arr(n), 1) + 1) _
  27.                         * (UBound(arr(n), 2) - LBound(arr(n), 2) + 1)
  28.             End If
  29.         Else
  30.             nElement = nElement + 1
  31.         End If
  32.     Next Rng
  33.     '组织成为一维数组
  34.     Dim Var As Variant
  35.     ReDim arrRes(1 To nElement) As Variant
  36.     For Each Rng In arr '从arr中提取,避免判断是否为object(range)对象,因为此时都是数组和常量模式
  37.         '但还是需要判断是数组/常量
  38.         If IsArray(Rng) Then
  39.             For Each Var In Rng
  40.                 i = i + 1
  41.                 arrRes(i) = Var
  42.             Next Var
  43.         Else
  44.             i = i + 1
  45.             arrRes(i) = Rng
  46.         End If
  47.     Next Rng
  48.     Multi2Param = arrRes
  49. End Function

  50. '返回数组的维数
  51. Function Dimension(arr As Variant) As Integer
  52.     On Error Resume Next
  53.     Dim n As Integer
  54.     Dim i As Integer
  55.     If Not IsArray(arr) Then
  56.         Dimension = -1
  57.         Exit Function
  58.     End If
  59.     For i = 1 To 61
  60.         n = UBound(arr, i)
  61.         If Err.Number <> 0 Then
  62.             Dimension = i - 1
  63.             Exit Function
  64.         End If
  65.     Next
  66. End Function
2楼
纵鹤擒龙水中月
学习了

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap