Excel·VBA表格横向、纵向相互转换

在这里插入图片描述
如图:对图中区域 A1:M6 横向表格,转换成区域 A1:C20 纵向表格,即 B:M 列转换成每2列一组按行写入,并删除空行。同理,反向操作就是纵向表格转换成横向表格

目录

    • 横向转纵向
      • 实现方法1
        • 转换结果
      • 实现方法2
        • 转换结果
    • 纵向转横向
      • 转换结果

横向转纵向

实现方法1

本文图1中,按“交期和交货数量”每5行2列为一组,依次按行写入,即按“交期”顺序排列

Sub 表格横向转纵向1()'分段转换,转换列之前同名不连续;不使用动态获取每行最后一列是考虑到部分选中拆分Dim num_col&, title_row&, del_empty As Boolean, rng As Range, del_rng As RangeDim first_col&, resize_r&, resize_c&, keep_rng, arr, brr, b$, r&, i&, j&
'--------------------参数填写:num_col、title_row都为数字,选中后才可运行代码num_col = 2    '需要拆分的数据每行固定的列数title_row = 1  '表头行数del_empty = True  '是否删除空行If Selection.Count = 1 Then Debug.Print "未选中列,无法运行代码": Exit SubSet rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算'选中区域开始列号,转换行数、列数first_col = rng.column: resize_r = rng.Rows.Count - title_row: resize_c = rng.Columns.CountIf resize_c Mod num_col <> 0 Then Debug.Print "选中列数不可平分": Exit SubWith ActiveSheetkeep_rng = .Cells(title_row + 1, 1).Resize(resize_r, first_col - 1)  '不变区域arr = .Cells(title_row + 1, first_col).Resize(resize_r, resize_c)    '转换区域r = title_row + 1  '写入行号For i = num_col + 1 To UBound(arr, 2) Step num_colr = r + resize_r: .Cells(r, 1).Resize(resize_r, first_col - 1) = keep_rngFor j = 1 To num_colbrr = Application.index(arr, , i + j - 1)  '按列拆分.Cells(r, first_col + j - 1).Resize(resize_r, 1) = brrNextNextIf del_empty Then  '删除空行For i = title_row + 1 To r + resize_rbrr = .Cells(i, first_col).Resize(1, num_col)b = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(brr)), "")If Len(b) = 0 ThenIf del_rng Is Nothing ThenSet del_rng = .Rows(i)ElseSet del_rng = Union(del_rng, .Rows(i))End IfEnd IfNextIf Not del_rng Is Nothing Then del_rng.Delete  '删除行End If.Cells(1, first_col + num_col).Resize(1, resize_c - num_col).EntireColumn.Delete  '删除选中列End With
End Sub

转换结果

本文图1(转换前不含7-20行),选中 B:M 列,运行代码得到如下图结果: D:M 列被删除
在这里插入图片描述

实现方法2

本文图1中,按“产品规格”每个产品后面6组“交期和交货数量”转换为每6行2列,依次按行写入,即按“产品”顺序排列

以下代码使用了数组行列数转换函数,调用了wraparr函数,代码详见《Excel·VBA单元格区域行列数转换函数》(如需使用代码需复制)

Sub 表格横向转纵向2()'按行转换,转换列之前同名连续;不使用动态获取每行最后一列是考虑到部分选中拆分Dim num_col&, title_row&, del_empty As Boolean, rng As Range, del_rng As RangeDim first_col&, last_row&, resize_r&, resize_c&, keep_rng, arr, brr, b$, r&, i&, j&
'--------------------参数填写:num_col、title_row都为数字,选中后才可运行代码num_col = 2    '需要拆分的数据每行固定的列数title_row = 1  '表头行数del_empty = True  '是否删除空行If Selection.Count = 1 Then Debug.Print "未选中列,无法运行代码": Exit SubSet rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算'选中区域开始列号、结束行号,转换行数、列数first_col = rng.column: last_row = rng.Rows.Countresize_r = rng.Rows.Count - title_row: resize_c = rng.Columns.Count: r = resize_c / num_colIf resize_c Mod num_col <> 0 Then Debug.Print "选中列数不可平分": Exit SubWith ActiveSheetFor i = last_row To title_row + 1 Step -1  '倒序循环keep_rng = .Cells(i, 1).Resize(1, first_col - 1)  '不变区域arr = .Cells(i, first_col).Resize(1, resize_c)    '转换区域arr = wraparr(arr, "row", r)  '调用函数将arr转换为r行num_col的数组.Cells(i + 1, 1).Resize(r - 1, 1).EntireRow.Insert  '插入行.Cells(i, 1).Resize(r, first_col - 1) = keep_rng.Cells(i, first_col).Resize(r, num_col) = arrNextIf del_empty Then  '删除空行j = (last_row - title_row) * r + title_row  '总行数For i = title_row + 1 To jbrr = .Cells(i, first_col).Resize(1, num_col)b = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(brr)), "")If Len(b) = 0 ThenIf del_rng Is Nothing ThenSet del_rng = .Rows(i)ElseSet del_rng = Union(del_rng, .Rows(i))End IfEnd IfNextIf Not del_rng Is Nothing Then del_rng.Delete  '删除行End If.Cells(1, first_col + num_col).Resize(1, resize_c - num_col).EntireColumn.Delete  '删除选中列End With
End Sub

