【问题标题】:PowerShell - Delete a Range of Rows from Excel After Locating Starting RowPowerShell - 找到起始行后从 Excel 中删除一系列行
【发布时间】:2021-05-31 05:36:48
【问题描述】:

我有一个 PowerShell 脚本,它在 Excel 文件中搜索特定值(“#N/A”,来自失败的 VLOOKUP),该值需要快速删除所有行之后并包括该行。

到目前为止我做了什么:

$sheetRange = $sheetData.UsedRange
$colRange = $sheetData.Range("F1")
[void] $sheetRange.Sort($colRange)
$fileWorking.Save()

$strFinder = "#N/A"
$rngSearch = $sheetData.Range("F1").EntireColumn
$txtFound = $rngSearch.Find($strFinder)
$RowFound = ($txtFound.Row)
for (($i = $RowFound); ($i -le $rowsTrans); $i++)
{
  $currRow = $sheetData.Cells.Item($i).EntireRow
  [void]$currRow.Delete()
}
$fileWorking.Save()

问题是,有超过 200k 行,我需要删除整个范围,而不是一次删除一行。虽然我对语法有些摸不着头脑,但我无法完全弄清楚实现这一点的正确语法或方法。

显然,for 循环只需要执行,我需要设置$RowFound$rowsTrans 之间的整个范围...但是这是如何完成的?

【问题讨论】:

  • 你能构造一个包含所有地址的连接字符串然后用它来删除吗?例如...Range("A2, A4, A10, A19").entireRow.Delete 使用范围对象定义很像范围对象的联合。
  • @Jeeped 我的语法,在分配“组”范围时是错误的。我自己想通了,但是您的回答与我的错误相同。我试图做 ...Range("A"+$RowFound+":A"+$rowTrans) (注意“:”)。您是否会将您的评论改写为更正我所描述的语法的答案,我会接受吗? ;)

标签: excel powershell


【解决方案1】:

我知道这已经很老了,但我找到了一种更好的方法来用单线做到这一点。这篇文章引发了我长达数月的单行之旅……哈哈

Measure-Command { $sheet.UsedRange.SpecialCells([Microsoft.Office.Interop.Excel.XlCellType]::xlCellTypeFormulas, 16).EntireRow.Delete() } #finds any row with an #N/A and blows it away

Referenced from here.

注释说明了它的作用,但它会在整个文件中搜索带有#N/A 的任何单元格。我确信有一种方法可以通过缩小到单列来提高效率。希望这可以帮助像我这样无法使用 range 命令的人!

顺便说一句,这将我在大约 30,000 行文件上的删除时间从 12-15 小时减少到了 30 分钟。

【讨论】:

    【解决方案2】:

    在运行Range.Find 循环时,构造一个包含所有地址的串联字符串。使用它来定义Range objectRange.EntireRow property.Delete

    ...Range("A2, A4, A10, A19").EntireRow.Delete
    

    使用范围对象定义很像范围对象的Union

    【讨论】:

    • 完美解决方案。我应该指出我很早就在做一个sort 进程,所以我总是知道之后的一切,包括第一个条目需要被删除,但是如果一个排序还没有完成,你的解决方案会更好,或者不是t 可靠(如,我需要找到可能的值,它们可能不按顺序排列)。绝对超出我的需要!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多