在高级过滤器中使用间接

时间:2015-01-11 02:56:41

标签: excel vba excel-vba excel-formula

Hello Stack Overflow社区,

我目前正在创建一个自动报告,用于从给定文件夹导入两个或更多CSV文件。我需要用于VLOOKUP的唯一标识符位于一个不明确的列中,因此我需要做的是剪切并将找到的列插入列'A'。以下示例。

With wksRawData
    '~~> Move Process ID Column to Column 'A' for VLOOKUP
    .Columns(WorksheetFunction.Match("pid", .Range("1:1"), 0)).Cut
    .Columns(1).Insert Shift:=xlToLeft

    '~~> Remove Additional Headers
    .Cells.RemoveDuplicates Columns:=Array(1)
End With

这部分效果很好,但我在另一个工作表中有一个公式,应该引用$A2并将其更改为$B2。它应该引用$A2的原因是因为它在高级过滤器公式中使用,并且是第一个数据点。下面的公式。

=IF(COUNTIF($C:$C, 'Raw Data'!$A2)=0, TRUE, FALSE)

与其他“高级过滤器”列结合使用时,此公式会将任何手动添加的唯一标识符列入白名单。以下示例。

PID Whitelist  |      |  user  |  proc          |  PID Whitelisted?
---------------+------+--------+----------------+------------------
          182  |      |  root  |                |  < FORMULA_ABOVE >
           11  |      |  test  |                |  < FORMULA_ABOVE >
         1776  |      |        |  Jazzy Rabbit  |  < FORMULA_ABOVE >

我尝试在INDIRECT的位置使用ADDRESSINDEX'Raw Data'!$A2,但由于它们引用绝对目标,因此高级过滤器始终使用第一个唯一标识符值;而不是当前行的值。

提前感谢您的时间,我非常感谢您提供的任何帮助!

  • NOX

2 个答案:

答案 0 :(得分:0)

我建议在VBA列插入后立即重写公式。示例(具有改进的(?)公式:

With wksRawData
    '~~> Move Process ID Column to Column 'A' for VLOOKUP
    .Columns(WorksheetFunction.Match("pid", .Range("1:1"), 0)).Cut
    .Columns(1).Insert Shift:=xlToLeft

    '~~> Remove Additional Headers
    .Cells.RemoveDuplicates Columns:=Array(1)
End With
sheets("Some_Sheet").cells(x, y).formula = "=NOT(COUNTIF($C:$C, 'raw data'!$A2))"

答案 1 :(得分:0)

'aslo one additional variant of the @Jeeped idea, without formulas

With wksRawData
    .Columns(Range("1:1").Find("pid").Column).Cut
    .Columns(1).Insert
    .Cells.RemoveDuplicates Columns:=Array(1)
End With
Sheets("Some_Sheet").Cells(x, y).Value = _
WorksheetFunction.CountIf(Columns(3), Sheets("raw data").Cells(2, 1).Value)