Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VBA字典(详解,示例)「建议收藏」
如果对上面水果种类进行计数:countifs,只需要将分类汇总的值改为数值1即可,每出现一次‘+1’
全栈程序员站长
2022/07/22
7.2K1
VBA字典(详解,示例)「建议收藏」
几个有用的Excel VBA脚本
最近有个朋友要处理很多的Excel数据,但是手工处理又太慢,让我帮忙处理。通过搜索和自己的编写,帮他写了几个脚本,大大提高了工作效率。其实Excel中的脚本(宏)的功能非常方便,只要熟悉了Excel的对象,做一些常见的处理,还是非常容易的。
大江小浪
2018/07/25
1.7K0
EXCEL VBA语句集300
        定制模块行为 (1) Option Explicit ‘强制对模块内所有变量进行声明 Option Private Module ‘标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示  Option Compare Text ‘字符串不区分大小写  Option Base 1 ‘指定数组的第一个下标为1 (2) On Error Resume Next ‘忽略错误继续执行VBA代码,避免出现错误消息 (3) On Error GoTo ErrorHandler ‘当错误发生时跳转到过程中的某个位置 (4) On Error GoTo 0 ‘恢复正常的错误提示 (5) Application.DisplayAlerts=False ‘在程序执行过程中使出现的警告框不显示 (6) Application.ScreenUpdating=False ‘关闭屏幕刷新 Application.ScreenUpdating=True ‘打开屏幕刷新 (7) Application.Enable.CancelKey=xlDisabled ‘禁用Ctrl+Break中止宏运行的功能  工作簿 (8) Workbooks.Add() ‘创建一个新的工作簿 (9) Workbooks(“book1.xls”).Activate ‘激活名为book1的工作簿 (10) ThisWorkbook.Save ‘保存工作簿 (11) ThisWorkbook.close ‘关闭当前工作簿 (12) ActiveWorkbook.Sheets.Count ‘获取活动工作薄中工作表数 (13) ActiveWorkbook.name ‘返回活动工作薄的名称 (14) ThisWorkbook.Name ‘返回当前工作簿名称 ThisWorkbook.FullName ‘返回当前工作簿路径和名称 (15) ActiveWindow.EnableResize=False ‘禁止调整活动工作簿的大小 (16) Application.Window.Arrange xlArrangeStyleTiled ‘将工作簿以平铺方式排列 (17) ActiveWorkbook.WindowState=xlMaximized ‘将当前工作簿最大化  工作表 (18) ActiveSheet.UsedRange.Rows.Count ‘当前工作表中已使用的行数 (19) Rows.Count ‘获取工作表的行数(注:考虑向前兼容性) (20) Sheets(Sheet1).Name= “Sum” ‘将Sheet1命名为Sum (21) ThisWorkbook.Sheets.Add Before:=Worksheets(1) ‘添加一个新工作表在第一工作表前 (22) ActiveSheet.Move After:=ActiveWorkbook. _ Sheets(ActiveWorkbook.Sheets.Count) ‘将当前工作表移至工作表的最后 (23) Worksheets(Array(“sheet1”,”sheet2”)).Select ‘同时选择工作表1和工作表2 (24) Sheets(“sheet1”).Delete或 Sheets(1).Delete ‘删除工作表1 (25) ActiveWorkbook.Sheets(i).Name ‘获取工作表i的名称 (26) ActiveWindow.DisplayGridlines=Not ActiveWindow.DisplayGridlines ‘切换工作表中的网格线显示,这种方法也可以用在其它方面进行相互切换,即相当于开关按钮 (27) ActiveWindow.DisplayHeadings=Not ActiveWindow.DisplayHeadings ‘切换工作表中的行列边框显示 (28) ActiveSheet.UsedRange.FormatConditions.Delete ‘删除当前工作表中所有的条件格式 (29) Cells.Hyperlinks.Delete ‘取消当前工作表所有超链接 (30) ActiveSheet.PageSetup.Orientation=xlLandscape 或ActiveSheet.PageSetup.Orientation=2 ‘将页面设置更改为横向 (31) ActiveSheet.PageSetup.RightFooter=ActiveWorkbook.FullName ‘在页面设置的表尾中输入文件路径 ActiveSheet.PageSetup.Le
