【问题标题】:VBA: Multiple matching columns sorted based on a dummyVBA:基于虚拟排序的多个匹配列
【发布时间】:2015-04-16 11:45:55
【问题描述】:

我在 excel 中有一个巨大的数据表,我需要对其进行排序。 我需要根据 Dummy 匹配两列。 哑元是“C”(看涨)或“P”(看跌)。另外两列是“到期日”和“行使价”。 我需要对数据表进行排序,使其仅包含具有相同到期日期和执行价格的 C 和 P。

我一直在尝试在没有任何帮助的情况下搜索互联网。我真的不知道如何在 VBA 中对其进行编程。

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 您的问题不清楚,您想对您的数据进行排序/过滤/分组吗?你能举个例子吗?
  • @MátéJuhász ,抱歉没有彻底解释清楚。我想根据看涨或看跌过滤数据。这意味着我想对其进行过滤,以便看涨期权的执行价格和到期日等于看跌期权的执行价格和到期价格。看涨期权和看跌期权在 1 列中。那么是否可以编写一个代码说:如果 C 的执行价格等于 P 的执行价格并且 C 的到期日期等于 P 的到期日期它应该将它们保留在数据表中,如果它不相等则它应该删除该行.希望这更清楚。
  • 也许你可以修改一两行显示你所追求的内容并发布截图。毕竟一张图值一千字。
  • @Rossco ,当然:link 所以我希望 P 和 C 具有相同的到期日和执行价格。如果他们没有,那么应该从数据表中删除这些行。
  • 还是不清楚。你想比较吗?任何“C”行是否具有相应的“P”列并且仅在是时才保留,或者您是否只对彼此相邻的行感兴趣,最终您是否还有其他需要匹配的键列?宏应该如何知道哪个是“THE C”,哪个是“THE P”行??

标签: vba sorting excel multiple-columns


【解决方案1】:

我认为的解决方案:(我添加了一个新列-columnW-为空-将该行标记为“匹配”,操作后将其删除。)

标记双峰的第一个子(匹配行):

Private Sub FindDoublets()

    Dim intRowC As Long
    Dim intRowP As Long

    Application.ScreenUpdating = False 

    Range("W1").EntireColumn.Insert

    For intRowC = 2 To ActiveSheet.UsedRange.Rows.Count
        If Cells(intRowC, 6).Value = "C" Then
            For intRowP = 2 To ActiveSheet.UsedRange.Rows.Count
                If Cells(intRowP, 6).Value = "P" Then
                    If Cells(intRowC, 4).Value = Cells(intRowP, 4).Value And Cells(intRowC, 7).Value = Cells(intRowP, 7).Value Then
                        Cells(intRowC, 23).Value = "Matched"
                        Cells(intRowP, 23).Value = "Matched"
                    End If
                End If
            Next
        End If
    Next

    Application.ScreenUpdating = True

End Sub

要删除的第二个子不匹配因此未标记的行:

Private Sub DeleteNotMatchedRows()

    Dim intRow As Long

    Application.ScreenUpdating = False

    For intRow = ActiveSheet.UsedRange.Rows.Count To 2 Step -1
        If Cells(intRow, 23).Value <> "Matched" Then
            Rows(intRow).Delete shift:=xlShiftUp
        End If
    Next

    Range("W1").EntireColumn.Delete
    Application.ScreenUpdating = True

End Sub

【讨论】:

【解决方案2】:

在您的示例表中,在 W 列中输入此公式:=IF(F2="C",TRUE,FALSE),在 X 列中输入此公式:=COUNTIFS(D:D,D2,G:G,G2,W:W,NOT(W2))
现在,当实际行有相应的 C/P 行时,X 列中将有“1”,否则为“0”。只需要过滤 0-s 并删除行。
你也可以用宏做同样的事情,但它更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多