Excel数组首行按每行数据降序排列自定义函数
1、功能:在表格或数值数组 (数组:用于建立可生成多个结果或可对在行和列中排列的一组参数进行运算的单个公式。数组区域共用一个公式;数组常量是用作参数的一组常量。)的首行,并在表格或数组中指定行的值降序返回首行所有数据对应排列组成文本串。
2、语法:
HDOCONCATENATE(table_array,Row_index_num)
Table_array 为需要在其中查找数据的数据表。使用对区域或区域名称的引用。
· Table_array 的第一行的数值可以为文本、数字或逻辑值。
· Table_array 的第二行起的数值为数字。
Row_index_num 为 table_array 中待返回的匹配值的行序号。Row_index_num 为 1 时,返回 table_array 第一行的数值,row_index_num 为 2 时,返回 table_array 第二行的数值,以此类推。
1、首先打开Microsoft Office Excel 2007,新建文档并保存文件名《Excel数组首行按每行数据降序排列自定义函数 .xlsm》(演示文件,下面代码复制到能运行宏的工作簿都可以)如图。
2、然后按下快捷键ALT+F11打开VBA(宏)编辑界面,然后点菜单栏【插入】下拉中列表中点【模块(M)】如图。
3、然后插入了一个模块1,在代码框中复制如下代码:
Option Base 1
Function HDOCONCATENATE(mm, n As Long) As String
'2020-8-8 22:48:26
Dim i As Long, j As Long
Dim mb, mc1, mcn, mmk
If IsArray(mm) Then
mb = mm
Else
On Error Resume Next
If mm.Rows.Count > 1 And mm.Columns.Count > 1 Then
mb = mm
Else
HDOCONCATENATE = "#VALUE!"
Exit Function
End If
If Err.Number <> 0 Then
HDOCONCATENATE = "#VALUE!"
Exit Function
End If
Err.Clear
End If
If n < 1 Or n > UBound(mb, 1) Then
HDOCONCATENATE = "#VALUE!"
Else
mc1 = Application.Index(mb, 1, 0)
mcn = Application.Index(mb, n, 0)
Erase mb
mmk = Split(SZSX(mcn), ",")
With CreateObject("scripting.dictionary")
For i = 1 To UBound(mc1)
For j = 1 To UBound(mc1)
If mmk(i - 1) = CStr(mcn(j)) Then
If .Exists(j) = False Then
.Add j, i
HDOCONCATENATE = HDOCONCATENATE & CStr(mc1(j))
Exit For
End If
End If
Next j
Next i
End With
End If
End Function
Function SZSX(m As Variant)
'2020-7-8 22:50:12
Dim sz As Object, t As Variant
Set sz = CreateObject("MSScriptControl.ScriptControl")
sz.Language = "javascript"
t = Join(m, ",")
sz.addcode "function aa(bb){sz=bb.split(',');sz.sort(function(a,b){return a-b;});sz.reverse();return sz;}"
SZSX = sz.eval("aa('" & t & "')")
End Function
4、以上操作动态过程如下:
1、通过实例填写公式如下:
公式 说明(结果)
=HDOCONCATENATE($A$1:$J$10,2) 5682014937
=HDOCONCATENATE($A$1:$J$10,M2) M2为2,5682014937
=HDOCONCATENATE({1,2,3;2,4,5},2) 321
=HDOCONCATENATE({1,2,3;2,4,5},M2) M2为2, 321
2、如果需升序使用上回分享的《Excel怎样从数据集选r个数据排列组合列表(一)》的SZSX代码。
3、如果觉得这篇经验帮到了您,请点击下方的 “投票点赞" 或者“收藏”支持我!还有疑问的话可以点击下方的 “我有疑问”,谢谢啦!