PowerShell中的高级过滤器

时间:2013-05-06 03:35:32

标签: excel powershell filter

我正在尝试通过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 ,但它也无效...

1 个答案:

答案 0 :(得分:5)

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 Interop中的the Missing type表示不应具有任何值的可选参数。同样,在Powershell中你必须明确地引用它:

$missing = [Type]::Missing

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

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