【问题标题】:Error with Excel Range.AutoFilter when using with array (Powershell)与数组一起使用时 Excel Range.AutoFilter 出错(Powershell)
【发布时间】:2018-06-16 04:13:06
【问题描述】:

我正在使用 Powershell 处理一个包含数千个计算机名和 IP 的 .csv 文件。我正在使用 powershell,因为它是我正在构建的更大脚本的一部分。

我通过 Excel 使用 Range.AutoFilter() 方法来删​​除我不需要的 IP。在下面的示例中,我想删除 pc1、pc2 和 pc5。

示例表:

Name  1   2   3   4
pc1   10  10  10  10
pc2   10  50  100 1
pc3   10  38  20  55
pc4   10  210 38  100
pc5   10  66  41  23
etc...

如果我手动创建数组,问题为零。

$Array1 = "38","210"

但是,我需要通过从第 3 列中提取唯一值来创建数组,如下所示:

$Array2 = @()
$row = 2
Do {
  $value = $Sheet1.Cells.Item($row,3).Text
  $Array2 += "$value"
  $row++
} until (!$Sheet1.Cells.Item($row,1).Text) #column 1 is less likely to have blanks
$Array2 = $Array1 | Sort-Object -unique

但是当我将 $Array2 放入我的自动过滤命令时,我得到一个错误:

$Filter = $Array2
$Range = $Sheet1.UsedRange
[void] $Range.AutoFilter(3,$Filter,7)

异常设置“AutoFilter”:无法将“int”类型的“7”值转换为“Object”类型。

根据文档,7 是 XlAutoFilterOperator 的 xlFilterValues 的值。同样,如果我将 $Filter 切换到 $Array1,过滤器命令可以正常工作。

我不确定我是否缺少某些东西,或者从 Excel 值创建的数组是否导致了问题,或者是什么。任何帮助将不胜感激。

【问题讨论】:

    标签: excel powershell


    【解决方案1】:

    好的,这里有几件事...不要手动迭代,让 ComObject 使用 WorkSheet 的 UsedRange 属性来处理。然后使用 Columns 属性获取列作为对象,并使用 Item() 方法选择第 4 列(Excel 不像 PowerShell 那样从零开始)。然后你只想要列中的每个单元格,并且你想要扩展每个单元格的 Text 属性(跳过标题行),所以最终看起来像:

    $Array2 = $Sheet1.UsedRange.Columns.Item(4).Cells|% text|select -skip 1
    

    但这失败了。我尝试手动创建$array1 并将其与$array2 进行比较,我发现没有任何区别。但是我们知道字符串数组是有效的,那么如果我们在创建它的时候输入 cast $array2 呢?

    [string[]]$Array2 = $Sheet1.UsedRange.Columns.Item(4).Cells|% text|select -skip 1
    

    这很好,所以看起来这是某种类型的问题。我找不到方法,但是将变量转换为特定类型解决了这个问题。最后,您可能可以使用原始代码并在创建和修改数组时指定类型。

    Remove-Variable Array2
    $row = 2
    Do {
      $value = $Sheet1.Cells.Item($row,3).Text
      [string[]]$Array2 += "$value"
      $row++
    } until (!$Sheet1.Cells.Item($row,1).Text) #column 1 is less likely to have blanks
    

    【讨论】:

    • 太棒了!明天我会在工作中试一试,然后回来报告。
    • 这行得通!谢谢你。我在正确的轨道上,我只是因为我尝试了 [string] 而不是 [string[]] 而被卡住了。我想我应该把几个月前买的、还没读过的 Learn Powershell 书拿出来……
    • 哦,我对您建议的 Array2 构建也有疑问。它不会停止工作。要么比我当前的方法需要更长的处理时间,要么一旦达到空白就不会停止。稍后我会解决这个问题。
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2012-03-06
    • 2018-03-28
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多