PowerShell中的高级过滤器

Red*_*ven 2 excel powershell filter

我试图通过Powershell使用Excel高级过滤器,但没有任何运气.我可以通过运行以下代码成功使用自动过滤器:

$rangetofilter = $worksheet2.usedrange.select
$excel.selection.autofilter(2, "TestFilter")
Run Code Online (Sandbox Code Playgroud)

但是,我不明白如何正确地将此处给出的语法http://msdn.microsoft.com/en-us/library/office/bb209640(v=office.12).aspx转换为Powershell将接受的内容.例如,我试过了

$excel.selection.AdvancedFilter("xlFilterInPlace", "", "", "TRUE")
Run Code Online (Sandbox Code Playgroud)

但是得到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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

编辑 - 发现这个:http://gallery.technet.microsoft.com/ScriptCenter/57b497a4-d634-44c6-be5c-ba2699f9961a/但它也无法正常工作......

Tom*_*lak 5

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

Object AdvancedFilter(
    XlFilterAction Action,
    Object CriteriaRange,
    Object CopyToRange,
    Object Unique
)
Run Code Online (Sandbox Code Playgroud)

第一个是枚举.在VBA中,您可以直接使用它们,因为它们是隐式全局的.在Powershell中不是这样,您必须通过其完全限定名称明确引用它们:

$xlFilterInPlace = [Microsoft.Office.Interop.Excel.XlFilterAction]::xlFilterInPlace
Run Code Online (Sandbox Code Playgroud)

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

它们也标记为可选.应该没有值的可选参数由.NET COM Interop中Missing类型表示.同样,在Powershell中你必须明确地引用它:

$missing = [Type]::Missing
Run Code Online (Sandbox Code Playgroud)

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

$excel.Selection.AdvancedFilter($xlFilterInPlace, $missing, $missing, $TRUE)
Run Code Online (Sandbox Code Playgroud)