Excel·VBA二维数组S形排列

与之前的文章《Excel·VBA螺旋数组函数》将一维数组转为二维螺旋数组

本文将数组转为S形排列的二维数组,类似考场座位S形顺序

vbnet 复制代码
Function S形排列(ByVal arr, ByVal num_rows&, ByVal num_cols&, Optional ByVal mode$ = "row")
    '将数组arr转为num_rows行 * num_cols列的S形排列二维数组(数组从1开始计数)
    '写入模式mode,row按行写入,col按列写入
    Dim a, brr, result, rc&, i&, j&, x&, y&
    rc = num_rows * num_cols: ReDim brr(1 To rc), result(1 To num_rows, 1 To num_cols)
    For Each a In arr  '多行多列的,按列从左往右读取,防止arr元素个数超出rc
        If x < rc Then x = x + 1: brr(x) = a
    Next
    If mode = "row" Then
        For i = 1 To num_rows
            If i Mod 2 = 1 Then
                For j = 1 To num_cols  '奇数行,从左往右写入
                    y = y + 1: result(i, j) = brr(y)
                Next
            Else
                For j = num_cols To 1 Step -1  '偶数行,从右往左写入
                    y = y + 1: result(i, j) = brr(y)
                Next
            End If
        Next
    ElseIf mode = "col" Then
        For j = 1 To num_cols
            If j Mod 2 = 1 Then
                For i = 1 To num_rows  '奇数列,从上往下写入
                    y = y + 1: result(i, j) = brr(y)
                Next
            Else
                For i = num_rows To 1 Step -1  '偶数列,从下往上写入
                    y = y + 1: result(i, j) = brr(y)
                Next
            End If
        Next
    End If
    S形排列 = result
End Function
  • 举例
vbnet 复制代码
Sub 测试()
    Dim arr, brr
    arr = [a1].CurrentRegion
    brr = S形排列(arr, 5, 4)
    [c1].Resize(UBound(brr), UBound(brr, 2)) = brr
    brr = S形排列(arr, 4, 5)
    [c8].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

按行写入再使用Transpose函数转置后的结果,与直接使用按列写入一致

vbnet 复制代码
Sub 测试()
    Dim arr, brr
    arr = [a1].CurrentRegion
    brr = WorksheetFunction.Transpose(S形排列(arr, 5, 4))
    [c1].Resize(UBound(brr), UBound(brr, 2)) = brr
    brr = S形排列(arr, 4, 5, "col")
    [c8].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub
相关推荐
过期的秋刀鱼!4 小时前
数据分析之技术干货业务价值 powerquery 分组排序后取TOP
数据挖掘·数据分析·excel·数据清洗·分组排序·powerquery·电商货品分析
凯子坚持 c9 小时前
Trae 宝藏功能实测:从 Mcp 搭建天气系统,到 AI 重塑 Excel 数据处理
java·人工智能·excel
二狗哈1 天前
制作一款打飞机游戏23:编辑器ui
ui·编辑器·excel
CodeCraft Studio1 天前
Excel处理控件Spire.XLS系列教程:Java设置Excel活动工作表或活动单元格
java·python·excel
CodeJourney.1 天前
深度探索:DeepSeek赋能WPS图表绘制
数据库·人工智能·算法·信息可视化·excel
努力的搬砖人.1 天前
在springboot项目中,如何进行excel表格的导入导出功能?
spring boot·后端·excel
java程序员CC2 天前
使用springboot+easyexcel实现导出excel并合并指定单元格
spring boot·后端·excel
我老菜2 天前
解析excel中的图片
java·excel
CodeCraft Studio2 天前
Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中进行数据验
开发语言·python·excel
时间之城2 天前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel