EXCEL按某列数据判断合并相同单元格(java/VBA宏方式)

在做一个小的数据处理任务时,我需要从数据库中提取用户的部门和他们的部门链信息。如果一个用户有多个亲属信息,则前面几列用户信息需要合并单元格。

在这里插入图片描述

最初,我用Java写了代码(虽然这方法已经不太推荐了,而且找这个方法也费了不少功夫),手动合并单元格。

  		int rowCount = 2;
          int startRowIndex = 0;
          int endIndex = 0;
          for (InData data : inDatas) {
              if (!instanceId.equals(data.getS1())) {
                  instanceId = data.getS1();
                  if (startRowIndex != endIndex) {
                      for (int i = 0; i < 7; i++) {
                          //合并前七列
                          Sheet currentSheet = excelWriter.writeContext().getCurrentSheet();
                          CellRangeAddress rangeAddress = new CellRangeAddress(startRowIndex, endIndex, i, i);
                          currentSheet.addMergedRegion(rangeAddress);
                      }
                  }
                  startRowIndex = rowCount;
                  endIndex = rowCount;

              } else {
                  endIndex++;

              }
             //其他逻辑
  		}

小量数据的时候还好,但当数据量增加到超过6万行的时候,处理时间变得特别长,甚至花了五个小时都没能完成。

所以,最后决定先把数据处理好,再用Excel的VBA宏来做剩下的事情。

Sub MergeCellsBasedOnAColumn()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim startRow As Long
    
    ' 设置工作表
    Set ws = ThisWorkbook.Sheets("模板")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 找到最后一个非空单元格的行号
    
    startRow = 3 ' 假设从第2行开始有数据
    For i = 3 To lastRow
        If ws.Cells(i, 29).Value <> ws.Cells(i + 1, 29).Value Then
            ' 当前A列的值与下一行不同,进行合并操作
            If startRow < i Then
                ' 合并A列单元格 懒得琢磨循环代码了
                ws.Range(ws.Cells(startRow, 1), ws.Cells(i, 1)).Merge
                ws.Range(ws.Cells(startRow, 2), ws.Cells(i, 2)).Merge
                ws.Range(ws.Cells(startRow, 3), ws.Cells(i, 3)).Merge
                ws.Range(ws.Cells(startRow, 4), ws.Cells(i, 4)).Merge
                ws.Range(ws.Cells(startRow, 5), ws.Cells(i, 5)).Merge
                ws.Range(ws.Cells(startRow, 6), ws.Cells(i, 6)).Merge
                ws.Range(ws.Cells(startRow, 7), ws.Cells(i, 7)).Merge
                ws.Range(ws.Cells(startRow, 8), ws.Cells(i, 8)).Merge
                ws.Range(ws.Cells(startRow, 9), ws.Cells(i, 9)).Merge
            End If
            startRow = i + 1 ' 更新startRow为下一个分组的开始
        End If
    Next i
    
    ' 如果循环结束时还有未处理的合并(即最后一组)
    If startRow <= lastRow Then
        ws.Range(ws.Cells(startRow, 1), ws.Cells(lastRow, 1)).Merge
        ws.Range(ws.Cells(startRow, 1), ws.Cells(lastRow, 1)).Merge
        ws.Range(ws.Cells(startRow, 2), ws.Cells(lastRow, 2)).Merge
        ws.Range(ws.Cells(startRow, 3), ws.Cells(lastRow, 3)).Merge
        ws.Range(ws.Cells(startRow, 4), ws.Cells(lastRow, 4)).Merge
        ws.Range(ws.Cells(startRow, 5), ws.Cells(lastRow, 5)).Merge
        ws.Range(ws.Cells(startRow, 6), ws.Cells(lastRow, 6)).Merge
        ws.Range(ws.Cells(startRow, 7), ws.Cells(lastRow, 7)).Merge
        ws.Range(ws.Cells(startRow, 8), ws.Cells(lastRow, 8)).Merge
        ws.Range(ws.Cells(startRow, 9), ws.Cells(lastRow, 9)).Merge
    End If
End Sub

Function JoinRangeValues(rng As Range, delimiter As String) As String
    Dim cell As Range
    Dim result As String
    result = ""
    For Each cell In rng
        If result = "" Then
            result = cell.Value
        Else
            result = result & delimiter & cell.Value
        End If
    Next cell
    JoinRangeValues = result
End Function


小提示: 没接触过VB的小白,询问AI后只用了30分钟就搞定了转用了VBA宏处理数据。AI牛批!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值