首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA代码:将水平单元格区域转换成垂直单元格区域

VBA代码:将水平单元格区域转换成垂直单元格区域

作者头像
fanjy
发布于 2022-11-16 02:42:07
发布于 2022-11-16 02:42:07
1.7K00
代码可运行
举报
文章被收录于专栏:完美Excel完美Excel
运行总次数:0
代码可运行

标签:VBA

下图1所示是一个常见的需求,在多个列中放置着每个月份的数据,需要将月份移到单个列中,同时保留报表中的所有描述性信息。

图1

数据显示了有关部门、账户和成本中心的描述性信息,而月度数据显示在许多列中。现在希望看到的是,左侧3列上的数据重复,而财务数据则逐行重复。数据输出如下图2所示。

图2

这可以使用一个简单的VBA程序来实现。首先,需要两个数组,一个将保存原始数据,另一个将新格式化的数据放在其中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sub Transpose()
    Dim ws As Worksheet
    Dim sh As Worksheet
    Dim ar
    Dim var()
    Dim i As Long
    Dim n As Long
    Dim k As Integer
    Dim j As Integer
    Set ws = Sheet1 '原始数据
    Set sh = Sheet2 '结果工作表
    sh.[A1].CurrentRegion.Offset(1).ClearContents
    ar = ws.UsedRange
    For i = 2 To UBound(ar, 1)
        For j = 4 To 15
            n = n + 1
            ReDim Preserve var(1 To 5, 1 To n)
            For k = 1 To 3
                var(k, n) = ar(i, k)
            Next k
            var(4, n) = ar(1, j) '日期
            var(5, n) = ar(i, j) '月度数据
        Next j
    Next i
    sh.[A2].Resize(n, 5) = WorksheetFunction.Transpose(var)
End Sub

工作簿中有两个工作表——Data工作表和Output工作表,工作表代码名称分别是Sheet1和Sheet2。

第一个数组变量称为ar,此数组将数据存储在许多列中。它拾取已使用的单元格区域:

ar=ws.UsedRange

Data工作表中的所有数据都存储这个变量中。

在此之后,需要循环遍历15列(3个描述性列和12个数字列)。将ar变量中这15列转换为输出变量var中的5列数据集,然后将数据输出到Output工作表。

For i=2 To UBound(ar,1)

原始循环从第2行开始,因为忽略了标题,这5列的标题位于Output工作表的第1行。UBound语句代表上限,它是变量ar中的行数——数据集中有10行,因此它从2循环到10。第一行包含我们忽略的标题。

下面是将数字垂直翻转的循环。因此,第4列变为第2行,第5列变为第3行,以此类推。

For j=4 To 15

这是第4列(Jan)到第15列(Dec)。

接下来的两行是计数器和使变量var动态的语句。

n=n+1

ReDim Preserve var(1 To 5,1 To n)

第一行中的n是一个计数器,它只是一种跟踪我们要放置数据的行的方法。ReDim行是动态魔术发生的地方。也就是说,变量var的宽度将为5列,并且将从1运行到列表n所表示的长度,因此是一个5 X n的表,其中5表示列,n是这些列的长度。

下面是希望在12个月内重复的数据的循环构造。这将是部门、账户和成本中心。

For k = 1 To 3

var(k, n) = ar(i, k)

Next k

