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