如果 ID 匹配在其他列中插入新行和总值

Posted

技术标签:

【中文标题】如果 ID 匹配在其他列中插入新行和总值【英文标题】:If ID's match insert new row and total values in other columns 【发布时间】:2015-06-29 19:16:39 【问题描述】:

我有一个大约有 19 列的电子表格,并且行数总是在变化。 A 列包含“商品 ID”,N 列包含“已售商品数量”,O 列包含“商品数量”。我正在尝试创建一个宏,该宏在每次 A 列中的“项目 ID”更改时插入一行,并汇总“已售项目数”和“项目数”。如果可能的话,我还想将“项目 ID”复制到这个新行中。如果有人可以帮助我,我将非常感激。

更新:请参阅下面的电子表格示例的屏幕截图(我尝试发布图片,但由于我是新手,我想我还没有这个级别的访问权限)。

电子表格现在的样子:

我希望电子表格在运行宏后的样子:

【问题讨论】:

1. 您没有提到您正在处理的电子表格 - 是 Excel 吗? 2. 您的数据是否已格式化为实际的表格对象?还是只是将值放入电子表格并进行格式化,使其看起来像一个表格,但没有创建真正的表格对象? 3. 在标题中您提到了“列”,但不清楚您所说的 4. 是什么意思。您究竟想在哪里创建新行?就在匹配的下方?在桌子的底部?在新表中?等等? 1) 这是 Excel 2) 数据只是电子表格中的值...格式化为每行 1 条记录(无表格) 3) 电子表格包含不同的列...例如 Column A 将是一个项目 ID(第 1 行类似于 59575、第 2 行... 59575、第 3 行... 51738 等)。 4)正如您所说,我希望每次 A 列中的值发生更改时插入一个新行(例如,在我的最后一个答案中,由于项目 ID 更改,它将在第 2 行之后插入一行)再次感谢您的帮助 【参考方案1】:

DataSubtotal 是您的最佳选择。这是最耗时的。

之前:

1. 小计大纲组中:

2.详情:

之后:

【讨论】:

这个答案有帮助吗?【参考方案2】:

ZygD,感谢您的帮助。我真的在寻找一个宏,因为这可能只是 7 个左右的宏之一,这些宏将被绑定到一个按钮解决方案中,供没有时间/知识对这些行进行小计的其他人使用。

我想出了一个将电子表格复制到临时工作表的宏。在该临时表中,它会在每次 ID 更改时添加一个灰色行,并将上述 2 列小计......同时复制所有其他信息。但是,这导致 Excel 冻结了一段时间......所以我让它删除了除我需要的列之外的所有列,小计,并删除除灰色(小​​计)之外的所有行。这是我想出的宏(以防其他人正在寻找类似的东西):

Sub SubTotal()

Dim i As Long
Dim numberOfRows As Long
Dim j

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

'Copies SellerTotals to SellerTotals(Temp)
Sheets("SellerTotals").Select
Sheets("SellerTotals").Copy Before:=Sheets("Pacing")
Sheets("SellerTotals (2)").Select
Sheets("SellerTotals (2)").Name = "SellerTotals(Temp)"
Worksheets("SellerTotals(Temp)").Activate

Range("B:M,P:T").Select
Selection.Delete Shift:=xlToLeft

' number of IDs
numberOfRows = Cells(Rows.Count, "A").End(xlUp).Row

' do bottom row first
Cells(numberOfRows + 1, 1).Value = Cells(numberOfRows, 1).Value
Cells(numberOfRows + 1, 2).FormulaR1C1 = "=SUMIF(R[-" & numberOfRows - 1 & "]C[-1]:R[-" & numberOfRows - (numberOfRows - 1) & "]C[-1],""" & Cells(numberOfRows, 1).Value & """,R[-" & numberOfRows - 1 & "]C[0]:R[-" & numberOfRows - (numberOfRows - 1) & "]C[0])"
Cells(numberOfRows + 1, 3).FormulaR1C1 = "=SUMIF(R[-" & numberOfRows - 1 & "]C[-2]:R[-" & numberOfRows - (numberOfRows - 1) & "]C[-2],""" & Cells(numberOfRows, 1).Value & """,R[-" & numberOfRows - 1 & "]C[0]:R[-" & numberOfRows - (numberOfRows - 1) & "]C[0])"

' convert to value
Cells(numberOfRows + 1, 2).Value = Cells(numberOfRows + 1, 2).Value
Cells(numberOfRows + 1, 3).Value = Cells(numberOfRows + 1, 3).Value

Range(Cells(numberOfRows + 1, 1), Cells(numberOfRows + 1, 3)).Interior.Color = RGB(192, 192, 192)

' insert blank row in between each group of IDs
' loop backwards because we are inserting rows
For i = numberOfRows To 3 Step -1
If Cells(i, 1).Value <> Cells(i - 1, 1).Value Then
  Cells(i, 1).EntireRow.Insert xlShiftDown

  ' copy ID name down
  Cells(i, 1).Value = Cells(i - 1, 1).Value

  ' put formula into Total & Total Cap field
  Cells(i, 2).FormulaR1C1 = "=SUMIF(R[-" & i - 1 & "]C[-1]:R[-" & i - (i - 1) & "]C[-1],""" & Cells(i, 1).Value & """,R[-" & i - 1 & "]C[0]:R[-" & i - (i - 1) & "]C[0])"
  Cells(i, 3).FormulaR1C1 = "=SUMIF(R[-" & i - 1 & "]C[-2]:R[-" & i - (i - 1) & "]C[-2],""" & Cells(i, 1).Value & """,R[-" & i - 1 & "]C[0]:R[-" & i - (i - 1) & "]C[0])"

  ' convert to value
  Cells(i, 2).Value = Cells(i, 2).Value
  Cells(i, 3).Value = Cells(i, 3).Value

  Range(Cells(i, 1), Cells(i, 3)).Interior.Color = RGB(192, 192, 192)

End If
Next i

  ' Delete Blank Rows

    For j = Range("A1").End(xlDown).Row To 2 Step -1
    If Cells(j, 1).Interior.Color <> RGB(192, 192, 192) Then Cells(j, 1).EntireRow.Delete

Next j

End Sub

【讨论】:

以上是关于如果 ID 匹配在其他列中插入新行和总值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:更新旧行时创建新行

SQL - 在同一个表中匹配相同的值,不同的列

整行不匹配时的oracle合并语句[重复]

SQL 来获取唯一键匹配但数据在不同表之间的某些其他列中不同的数据

如果每个工作表中的字符串匹配,则修复删除行

如何根据ID更新另一张纸上的行而不用空白单元格覆盖?