使用VBA实现Excel合并相同内容的相邻单元格

写算法的数据分析时生成了csv文件,为了方便查看需要对部分单元格进行合并。

原始的CSV文件用Excel打开有大量如下形式的子表:

而我希望处理之后变成如下格式:

在网上搜索了很久,大多只能对某一列进行操作,而我需要对整个表格的行列都进行这个操作。

除此之外,因为是数据分析的表格,我还希望只对非数字开头的单元格进行合并,即行列标题。

经过多次尝试,终于在以前从来没用过VBA的情况下把这个问题解决了……

(写程序的过程中发现VBA的if居然没有短路操作,只好一层一层嵌套)

有两个值得注意的地方是,

首先,Excel中合并之后的单元格只有左上角的单元格保存的数值,所以需要从右下角往左上角合并;

其次,如果先合并了列,再合并行的话,会把当前单元格左上角的单元格也一起合并,而事实上那个单元格可能与当前单元格值不相同,

这时需要自己选择一个优先级,优先对行合并还是优先对列合并。

Sub MergeCellsWithSameValue()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim r As Integer
    Dim c As Integer

    Sheet1.UsedRange.EntireRow.AutoFit
    Sheet1.UsedRange.EntireColumn.AutoFit
    Sheet1.UsedRange.HorizontalAlignment = xlCenter
    Sheet1.UsedRange.VerticalAlignment = xlCenter

    For r = Sheet1.UsedRange.Rows.Count To 1 Step -1
        For c = Sheet1.UsedRange.Columns.Count To 1 Step -1
            If Not IsEmpty(Cells(r, c)) Then
                If Not IsNumeric(Left(Cells(r, c).Value, 1)) Then
                    If r > 1 Then
                        If Not IsEmpty(Cells(r - 1, c).Value) Then
                            If Cells(r, c) = Cells(r - 1, c) Then
                                Range(Cells(r, c), Cells(r - 1, c)).Merge
                                GoTo NEXTLOOP
                            End If
                        End If
                    End If
                    If c > 1 Then
                        If Not IsEmpty(Cells(r, c - 1).Value) Then
                            If Cells(r, c) = Cells(r, c - 1) Then
                                Range(Cells(r, c), Cells(r, c - 1)).Merge
                                GoTo NEXTLOOP
                            End If
                        End If
                    End If
                End If
            End If
NEXTLOOP:
        Next
    Next

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

Excel 2013中测试有效。

时间: 2024-10-10 11:10:38

使用VBA实现Excel合并相同内容的相邻单元格的相关文章

模拟Excel同一列相同值的单元格合并

背景 项目中有一个查询工作量,可以将查询的结果导出到Excel表中.在Excel工具中,有一个合并居中功能,可以将选中的单元格合并成一个大的单元格.现在需要在程序中直接实现查询结果的汇总, 问题分析 话不多说,上图分析: 如图,对于第一列,前三行的值都为A,那么就是需要执行合并.与此同时,1-3行后面的列采取同样的措施,约定前6列(下标0-5). 手动对1-3列进行分析的结果,如图,有点花哨!!! 可以看到结果中,对于整个1-3行后继的列操作依然如此. 这里要突出讲一下第3列(值为R),该列全部

EXCEL在改动某几个单元格时隐藏空列

概述 今天我哥来找我帮他搞下excel表格,本着程序猿对程序无所不能的精神,我爽快的答应了.结果查了半天才搞定.现在记录在此,供自己以后参考,相信对其他人也有用. PS:这几天正在弄博客,马上就要弄完啦,弄完就把这些手记搬到博客上面啦! 说明 EXCEL的条件格式不能改变单元格的高宽,不能删掉单元格,不能隐藏单元格. 要实现这些功能需要用VBA编写宏,其中用到了EXCEL的Change事件. EXCEL的Change事件是当改变单元格时自动运行的,不需要绑定按钮. 用法 右键点击工作表的标签,然

支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport

Spire.DataExport for .NET是e-iceblue公司推出的一款数据导出类.NET控件.作为一款专业的数据导出控件,Spire.DataExport for .NET可以帮助开发人员轻松快速的从各种主流数据库中导出数据并存储于各种文件格式中.他支持从SQL Command, DataTable,ListView中导出数据并存储于MS Excel,MS Word, HTML, XML, PDF, MS Access, DBF, SQL Script, SYLK, DIF, CS

POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页 //第一个单元格 Row row=sheet.createRow(0); // 创建一个行 Cell cell=row.createCell(0); // 创建一个单元格 第1列 cell.setCellValue(new Date()); // 给

VBA选中多行多列及多单元格

选中多个单元格 Range("<单元格地址>:<单元格地址>[,<单元格地址>--]").Select 例:Range("A1:B2").Select   '选中"A1"."A2"."B1"."B2"四个连续的单元格 Range("12:12").Select   '选中第12行 Range("B:B").Sel

使用jquery合并表格中相同文本的相邻单元格

一.效果 二.代码 <!DOCTYPE HTML> <html> <head> <title>Example</title> <meta charset="utf-8"/> <style></style> <script src="js/jquery-2.1.4.min.js"></script> </head> <body>

合并指定表格指定列的相同文本的相邻单元格

//函数说明:合并指定表格(表格id为table_id)指定列(列数为table_colnum)的相同文本的相邻单元格 //参数说明:table_id 为需要进行合并单元格的表格的id.如在HTMl中指定表格 id="table1" ,此参数应为 #table1 //参数说明:table_colnum 为需要合并单元格的所在列.为数字,从最左边第一列为1开始算起. function table_rowspan(table_id, table_colnum) { table_firstt

java POI excel 导出复合样式(一个单元格两个字体)

前言:java poi 导出 excel 时,需要设置一个单元格有多个字体样式,有点类似于富文本. 想要达到的效果(一个单元格里): 我使用的 poi 版本是 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> 具体实现: 工具类方法:

把复制Excel里一行连续10个单元格的内容一次性粘贴到10个TextBox里

最近做系统,有很多人提出要直接粘贴Excel里的信息上去,手输太麻烦了,所以就去试了下. 开始的时候,有点转牛角尖里去了,老想着去得到剪切板里的内容. 后面发现可以直接把复制来的内容先粘贴到TextBox1里,然后再利用TextBox1的内容改变事件来处理,对字符串进行分割,然后在逐个赋给TextBox控件. 这里碰到了一个问题,就是不知道Excel里联系单元格之间的分隔符是什么,后来测试出来使用 0x09 来分隔的.其实 0x09 就是 制表符,也就是 \t  . 有了这些问题就很好解决了,下