gpt4 book ai didi

excel - 与数组一起使用时 Excel Range.AutoFilter 出错(Powershell)

转载 作者:行者123 更新时间:2023-12-04 22:33:45 28 4
gpt4 key购买 nike

我正在使用 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)

Exception setting "AutoFilter": Cannot convert the "7" value of type "int" to type "Object".



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

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

最佳答案

好的,这里有几件事......不要手动迭代,让 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

关于excel - 与数组一起使用时 Excel Range.AutoFilter 出错(Powershell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50881556/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com