转换结果

本文图1(转换前不含7-20行),选中 B:M 列,运行代码得到如下图结果: D:M 列被删除
在这里插入图片描述

纵向转横向

使用自定义函数转换,具体说明见注释(key_col(0)为开始列号,之前的都为字典键,之后的都为待转换数据)

Function 纵向转横向(ByVal data_arr, ByVal key_col)  '按非key_col列为键横向合并数组'转换函数,arr为待转换数组(从1开始计数二维数组),key_col为列号数组(从0开始计数一维数组)'返回结果,从1开始计数二维数组;key_col(0)为开始列号,key_col(1)为结束列号,键在开始列号之前Dim dict As Object, num_col&, delimiter$, i&, j&, r&, c&, k$, max_c&, rr&, cc&If Not IsArray(data_arr) Or Not IsArray(key_col) Then Debug.Print "错误!参数都为数组": Exit FunctionSet dict = CreateObject("scripting.dictionary")num_col = key_col(1) - key_col(0) + 1: delimiter = Chr(28)  '分隔符ReDim res(1 To UBound(data_arr), 1 To UBound(data_arr) * num_col)For i = LBound(data_arr) To UBound(data_arr)k = ""For j = 1 To key_col(0) - 1k = k & delimiter & data_arr(i, j)NextIf Not dict.Exists(k) Thenr = r + 1: dict(k) = Array(r, key_col(0))For j = 1 To key_col(0) - 1res(r, j) = data_arr(i, j)NextElsec = dict(k)(1) + num_col: dict(k) = Array(dict(k)(0), c)max_c = WorksheetFunction.Max(max_c, c)  '最大列数End Ifrr = dict(k)(0): cc = dict(k)(1) - 1For j = key_col(0) To key_col(1)cc = cc + 1: res(rr, cc) = data_arr(i, j)NextNextReDim result(1 To r, 1 To max_c + num_col - 1)  '去除res数组多余部分For i = 1 To UBound(result)For j = 1 To UBound(result, 2)result(i, j) = res(i, j)NextNext纵向转横向 = result
End Function

转换结果

对“横向转纵向”无论是方法1还是方法2,生成的结果进行如下转换,生成的“纵向转横向”结果都一致,如下图

