VBA:多个匹配列基于虚拟排序

VBA:多个匹配列基于虚拟排序,vba,sorting,excel,multiple-columns,Vba,Sorting,Excel,Multiple Columns,我有一个巨大的excel数据表,我需要排序。 我需要两个列根据一个虚拟值进行匹配。 虚拟对象是'C'(调用)或'P'(put)。另外两列是“到期日”和“执行价”。 我需要对数据表进行排序,以便它只包含具有相同到期日期和执行价格的C和P 我一直在尝试在没有任何帮助的情况下上网搜索。我真的搞不懂如何用VBA编程 非常感谢您的帮助 谢谢。我想的解决方案是:(我添加了一个新列-列W-为空-将行标记为“匹配”,在操作后删除。) 标记双行(匹配行)的第一个子行: 要删除的第二个子行不匹配,因此未标记行: P

我有一个巨大的excel数据表,我需要排序。 我需要两个列根据一个虚拟值进行匹配。 虚拟对象是'C'(调用)或'P'(put)。另外两列是“到期日”和“执行价”。 我需要对数据表进行排序,以便它只包含具有相同到期日期和执行价格的C和P

我一直在尝试在没有任何帮助的情况下上网搜索。我真的搞不懂如何用VBA编程

非常感谢您的帮助

谢谢。

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

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

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

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
私有子DeleteNotMatchedRows()
暗淡无光
Application.ScreenUpdating=False
对于intRow=ActiveSheet.UsedRange.Rows.Count,第2步-1
如果单元格(intRow,23)。值“匹配”,则
行(intRow).删除移位:=xlShiftUp
如果结束
下一个
范围(“W1”).entireclumn.Delete
Application.ScreenUpdating=True
端接头

在示例表中,在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并删除行。

您也可以对宏执行同样的操作,但它更复杂。

您的问题不清楚,是否要对数据进行排序/筛选/分组?你能举个例子吗?@MátéJuhász,很抱歉没有详细解释。我想根据通话或通话过滤数据。这意味着我要过滤它,使看涨期权的执行价格和到期日等于看跌期权的执行价格和到期日。调用和Put位于1列中。因此,是否可以编写一个代码来说明:如果C的执行价格等于P的执行价格,而C的到期日期等于P的到期日期,则应将其保留在数据表中,如果不等于,则应删除该行。希望这能让事情变得更清楚。也许你可以抽出一两行来展示你的目标,然后发布一个截图。毕竟一张图片值1000个字。@Rossco,当然了:所以我希望P和C的有效期和执行价相同。如果他们没有,那么这些行应该从数据表中删除。仍然不清楚。是否要比较任何“C”行是否有相应的“P”列,如果有,则仅保留,或者是否只对彼此相邻的行感兴趣,最终是否有其他需要匹配的键列?宏如何知道哪个是“C”行,哪个是“P”行?注释不用于扩展讨论;这段对话已经结束。
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