【问题标题】:Matching two column and get values below the matched column匹配两列并获取匹配列下方的值
【发布时间】:2018-02-13 16:36:38
【问题描述】:

我在 A 列中有一张数据透视表,在 D 列中有一张普通表。数据透视表将每月更新一次。我想将 A 列的值与 D 列匹配。然后,如果这些值不存在,则 A 列中的值必须位于 D 列的最后一个单元格之下。如果值匹配,则无需复制和粘贴。

我需要如图所示的输出。我使用了下面的公式,但它不起作用。它显示循环引用错误。我在 D13 上使用过它。 我该如何解决。帮帮我

这在 VBA 中是否可行

我使用的Excel公式:

=IF(ISNUMBER(MATCH(A2;$D:$D;0));"";A2)

【问题讨论】:

  • 你把这个公式放在Column "D"里了吗?它应该问你关于循环引用的问题。
  • 是的。我在 D 列中使用了它。
  • 您正在获得循环引用,因为您正在与输入的公式进行比较。尝试在公式中限制为 $D$12,而不是整个列。
  • 我能做到。但是下个月的值将增加。 D12 将转到 D22。然后我需要再次更改公式。
  • 即使您设法重新计算范围以检查条件,您仍然需要手动清除空白单元格。

标签: vba excel excel-formula excel-2010


【解决方案1】:

使用循环引用函数:

转到文件->选项->公式
在计算选项下勾选启用迭代计算
将最大迭代次数设置为 1
在Column D的第一个空白单元格输入以下公式:

=IF(COUNTIF($D$2:INDIRECT(ADDRESS(COUNTA(D:D),4)),A2)=0,A2,"")

向下拖动,直到获得所有需要的值。
请注意,您仍然会有空白单元格,无法在函数范围内删除它们。

使用 VBA 模块:

Option Explicit
Sub AddDict()
    Dim lRow As Long, iCell As Range
    Dim ClmnA As Range, ClmnD As Range
    Dim MySheet As Worksheet, iDict As Object
    '   Your worksheet, change "Test" accordingly
    Set MySheet = ThisWorkbook.Worksheets("Test")
    '   Create dictionary object
    Set iDict = CreateObject("Scripting.Dictionary")
    With MySheet
        '   Last row of the Column "A"
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        '   Range of Column "A" values starting from second row (without header)
        Set ClmnA = .Range("A2:A" & lRow)
        '   Last row of the Column "D"
        lRow = .Range("D" & .Rows.Count).End(xlUp).Row
        '   Range of Column "D" values starting from second row (without header)
        Set ClmnD = .Range("D2:D" & lRow)
    End With
    '   Loop through each cell in Column "D"
    For Each iCell In ClmnD.Cells
        '   Add cell value to dictionary (omitting duplicates)
        iDict(iCell.Value) = iCell.Value
    Next
    '   Loop through each cell in Column "A"
    For Each iCell In ClmnA.Cells
        '   Add cell value to dictionary (omitting duplicates)
        iDict(iCell.Value) = iCell.Value
    Next
    '   Populate Column "D" with dictionary items
    MySheet.Range("D2:D" & iDict.Count + 1) = Application.Transpose(iDict.Items)
End Sub

【讨论】:

  • 你能解释一下4是什么意思吗?
  • 抱歉让您久等了。 4是Column D的数字
  • 好的,没问题。我试过这个公式。但是当我拖下它时它不起作用。你有没有别的想法。做VBA可以吗
  • @Deepak 对我很好,给我一点时间,我会修改答案。
  • @Deepak 你可以把A2改成A4,应该没有问题。 D2:D 的情况完全不同。注意这一行:MySheet.Range("D2:D" & iDict.Count + 1) = Application.Transpose(iDict.Items)。我手动添加了+1,因为数据从第二行开始。如果E4:E in 将是+3
猜你喜欢
  • 2021-09-29
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多