Tony老师
2020/03/05
3.1K0
使用字典汇总数据
以一个简单的数据集为例,通过唯一的标识符对其进行汇总。如果我们有一个水果店,想按售出的商品汇总销售额。如下图1所示。
fanjy
2022/11/16
9070
使用字典汇总数据
使用VBA在数组之间转移数据
本文展示如何将数据从一个数组移动到另一个数组,并转移后的数据输入到另一个位置。也就是说,如何使用第二个数组将数据从Excel中移出,并存储到内存中,然后再移回单元格中。
fanjy
2022/11/16
1.4K0
Vba菜鸟教程[通俗易懂]
官方文档:https://docs.microsoft.com/zh-cn/office/vba/api/overview/language-reference 代码完成后:工具-vbaproject属性-保护-查看时锁定-密码
全栈程序员站长
2022/09/05
19.5K0
Vba菜鸟教程[通俗易懂]
使用字典汇总数据(续)
在学习了《使用字典汇总数据》后,让我们再往前一步。假设我们的数据需要在多个列上进行检查。将A列中的数据链接到B列中的数据,以创建唯一标识符,希望基于2列创建汇总,而不只是前一个示例中所示的一个。假设供应商是Bob,Bob订购了Apple和Orange。订单分为6个不同行,但不是Apple就是Orange。
fanjy
2022/11/16
6290
使用字典汇总数据(续)
Excel VBA编程
在Excel中,数据只有文本,数值,日期值,逻辑值和错误值五种类型。但是在VBA中,数据类型跟Excel不完全相同。根据数据的特点,VBA将数据分为布尔型(boolean),字节型(byte),整数型(integer),单精度浮点型(single),双精度浮点型(double),货币型(currency),小数型(decimal),字符串型(string),日期型(date),对象型等等
全栈程序员站长
2022/08/11
49.5K0
Excel VBA编程
VBA代码:将垂直单元格区域转换成水平单元格区域
有时候,我们想将垂直列表中的数据转换为水平列表,通常可以使用数据透视表来完成。假设数据是唯一ID,并且客户端可以附加到相同的唯一ID,如下图1所示。
fanjy
2022/11/16
4600
VBA代码:将垂直单元格区域转换成水平单元格区域
VBA专题10-25:使用VBA操控Excel界面之一个示例程序
在前面的一系列主题中,你已经学到了很多小的修改工作簿外观的VBA代码。下面,我们将介绍一个简单的示例程序,实现下面的功能特点:
fanjy
2021/03/26
2.8K0
VBA专题10-25:使用VBA操控Excel界面之一个示例程序
使用Evaluate方法筛选数据
使用Evaluate方法对诸如工作表名称进行检查可以避免使用循环构造。本文将以示例展示它是如何操作的。
fanjy
2022/11/16
9650
使用Evaluate方法筛选数据
VBA用字典批量查找社保数据
【问题】我们知道社保导出的数据是很多合并的单元格,如果要查找一个数据都要找很久,如果数量多了更多费时,基于以上问题,特用VBA设计一个批量查找的程序。
哆哆Excel
2022/10/25
8240
VBA用字典批量查找社保数据
VBA示例:查找并分别列出找到的所有值
如下图1所示,有一系列数据,其中Yl代表“Yellow”,Re代表“Red”,Bl代表“Blue”,Gr代表“Green”。
fanjy
2024/06/04
8220
VBA示例:查找并分别列出找到的所有值
VBA数组用法案例详解
VBA数组还是很强大的,通过对单元格区域数据的读取,赋值给数组,再利用数组函数或者调用Excel内置函数进行相关处理。另外,数组在赋值计算效率上面也是非常高的,大家可以自行尝试下。
大师级码师
2022/11/06
2.4K0
VBA实战技巧34:使用VBA组织图形1
引言:本文的代码整理自mrexcel.com,一个很好的令人兴奋的示例,有兴趣的朋友可以仔细研究。
fanjy
2021/09/22
1.8K0
VBA收藏一常用的自定义函数
Sub 测试() If IsFileExists("D:\new_temp\") Then Debug.Print "存在" Else Debug.Print "不存在" End If End Sub '参数名称 含义 说明 'strShtName 指定工作表名称 必选 'strWbName 指定工作簿名称 可选 'Sub Demo() ' Debug.Print udfSheetExists("Sheet1") ' Debug.Print udfSheetExist
哆哆Excel
2022/10/25
6740
VBA收藏一常用的自定义函数
VBA与数据库——合并表格
在Excel里,如果需要把多个工作表或者工作簿的数据合并到一起,用VBA来做一个程序还是比较容易的,在多个工作簿合并到一个工作簿和多个工作表合并到一个工作表里有过介绍,代码不算很复杂。
xyj
2021/09/10
5.3K2
VBA与数据库——合并表格
VBA实现排列组合(可重复)
这么一个功能的使用场景可以是这样的,比如设置了一个6位数字的密码,但是忘记了,有一个程序可以快速的去测试密码,这时候就需要逐个去测试可能的密码。
xyj
2021/10/20
2.9K0
Excel VBA解读(144): 使用Application事件和缓存将更快地获取已使用单元格区域
在上一篇文章中,建议加速检索已使用单元格区域最后一行方法之一是使用缓存和Application对象的AfterCalculate事件。
fanjy
2019/07/18
2.5K0
示例讲字典(Dictionary):获取唯一值
字典(Dictionary)是一种通过键(key)和项(item)(注:键和项是字典中的术语)存储唯一项的方法。它是一种基于唯一键存储数据的极好工具,它的强大之处在于可以使用键来存储和合并数据。
fanjy
2022/11/16
5.3K0
示例讲字典(Dictionary):获取唯一值
相关推荐
VBA字典(详解,示例)「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验