2012-12-17 28 views
0

我有數千個條目 的XLSX文件的組我的第二過濾器內的欄,顯示只有$ workbook.AutoFilter某些信息(「數據」)PowerShell的創先爭優刪除行

此過濾器只需要然而第二秒刪除第一列=「數據」永遠帶着一個循環的所有行。

有沒有一種方法來捕捉隱藏的行的數組或範圍......或任何東西,我可以.DELETE()

我想這

[void] [Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
$Excel = New-Object -Com Excel.Application 
$WorkBook = $Excel.Workbooks.Open($filename) 
$Excel.visible = $true 
$Excel.selection.autofilter(1,"DATA") 
$sheet = $workbook.Sheets.Item(1) 
$max = $sheet.UsedRange.Rows.Count 
for ($i=2; $i -le $max; $i++) 
{ 
    $row = $sheet.Cells.Item($i,1).EntireRow 
    if ($row.hidden -eq $false) 
    { 
     $row.Delete() 
    } 
} 

固定 ..向後循環$ i-- * 但是,這讓我失望,因爲某種原因,它留下了大約10%的可見行數未刪除。如果我運行它兩次,但是擴展這將成爲一個更大的問題。

在一個完美的世界,我想這樣的事情

$Excel.selection.autofilter(1,"DATA").DELETE() 

預先感謝您的天才可能有任何提示或技巧。

更新:感謝Graimer,你是對的,我要在其他方向循環,這還需要相當長的時間10,000項...我正在尋找一種方式來做到這一點,無需進行手動循環。

如果我去$ Excel.visible = $ true,然後$ Excel.selection.autofilter(1,「DATA」)...然後作爲用戶我ctrl + A並刪除選定的行...其手動更快,然後循環過程...我不能幫助,但認爲必須有某種方式腳本的行動。

+1

這不加快它,但你有沒有試圖扭轉你的for-loop?至少在我的腦子裏,當你刪除第1行時,所有其他人跳上一個級別=有一個新行1)。所以要全部刪除,只要'$ i> 1'或其他什麼都可以從'$ max'開始,然後使用'$ i - '來完成 –

回答

0

原來很簡單 在應用濾波器後,從row1選擇一個範圍到Lastrow,刪除範圍。 因爲過濾器只顯示一個值範圍不能選擇隱藏的單元格