循环从第1列开始,一直转到第3列。这个过程使var等于数组ar中的值,在这种情况下,它将是由ar(i,k)表示的ar(2,1)。第一个实例中的变量i将等于2,因此ar(i=ar(2,第一个实例中变量k将等于1,因此ar(2,1),其中1是循环第一部分上的k,当循环从1到3时,列将从列1移动到2和3,而行将保持在2。因此,第2行将使用此简单循环填写部门、账户和成本中心数据。

以下应该是困难的部分,但由于数据在列方面是静态的,因此这部分非常简单。

var(4, n) = ar(1, j)

查看日期并将其从第1行转换为所有其他行。变量(var)的第一部分等于var(4,n),其中4是日期所在的列号,n是从2增长到单元格区域底部的行号。数组变量ar的引用是ar(1,j),其中行是1,列是j,由列4至15表示。循环将从4开始,每个循环迭代1次,直到达到15。

第二部分是将金额添加到第5列。

var(5, n) = ar(i, j)

var(5,n)是第5列和第n行。n将随着i循环行的每次迭代逐行增长:

n=n+1

这表示n等于自身加1。在第一个实例中,这是1,然后随着i循环的每次迭代,它将增长1。数组ar(i,j)只是对随着两个循环i和j的每次迭代而增长的行i和列j的引用。

运行完所有循环后,该过程就基本完成了。这是一个运行速度非常快的过程。最后一步是转置:

sh.[A2].Resize(n, 5) = WorksheetFunction.Transpose(var)

上面的代码是从第2行开始,并将区域调整为n所在的任何值,因此可能是108行,共有5列。变量var是被转换的区域。

如果你碰到类似的情形,可以结合实际对上述代码稍作调整,以满足特定的需求。

注:本文学习整理自thesmallman.com,有兴趣的朋友可以到该网站下载示例工作簿,也可以到知识星球App完美Excel社群下载示例工作簿。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QT应用编程: Qt数据类型和(ActiveX)COM接口数据类型对应关系
QT调用COM组件方式示例: https://blog.csdn.net/xiaolong1126626497/article/details/113127300?spm=1001.2014.3001
DS小龙哥
2022/01/07
1.2K0
【QT】QT容器
隐式数据共享类当作为函数参数传递的时候,不仅安全而且效率很高,因为传递的时候只是传递了数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。
半生瓜的blog
2023/05/13
3.7K0
【QT】QT容器
qml类型有那些?
以表格方式列出支持那些类型。 Qml类型与Qt类型对照表 Qml类型 Qt类型 bool bool int unsigned int, int double double real float, qreal string QString url QUrl color QColor font QFont date QDateTime point QPoint, QPointF size QSize, QSizeF rect QRect, QRectF matrix4x4 QMatrix4x4 quaterni
Qt君
2019/08/27
1.6K0
Qt操作Sqlite类封装,及命令行导入csv文件到Sqlite数据库
这里记录下导入csv文件到sqlite数据库的操作方法及sqlite的封装,留作备忘。
杨永贞
2022/08/11
2K0
Qt操作Sqlite类封装,及命令行导入csv文件到Sqlite数据库
4. Qt的容器类
QList类、QLinkedList类和QVector类常常使用到的Qt容器类有QList、QLinkedList和QVector等。在开发一个较高性能需求的应用程序时。程序猿会比較关注这些容器类的执行效率。下表列出了QList、QLinkedList和QVector容器的时间复杂度。
全栈程序员站长
2022/07/07
1.2K0
4. Qt的容器类
一种基于QT应用程序封装JsonRpc2.0协议请求对象的便捷方法
之前一直用的是cJSON库来封装和解析,写久了感觉实在太丑,又难维护,于是还是研究下QT原生的QJson是否有更优雅的方法来封装一些Json对象,果不其然,通过阅读QT开发文档发现,QT封装的Json非常强大,其中Json对象可以有很多种形式,我们看到qjsonobject.h中:
杨源鑫
2023/10/09
5510
一种基于QT应用程序封装JsonRpc2.0协议请求对象的便捷方法
C/C++ Qt 常用数据结构
QT是一个跨平台的图形化类库,常用数据结构就是对C++ STL的二次封装,使其更加易用,如下是经常会用到的一些数据结构和算法笔记。
王瑞MVP
2022/12/24
1.6K0
C++ Qt开发:使用关联容器类
当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。
王瑞MVP
2023/12/11
9310
QMap与QHash
转载:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html
全栈程序员站长
2022/09/02
5160
QMap类说明[通俗易懂]
QMap是一个模板类,提供了一个红黑树结构的查找字典。 注:红黑树结构是自平衡二叉树
全栈程序员站长
2022/09/02
2.2K0
QMap详解「建议收藏」
QMap<Key,T>是Qt容器类型的一种,它通过(Key, value)存储一对值,并通过Key可以查找与之关联的value的值。
全栈程序员站长
2022/09/02
3.7K0
16.QT-QMap和QHash解析
QMap QMap原型为class QMap <K,T>,其中K表示键,T表示值,K和T属于映射关系. QMap会根据K来自动进行升序键排序 QMap中的K类型必须重载operator <  QMap常用函数如下: const Key QMap::key ( const T & value ); //通过值来找键,若未找到则返回0,由于只对K键进行排序,所以该函数不是快速查找 const T QMap::value ( const Key & key
诺谦
2018/05/28
2.3K0
C++ Qt开发:DateTime日期时间组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QDateTime日期与时间组件的常用方法及灵活运用。
王瑞MVP
2023/12/16
1K0
C++ Qt开发:DateTime日期时间组件
c++ 容器类_下面属于容器类的是
STL(Standard Template Library)的六大组件:容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。其交互关系:容器通过空间配置器取得数据存储空间,空间配置器通过迭代器存取容器的内容,仿函数可以协助空间配置器完成不同的策略变化,配接器可以修饰或套接仿函数。
全栈程序员站长
2022/09/30
1.3K0
c++ 容器类_下面属于容器类的是
Qt 模拟 HTTP 表单提交文字或文件到服务器
传统通过 HTTP 表单的方式来上传文件在 Web 中实现是非常简单的,一个表单中加几个域填写上对应的内容提交就可以了,但如果通过 Qt 来实现就相对麻烦一点,不过我都总结好了代码,直接使用就可以了。
我与梦想有个约会
2020/01/04
3.7K0
14.QT-QFile文件,QBuffer缓冲区,QDir目录,QFileSystemWatcher文件系统监视
QFile Qt中所有与IO相关的类都继承于QIODevice,继承图如下所示: 其中QFile类便是用于文件操作的类 在QT中,将文件当做一种特殊的外部设备对待(比如:串口,usb等就是外部设备)
诺谦
2018/05/28
2.4K0
Qt开源网络库[4]-原理篇下
上一篇分析到原理上,主要讲述的是builder模式设计与HttpService,HttpRequest的原理和实现。本篇将会讲到HttpResponse的响应机制与自动推导接收者(槽函数)的实现。
Qt君
2019/07/15
9830
qml 结合 QSqlTableModel 动态加载数据 MVC「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127739.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
1.2K0
qml 结合 QSqlTableModel 动态加载数据 MVC「建议收藏」
Qt开源网络库[2]-接口篇
上一篇介绍了Qt开源网络库,有兴趣的可以翻开往期推送.今篇主要介绍该开源网络库接口的用法.
Qt君
2019/07/15
1.8K0
翻译 | QMap与QHash小基准
  在我的Qt开发者日2012演示文稿(深入探讨QtCore)时,我做了一个比较QMap和QHash的基准。我认为在这篇简短的博客文章中分享结果会很不错。
Qt君
2019/09/18
9240
翻译 | QMap与QHash小基准
相关推荐
QT应用编程: Qt数据类型和(ActiveX)COM接口数据类型对应关系
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档