【问题标题】:Concatenating and Summing Cells Based On Mulitple Criteria From Two Different Worksheets基于来自两个不同工作表的多个标准连接和求和单元格
【发布时间】:2018-03-06 15:03:09
【问题描述】:

Image of WorkSheet1Image of WorkSheet2 如果我想根据两个不同工作表中的标准对一列中的单元格求和并连接另一列中的单元格,Excel VBA 代码会是什么样子?在下面的示例中,我想根据以下条件汇总费率并连接 WorkSheet1 中的类型:

  1. 如果 WorkSheet1 中的描述与 WorkSheet2 中的描述匹配

  2. 如果 WorkSheet2 中的代码是 03

  3. 如果 WorkSheet1 中的类型是“收入”和“特殊现金”

这是 VBA 代码运行之前工作表的样子:

工作表1

        Column A        Column B               Column C
(Row 1) Description     Type                   Rate 
(Row 2) BGIO US Equity  Income                 0.05    
(Row 3) BGIO US Equity  Short Term Cap Gain    0.009573
(Row 4) BGIO US Equity  Special Cash           0.00931

工作表2

        Column A         Column B    Column C
(Row 1) Description      Rate        Code  
(Row 2) BGIO US Equity   0.05931     03
(Row 3) BGIO US Equity   0.009573    07

这是 VBA 代码运行后 WorkSheet1 中的结果:

        Column A       Column B               Column C
(Row 1) Description    Type                   Rate 
(Row 2) BGIO US Equity Income + Special Cash  0.05931 
(Row 3) BGIO US Equity Short Term Cap Gain    0.009573

本质上,我是在两个工作表之间创建匹配项(如果存在)以进行协调。

这是我目前拥有的 VBA 代码,它不适用于连接部分:

For e = 2 To WorkSheet1LastRow
    checkValue = WorkSheet1.Cells(e, 1)
    For x = 2 To WorkSheet1LastRow
        Type = WorkSheet1.Cells(x, 2)
    Next x
Next e
For c = 2 To WorkSheet2LastRow
    CheckValue2 = WorkSheet2.cells(c, 1)
    For q = 2 To WorkSheet2LastRow
        If WorkSheet2.cells(q, 3) = "03" And WorkSheet2.Cells(q, 1) <> CheckValue2 Then
            If checkValue2 = CheckValue1 Then
                If Type = "Income" Or "Special Cash" Then
                    Type = Type & "+" & Type
                End If
            End If
        End If
    Next q
Next c

我在想如果我能成功编码这部分,我可以记录一个 sumif 公式来完成这个过程。

【问题讨论】:

  • 你可以用几个工作表公式更容易地做到这一点,除非你有理由需要在 VBA 中这样做。 (不要阻止任何人学习!)
  • ...你想sumif 做什么?我实际上不确定我是否遵循您正在做的事情,但我怀疑您的样本数据不能代表您实际拥有的数据,因为根据您的标准,description 是无关紧要的,因为只有一个,所以您只需需要 MATCHIF
  • 我真的很想学习如何使用 VBA 来做到这一点,因为如果能看到它是如何完成的,它将为我开启其他创新项目的道路。
  • 该列中会有更多描述,我只是提供了这个示例,因为如果我能得到它并在以后添加其他迭代。
  • 是的,我认为有更多的描述,我的观点是,对于代表实际数据的至少代表的示例很重要,因为从外部角度来看,两个不同的人通常会假设完全不同的事情会影响他们对解决方案的解释。 ...但是 A+ 表示对学习 VBA 的棘手问题的出色态度...(与许多新成员提出的问题相反:“我需要修复此代码并且我不想学习任何东西...我希望它完成。”...前几百次是有趣,)

标签: excel vba


【解决方案1】:

这似乎与您所描述的一样。

Option Explicit

Sub incomeSpecialCash()
    Dim i As Long, j As Long
    Dim descRate As Variant

    With Worksheets(2)
        ReDim descRate(1 To Application.CountIf(.Columns("C"), 3), 1 To 2)
        j = LBound(descRate, 1)
        For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
            If .Cells(i, "C").Text = "03" Then
                descRate(j, 1) = .Cells(i, "A").Value2
                descRate(j, 2) = .Cells(i, "B").Value2
                j = j + 1
            End If
        Next i
    End With

    With Worksheets(1)
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            For i = LBound(descRate, 1) To UBound(descRate, 1)
                .AutoFilter field:=1, Criteria1:=descRate(i, 1)
                .AutoFilter field:=2, Criteria1:="income"
                With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0)
                    If CBool(Application.Subtotal(103, .Cells)) Then
                        Intersect(.SpecialCells(xlCellTypeVisible), .Columns("C")) = descRate(i, 2)
                        Intersect(.SpecialCells(xlCellTypeVisible), .Columns("B")) = "Income + Special Cash"
                    End If
                End With
                .AutoFilter field:=2, Criteria1:="special cash"
                With .Resize(.Rows.Count - 1, .Columns.Count).Offset(1, 0)
                    If CBool(Application.Subtotal(103, .Cells)) Then
                        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                    End If
                End With
            Next i
        End With
        If .AutoFilterMode Then .AutoFilterMode = False
    End With
End Sub

【讨论】:

  • 非常感谢您向我展示这个数组。但是,如果行数因不同证券而异,我仍在苦苦挣扎。我提供了 2 张根文件的图像,我正在尝试为其编写动态代码,这将遵循 3 个标准。请点击蓝色链接和我原来问题的开头。我还计划为“收入”和“特殊现金”以外的组合类型添加迭代。例如,描述 CCT US Equity 在 WorkSheet1 上具有“Regular Cash”和“Special Cash”的组合,在 WorkSheet2 上具有“03”代码。再次感谢您的帮助。
  • 我想我现在可以正常工作了。我会让你知道我的项目的其余部分是如何进行的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多