【问题标题】:Advanced filter in PowerShellPowerShell 中的高级筛选器
【发布时间】:2013-04-29 18:54:55
【问题描述】:

我正在尝试通过 PowerShell 使用 Excel 高级过滤器,但我没有任何运气。我可以通过运行以下代码成功使用自动过滤器:

$rangetofilter = $worksheet2.usedrange.select
$excel.selection.autofilter(2, "TestFilter")

但是,我不明白如何正确地将 Range.AdvancedFilter Method 中给出的语法转换为 PowerShell 可以接受的语法。比如我试过

$excel.selection.AdvancedFilter("xlFilterInPlace", "", "", "TRUE")

但我收到以下错误:

Exception calling "AdvancedFilter" with "4" argument(s): "AdvancedFilter method of
Range class failed"
At line:1 char:32
   + $excel.selection.AdvancedFilter <<<< ("xlFilterInPlace","","","TRUE")
   + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
   + FullyQualifiedErrorId : ComMethodTargetInvocation

那么有没有办法通过 PowerShell 运行 Excel 高级过滤器?

我找到了这个:Delete duplicate rows in excel using advanced filter,但它也不起作用...

【问题讨论】:

    标签: excel powershell filter


    【解决方案1】:

    AdvancedFilter() 的所有参数都不是字符串。

    Object AdvancedFilter(
        XlFilterAction Action,
        Object CriteriaRange,
        Object CopyToRange,
        Object Unique
    )
    

    The first is an enumeration。在 VBA 中,您可以直接使用它们,因为它们是隐式全局的。在 Powershell 中并非如此,您必须通过它们的完全限定名称显式引用它们:

    $xlFilterInPlace = [Microsoft.Office.Interop.Excel.XlFilterAction]::xlFilterInPlace
    

    其他三个参数的类型为Object,这意味着它们在COM 中属于Variant 类型。但是,#2 和#3 应该是Range 对象,如果你传入其他东西,所有的赌注都会被取消。

    它们也被标记为可选。应该没有值的可选参数在 .NET COM 互操作中由 the Missing type 表示。同样,在 Powershell 中,您必须明确引用它:

    $missing = [Type]::Missing
    

    参数#4 应该是一个布尔值,所以只需传递一个 Powershell 布尔常量(或者,因为这个参数也是可选的,$missing)。

    $excel.Selection.AdvancedFilter($xlFilterInPlace, $missing, $missing, $TRUE)
    

    【讨论】:

    • 感谢您简洁明了的回答。这就是我喜欢stackoverflow的原因。我唯一的另一个问题是:为什么对于 Advancedfilter 我必须明确引用所有内容,而对于 Autofilter 我不需要?
    • 因为AutoFilter() 的第一个参数接受一个整数,而第二个参数接受一个字符串,这正是你所做的。所有其他参数都是可选的,您希望将它们保留为默认值,这意味着您可以安全地忽略它们。对于AdvancedFilter(),您希望为第四个参数使用非默认值,这意味着您必须指定#2 和#3。 PowerShell 不支持 VBA 的可选参数语法(AdvancedFilter(xlFilterInPlace, , , True),它在内部做同样的事情:它为每个省略的参数传递“缺失”。
    • 有道理,我尝试的其中一件事是AdvancedFilter(xlFilterInPlace, , , True),但它不起作用,现在我知道为什么了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多