ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1007|回复: 9

[求助] 以c列为相同项,合并A列B列D列,数据合并并且用换行符分开。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-6-16 09:55 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
求教大佬。实现把A列相同的单元格合并,同时把对应的B列数据合并并且用换行符分开。
Sub zz()
    Dim d, ar
    Application.ScreenUpdating = False
    Set d = CreateObject("Scripting.Dictionary")
    ar = Sheet1.Range("A1").CurrentRegion
    For i = 1 To UBound(ar)
        If InStr(d(ar(i, 1)), ar(i, 2)) = 0 Then
            d(ar(i, 1)) = d(ar(i, 1)) & Chr(10) & ar(i, 2)
        End If
    Next
    With Sheet2
        For Each k In d.keys
            .Cells(2 + n, 1) = k: .Cells(2 + n, 2) = Mid(d(k), 2): n = n + 1
        Next
    End With
    Application.ScreenUpdating = True
End Sub。
我要修改以c列为相同项,合并A列,B列,D列,数据合并并且用换行符分开。代码需要怎么改动呢。
模拟效果

image.png 转化成 image.png 。请问要怎么修改。



image.png
image.png

发货单合并.zip

12.09 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2020-6-16 10:17 | 显示全部楼层
既然你还保留纵向格式,那不合并就好了,至于取数据的问题  自然有解决方案

TA的精华主题

TA的得分主题

发表于 2020-6-16 10:38 | 显示全部楼层
这个是只合并C列的,如果你确定各列的数据都放一个单元格里,那就没必要合并了是吧?
Sub zz()

    Dim d, ar, i, n, k
    Application.ScreenUpdating = False '工作表不隐藏
    Set d = CreateObject("Scripting.Dictionary") '创建一个字典
    ar = Sheet1.Range("c1").CurrentRegion '定义字典
    For i = 1 To UBound(ar)
        d(ar(i, 3)) = d(ar(i, 3)) & Chr(10) & ar(i, 1) & "+" & ar(i, 2) & "+" & ar(i, 4)
    Next
    n = 2
    M = 3
    With Sheet2
        For Each k In d.keys
            A = Split(Mid(d(k), 2), Chr(10))
            For J = 0 To UBound(A)
                n = n + 1
                B = Split(A(J), "+")
                .Cells(n, 1) = B(0)
                .Cells(n, 2) = B(1)
                .Cells(n, 4) = B(2)
            Next
            .Cells(M, 3).Resize(UBound(A) + 1, 1).Merge
            .Cells(M, 3) = k
            M = n + 1
        Next
    End With
    Application.ScreenUpdating = True


End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-16 10:47 | 显示全部楼层
wp231957 发表于 2020-6-16 10:17
既然你还保留纵向格式,那不合并就好了,至于取数据的问题  自然有解决方案

哎,我要用自动发送邮件功能,但是那个只能同一个单元格,所以只能合并在一起。

TA的精华主题

TA的得分主题

发表于 2020-6-16 10:59 | 显示全部楼层
  1. Public Sub DoSomethingInActivesheet()
  2.     '作者  DG-NextSeven
  3.     '日期  2019年3月23日
  4.     '说明  处理当前工作表
  5.                                                                                                                         
  6.     Dim Wb As Workbook
  7.     Dim Sht As Worksheet
  8.     Dim Rng As Range
  9.     Dim i As Long, j As Long
  10.     Const HEAD_ROW As Long = 1
  11.     Dim Dic As Object
  12.     Set Dic = CreateObject("Scripting.Dictionary")
  13.                                                                                  
  14.     Set Wb = Application.ThisWorkbook
  15.     Set Sht = Wb.ActiveSheet
  16.     With Sht
  17.         EndRow = .Cells.Find("*", .Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
  18.         For i = HEAD_ROW + 1 To EndRow Step 1
  19.             Key = .Cells(i, 3).Value
  20.                                                                                                                                                 
  21.             If Not Dic.Exists(Key) Then
  22.                 Dic(Key) = Array(.Cells(i, 1).Value, .Cells(i, 2).Value, .Cells(i, 3).Value, .Cells(i, 4).Value)

  23.             Else
  24.                 ar = Dic(Key)
  25.                 ar(0) = ar(0) & Chr(10) & .Cells(i, 1).Value
  26.                 ar(1) = ar(1) & Chr(10) & .Cells(i, 2).Value
  27.                 ar(3) = ar(3) & Chr(10) & .Cells(i, 4).Value
  28.                 Dic(Key) = ar
  29.                                                                                                                                                                                 
  30.             End If
  31.         Next
  32.                                                                                                                                                                                 
  33.         .Range("a1:D1").Copy .Range("f1")
  34.         Set Rng = .Range("F2")
  35.         For Each OneK In Dic.keys
  36.             Lenth = Dic(OneK)
  37.             Exit For
  38.         Next
  39.         columnsize = UBound(Lenth) + 1
  40.         Set Rng = Rng.Resize(Dic.Count, columnsize)
  41.         Rng.Value = Application.Rept(Dic.Items, 1)
  42.                                        
  43.     End With
  44.                                                                         
  45.     Set Wb = Nothing
  46.     Set Sht = Nothing
  47.     Set Rng = Nothing
  48.     Set Dic = Nothing
  49.                
  50.                                                                         
  51. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-16 11:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-6-16 11:33 | 显示全部楼层
Sub 宏1()
    Range("A2:D11").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C2:C11") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A2:D11")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Application.DisplayAlerts = False
        aa = Cells(Rows.Count, 1).End(xlUp).Row
    beg = aa
    For i = aa To 2 Step -1
        If Cells(i, 3) <> Cells(i, 3).Offset(-1, 0) Or i = 2 Then
            endd = i
            Range("c" & endd & ":c" & beg).Merge
            arrb = Range("b" & endd & ":b" & beg)
            Range("b" & endd & ":b" & beg).Merge
            Cells(endd, "b") = Join(Application.Transpose(arrb), Chr(10))
            arra = Range("a" & endd & ":a" & beg)
            Range("a" & endd & ":a" & beg).Merge
            Cells(endd, "a") = Join(Application.Transpose(arra), Chr(10))
            arrd = Range("d" & endd & ":d" & beg)
            Range("d" & endd & ":d" & beg).Merge
            Cells(endd, "d") = Join(Application.Transpose(arrd), Chr(10))
            beg = i - 1
        End If
    Next
End Sub

TA的精华主题

TA的得分主题

发表于 2020-6-16 11:37 | 显示全部楼层
排序的过程录了个宏,是不是通不过呀

TA的精华主题

TA的得分主题

发表于 2020-6-16 11:39 | 显示全部楼层
本帖最后由 wlh2004 于 2020-6-16 11:47 编辑

谢谢了,能够通过

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-16 15:57 | 显示全部楼层

大哥,发现条数多了以后有点问题。会显示错误。有些又是好的
a94615411ac3b8584d2ce61ba0f3f8f.png

发货指令执行情况报表(5).zip

16.52 KB, 下载次数: 4

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-26 08:56 , Processed in 0.045106 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表