type
status
date
slug
summary
tags
category
icon
password
是否阅读
是否阅读
Origin
URL
什么是文本透视?
把文本根据某个维度聚合后转置
大概就是下面这个效果(点开看动图)

是不是还蛮有用的?
在阅读下文之前,饼干建议你有一定的 VBA 基础
- 知道【字典】是什么
- 知道【二维数组】是什么
否则可能无法体会到下面的代码是如何把这两者融合来实现文本透视功能的
〇、解题思路
思路很简单,就三步
- 构造一个字典:红色箭头,确定在结果数组内的行号
- 构造当前列数组:蓝色箭头,确定在结果数组内的列号
- 将待透视的数据映射到结果数组:绿色箭头

一、声明变量
首先我们需要声明我们接下来需要用到的一些变量
- 声明一个对象(之后可以绑定为字典)
- 声明数据范围和数据数组
- 声明结果范围和结果数组及最大行号和列号
- 声明循环变量及当前行号和列号
二、变量赋值
第二步就是给部分变量赋【初值】
- 通过后期绑定创建字典对象
- 通过输入框获取数据范围和结果范围
- 将数据范围的值赋给数据数组 (1 to n , 1 to 2)
- 重声明结果数组为二维数组 (1 to n , 0 to n)
- 重声明当前列数为一维数组 (1 to n)
三、主体循环
主体循环是一个遍历数据数组行数的 For 循环
在这个循环中包含了两部分
3.1 判断
这个判断的目的在于 获取当前行号
如果字典中存在当前值
- 【当前行号】取字典的值
如果字典中不存在当前值
- 新增【最大行号】为原【最大行号】+1
- 【当前行号】为新增【最大行号】
- 设置字典【当前值】的值为【当前行号】
- 将【当前行】的第 1 列赋值到【结果数组】的【当前行号】行,第 0 列
3.2 映射
上一步已经取到了【当前行号】
现在只需要计算出【当前列号】
就能够把原始数据映射到【结果数组】中
- 【当前列号数组】的第【当前行号】行,即【当前列号】 + 1
- 将【当前行】的第 2 列赋值给【结果数组】的第【当前行号】行,第【当前列号】列
- 冒泡法取【最大列号】
四、输出结果
主体循环结束后,【结果数组】就是我们想要的东西
- 释放字典对象内存
- 将【结果数组】的前【最大行号】行和【最大列号】列赋值给单元格
解锁环节
字典加数组的组合可以带来很大的想象空间
- 233 赞
饼干将根据评论区的建议优化、增加该代码的功能
- 作者:木木
- 链接:https://blog.manyfun.top/technology/2025/01/07/1748261a-f542-806e-b6cd-d86fd46c32fb
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