Sub 表格纵向转横向()Dim arr, brrarr = [a2:c20]: brr = 纵向转横向(arr, Array(2, 3))[d1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

在这里插入图片描述
多列键也可使用自定义函数转换,更具通用性

Sub 表格纵向转横向()Dim arr, brrarr = [a2:d20]: brr = 纵向转横向(arr, Array(3, 4))[f1].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub

在这里插入图片描述
附件:《Excel·VBA表格横向、纵向相互转换(附件)》

扩展阅读:
《excelhome-多列转3列》
《excel吧-3列转多列》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《吐血整理》高级系列教程-吃透Fiddler抓包教程(30)-Fiddler如何抓Android7.0以上的Https包-番外篇

1.简介 通过宏哥前边几篇文章的讲解和介绍想必大家都知道android7.0以上&#xff0c;有android的机制不在信任用户证书&#xff0c;导致https协议无法抓包。除非把证书装在系统信任的证书里&#xff0c;此时手机需要root权限。但是大家都知道root手机是非常繁琐的且不安全&…

HDFS中的sequence file

sequence file序列化文件 介绍优缺点格式未压缩格式基于record压缩格式基于block压缩格式 介绍 sequence file是hadoop提供的一种二进制文件存储格式一条数据称之为record&#xff08;记录&#xff09;&#xff0c;底层直接以<key, value>键值对形式序列化到文件中 优…

动态规划(一)

一、背包问题 1.1 01背包问题 特点:每件物品最多只用于一次 属性包括:最大值(Max)、最小值(Min)、数量 #include<iostream> #include<algorithm>using namespace std;const int N 1010;int n,m; int v[N],w[N]; int f[N][N];int main() {cin>>n>>m;…

MyCat概述

1.MyCat概述 MyCat是阿里巴巴的产品&#xff0c;他是开源的、基于Java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用mycat&#xff0c;对于开发人员来说根本感觉不到mycat的存在。 MyCat下载地址&#xff1a;http://dl.mycat.org.cn/ MyCat官网&#xff1a;http:/…

CuratorFramework接口的作用和使用

CuratorFramework接口是Apache Curator库中的核心接口之一&#xff0c;用于与ZooKeeper集群进行交互。它提供了一组丰富的方法和功能&#xff0c;用于简化与ZooKeeper的交互操作&#xff0c;包括创建、删除、读取和更新节点等。 CuratorFramework接口的主要作用是封装了底层与…

【C语言进阶篇】模拟实现通讯录 (内附源码)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一 、 通讯录的简介1.1 联系人的类型定义1.2 通讯录的定义1.3 通讯录要实现的功能 二 、 如何…

计算机网络的定义和分类

计算机网络的定义和分类 计算机网络的定义 计算机网络的精确定义并未统一计算机网络最简单的定义是&#xff1a;一些互相连接的、自治的计算机的集合 互连:指计算机之间可以通过有线或无线的方式进行数据通信自治:是指独立的计算机&#xff0c;它有自己的硬件和软件&#xff…

Python语法:... for ... in ... if ...

Python中&#xff0c;for...in...[if]...语句是一种简洁的构建List的方法&#xff0c;从for给定的List中选择出满足if条件的元素组成新的List&#xff0c;其中if是可以省略的。下面举几个简单的例子进行说明 [for in ]: ...for ....in..... 语句. 实例如下&#xff1a; (1) …

PHP实现首字母头像

<?php $name"哈哈"; $logoletter_avatar($name);echo <img src".$logo." style" border-radius: 50%;">;function letter_avatar($text) {$total unpack(L, hash(adler32, $text, true))[1];$hue $total % 360;list($r, $g, $b) hs…

【go-zero】docker镜像直接部署API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…

Linux学习之正则表达式元字符和grep命令

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 正则表达式是一种搜索字符串的模式&#xff0c;通俗点理解&#xff0c;也就是普通字符和元字符共同组成的字符集合匹…

模板方法模式——定义算法的框架

1、简介 1.1、概述 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基本方法中。在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法…

vscode插件不能搜索安装

1 现象 vscode搜索自己的插件&#xff0c;报错&#xff1a; Error while fetching extensions. HXR failed2 原因 之前用vscode开发golang语言&#xff0c;设置了proxy代理&#xff0c;所以导致错误&#xff0c;删除即可 重启vscode 3 结果

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--功能实现【四】

文章目录 SSM--功能实现实现功能06-修改家居信息需求分析/图解思路分析代码实现注意事项和细节 实现功能07-删除家居信息需求分析/图解思路分析代码实现 实现功能08-分页显示列表需求分析/图解思路分析代码实现完成测试分页显示效果 SSM–功能实现 实现功能06-修改家居信息 需…

git之reflog分析

写在前面 本文一起看下reflog命令。 1&#xff1a;场景描述 在开发的过程中&#xff0c;因为修改错误&#xff0c;想要通过git reset命令恢复到之前的某个版本&#xff0c;但是选择提交ID错误&#xff0c;导致多恢复了一个版本&#xff0c;假定&#xff0c;该版本对应的内容…

macOS 环境变量加载探究

使用 macOS 安装环境&#xff0c;见到过很数种环境变量配置方法&#xff0c;每次也都是按照别人的代码&#xff0c;人家配置在哪 我就配置在哪&#xff0c;其实不太清楚有什么区别&#xff0c;决定记录下。 本机 macOS 13.3&#xff0c;从 macOS Catalina(10.15) 开始&#xf…

用html+javascript打造公文一键排版系统15:一键删除所有空格

现在我们来实现一键删除所有空格的功能。 一、使用原有的代码来实现&#xff0c;测试效果并不理想 在这之前我们已经为String对象编写了一个使用正则表达式来删除所有空格的方法&#xff1a; //功能&#xff1a;删除字符串中的所有空格 //记录&#xff1a;20230726创建 Stri…

腾讯云-宝塔添加MySQL数据库

1. 数据库菜单 2. 添加数据库 3. 数据库添加成功 4. 上传数据库文件 5. 导入数据库文件 6. 开启数据库权限 7. 添加安全组 (宝塔/腾讯云) 8. Navicat 连接成功

python 封装sql 增删改查连接MySQL

select * from Teacher limit 10 连接字符串配置MysqlConfig.py class MysqlConfig:HOST 192.168.56.210PORT 3306USER rootPASSWORD 1qaz0987654321DBStudentDBCHARSET utf8封装增删改查MysqlConnection.py Author: tkhywang 2810248865qq.com Date: 2023-06-19 15:44:48 Las…

rest api client code generator

一、搜索&#xff1a;REST API Client Code Generator 二、 安装成功后 配置java环境和node环境