【问题标题】:Add/calculate lines on multiple criteria with loops based on values in other columns使用基于其他列中的值的循环添加/计算多个条件的行
【发布时间】:2020-07-14 04:10:42
【问题描述】:

我有一张如下图所示的 excel 表格:

我需要:

  1. 将每个职位的金额和成本相加(全部为 1,全部为 2,全部为 3,...)。

  2. 然后在 Actual 中查找“X”,然后合并该行上 Position 值相等的所有行,因此这应该是最后该位置的前导行和唯一剩余行。但它不应该在同一张纸上,而应该在一张新纸上。基本上,在这个例子中,会有第二张三行的工作表(因为这个例子中有 3 个位置)

  3. 它需要是动态的。这里可以有任意数量的职位

  4. 每个职位都应采用实际职位中带 X 的职位的描述、日期等。

  5. 还有更多的列和更多的计算需要做,所以添加计算条件应该很容易。

我不是 Excel Pro,我认为不编写 Makro 就无法解决这个问题,所以请随时证明我错了...

到目前为止,我根据我在网上找到的一些 sn-ps 编写了以下 VBA 代码,但不幸的是,我只能将特定行(具有相同的位置编号)相加并输出带有“x”的位置的总和实际:

Sub MergeRows()
    Dim r_src As Range, r_dst As Range

    ' Pick 1st row and column of table
    Set r_src = Sheets("Sheet1").Range("A2")
    Set r_dst = Sheets("Sheet2").Range("A2")

    Dim i As Integer, j As Integer
    Dim N_rows As Integer, N_cols As Integer

    'Find the size of the data
    N_rows = CountRows(r_src)
    N_cols = CountColumns(r_src)

    'Resize source range to entire table
    Set r_src = r_src.Resize(N_rows, N_cols)

    Dim src_vals() As Variant, dst_vals() As Variant
    'Get all the values from source
    src_vals = r_src.Value2

    ReDim dst_vals(1 To N_rows, 1 To N_cols)
    Dim k As Integer
    Dim x As Integer
    k = 0
    For i = 1 To N_rows
        For x = 1 To 10
            ' Check first column
            If Val(src_vals(i, 1)) = x Then
                ' Increment count
                k = k + 1
                ' Copy row values

                Dim qty As Integer
                qty = qty + src_vals(i, 27)
                src_vals(i, 27) = qty

                For j = 1 To N_cols
                    If src_vals(i, 2) = "X" Then
                    dst_vals(k, j) = src_vals(i, j)
                    End If
                Next j

            End If
        Next x
        qty = 0
    Next i
    ' Bring rows back into destination range
    If k > 0 Then
        r_dst.Resize(k, N_cols).Value2 = dst_vals
    End If
End Sub
Public Function CountRows(ByRef r As Range) As Integer
    CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count
End Function
Public Function CountColumns(ByRef r As Range) As Integer
    CountColumns = r.Worksheet.Range("A:DS").Columns.Count
End Function

【问题讨论】:

  • 您能否创建与您想要的结果相同的屏幕截图?这将有助于了解究竟是什么分组/总和。 • 您是否尝试过使用数据透视表来生成您所期望的结果?
  • 如果我对您的理解正确,您希望将标记为实际的每一行(根据每个位置只有一个)复制到另一个工作表,并总结所有 成本Amount 值对应的位置是你复制的?
  • @Bryan,您打算向回答者提供反馈吗?
  • @HTH 你着急吗? 7小时前他才问。在有人回答之前,并非每个人都按 F5 键。通常我会写一个问题并在一天左右回来。
  • @Pᴇʜ,我不容忍那些不在乎谁帮助他们的人。你可以自己检查一下,他最近两个小时前回来了,但没有任何反馈,甚至没有“谢谢,我会去看看......”。而且我觉得我可以问任何我想问的问题,遵守规则

标签: excel vba loops for-loop datatables


【解决方案1】:

请检查一下

图片 1:对于德国屏幕截图感到抱歉。
“Summe von Amount/Costs”表示“金额/成本的总和”,“Gesamtergebnis”表示“总结果”。

这可以通过数据透视表(不使用 VBA)来完成,它会动态更新。
Create a PivotTable to analyze worksheet data

只需将数据透视表中的Position 添加到行中,将AmountCosts 添加到值中即可。

【讨论】:

    【解决方案2】:

    您实际上并不需要遍历所有内容,您可以使用 sumif 公式进行基本添加,然后也许只需使用宏自动将公式应用到第二张纸上,我猜想一个快速循环来删除空行:

    您可以在此处查看公式:

    在宏中你只想要类似的东西

    Sub e()
    Sheet4.Range("A2:A9").Formula = "=SUM('Sheet_1'!C2:C3)"
    Sheet4.Range("B2:B9").Formula = "=IF('Sheet_1'!$B2=""X"",SUMIF('Sheet_1'!$A$2:$E$9,'Sheet_1'!A2,'Sheet_1'!$E$2:$E$9),"""")"
    End Sub
    

    应用公式然后也许

    Sheet4.Range("A2:B9").value2 = Sheet4.Range("A2:B9").value2
    

    将它们解析为数字。

    然后进行快速循环以删除 B 列中的空白值。


    NB您仍然可以通过将我的硬编码范围替换为变量并使用您的 CountRows 函数来使其完全动态化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2011-10-13
      相关资源
      最近更新 更多