【问题标题】:Merge cells depending on a value in column for a range of cells根据一系列单元格的列中的值合并单元格
【发布时间】:2018-10-25 00:59:11
【问题描述】:

如果 E 行具有相同的字符串,我需要在 G 行中添加数据,并在 A 行中合并日期。我找到了Excel VBA - Combine rows with duplicate values in one cell and merge values in other cell,这很有帮助,但我需要在 G7:G65536 范围内这样做,因为我从 1 到 6 的行已合并。

有什么方法可以调整这段代码吗?

我试图玩弄它,但它没有给我任何结果。

【问题讨论】:

  • 你试过什么?您能否提供一些示例数据,说明他们在链接帖子中之前和之后的情况?如果您更清楚自己遇到的问题,您可能会得到更好的回应。
  • 如果最大的障碍是'我的行从 1 到 6 被合并',那么将该代码中的一行更改为 Loop Until lngRow < 7
  • 它给了我'应用程序定义的或对象定义的错误',或者如果我将其更改为Loop Until lngRow = 7,那么它再次显示'应用程序需要合并单元格大小相同'
  • 泰勒,我试图将 i = 7 添加到 65536 和 i = 65536 到 7(以防万一)并在此处替换它 lngRow = .Cells(i, columnToMatch).End(xlUp).Row 不起作用
  • a) 哪些列是重复的? b) 除了 G 之外,还有其他列要聚合或连接吗?您引用的示例将一列相加并连接另一列。 c) 第 7 行是列标题行还是第一行数据?

标签: vba excel merge


【解决方案1】:

我使用你们的 cmets 得出以下示例数据。

    

我怀疑这个想法是使用列 E 作为唯一键列并聚合(又名 SUM)列 G 中的数量,同时构建一个串联的日期列表来自 A 列。Worksheet.UsedRange property 的前 6 行将被忽略,因为在前六行中至少有一些 Range.MergeCells propertyAreas property 连接。 TBH,我发现您的原始叙述与您最近的 cmets 相矛盾,因此我将后者用作“发现”。

Sub merge_some_row_data()
    Dim rw As Long, lr As Long, s As Long, str As String

    Application.ScreenUpdating = False
    With ActiveSheet.Cells(1, 1).CurrentRegion
        With .Cells(7, 1).Resize(.Rows.Count - 6, .Columns.Count)
            .Cells.Sort Key1:=.Columns(5), Order1:=xlAscending, _
                        Key2:=.Columns(1), Order2:=xlAscending, _
                        Orientation:=xlTopToBottom, Header:=xlNo
        End With
        lr = .Rows.Count
        For rw = .Rows.Count To 7 Step -1
            If .Cells(rw, "E").Value2 <> .Cells(rw - 1, "E").Value2 And rw < lr Then
                .Cells(rw, "G") = Application.Sum(.Range(.Cells(rw, "G"), .Cells(lr, "G")))
                str = vbNullString
                For s = rw To lr
                    str = str & Chr(59) & .Cells(s, "A").Text    'Chr(59) is the ASCII code for a semi-colon
                Next s
                .Cells(rw, "A") = Mid(str, 2)  'truncate off the firsty semi-colon
                .Cells(rw + 1, 1).Resize(lr - rw, 1).EntireRow.Delete
                lr = rw - 1
            End If
        Next rw
    End With
    Application.ScreenUpdating = True
End Sub

运行代码后,结果如下所示。

    

如果您出于自己的超级机密目的而在转录此框架时遇到任何问题,请随时使用经过编辑的示例数据以及预期结果以及此代码中您无法适应自己情况的部分来修改您的原始问题.

【讨论】:

  • 这太棒了!非常感谢。另外,请问一下。在按下合并按钮后,我只有多个工作表,我希望在其中运行此代码(表 2、5、8、11、14、17、20、23、26、29)。是否可以仅针对活动工作表运行此代码?
  • 有几种方法可以循环浏览工作簿中的每个工作表,或者使用名称数组来循环选择有限的工作表。实际上,上述代码的With ActiveSheet.Cells(1, 1).CurrentRegion 只需封装在另一个循环中,该循环标识要处理的每个工作表。
  • 好吧,我用了Dim WshtNames As Variant, InxW As Long WshtNames = Array(Sheet2, Sheet5, Sheet8, Sheet11, Sheet14, Sheet17, Sheet20, Sheet23, Sheet26, Sheet29) For InxW = LBound(WshtNames) To UBound(WshtNames) Worksheets(WshtNames(InxW)).ActivateWith ActiveSheet.Cells(1, 1).CurrentRegion 之后我有Next InxW。它给了我对象定义的错误。我做错了什么?
  • 抱歉,您能否编辑您的代码,使其按 E 列搜索并在 G 列中添加#s,我试图自己做,但是当我在您的代码中将 E 切换为 G 并将 G 切换为 E 时一种产品覆盖另一种产品。
  • 我怀疑您没有更改主排序列。这很重要,因为它被用作查找同类产品的关键。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2021-04-19
  • 1970-01-01
  • 2019-06-16
相关资源
最近更新 更多