2016-11-21 46 views
0

我是PowerShell的新手程序員,我正在嘗試執行excel搜索和更改格式和字體選項。這裏是我正在嘗試搜索單詞「PASSED」並將顏色更改爲綠色和粗體的代碼片段,目前該代碼確實退出,但未按預期進行更改,這是我無法弄清楚的錯誤,需要幫助這方面。Powershell腳本匹配excel單元格值的條件

$excel = New-Object -ComObject Excel.Application 
    $excel.Visible = $false 
    $excel.DisplayAlerts = $False 
    $workbook = $excel.Workbooks.Open("C:\test.xlsx") 
    $sheet = $workbook.ActiveSheet 

    $xlCellTypeLastCell = 11 

    $used = $sheet.usedRange 
    $lastCell = $used.SpecialCells($xlCellTypeLastCell) 
    $row = $lastCell.row # goes to the last used row in the worksheet 

    for ($i = 1; $i -lt $row.length; $i++) { 
    If ($sheet.cells.Item(1,2).Value() = "PASSED") { 
      $sheet.Cells.Item(1,$i+1).Font.ColorIndex = 10 
      $sheet.Cells.Item(1,$i+1).Font.Bold = $true 
       } 
    } 

    $workbook.SaveAs("C:\output.xlsx") 
    $workbook.Close() 

輸入(test.xlsx)文件具有以下

Module | test | Status 
ABC  a  PASSED 

它的安靜,每個單元測試的不同狀態一個巨大的文件。

+0

也'Value'是屬性不是一個方法,你應該刪除'()' – Avshalom

回答

1

$row是一個包含最後一個行號的字符串,相比之下for循環中的Length屬性會給你帶來麻煩,因爲它會給你字符串本身的長度。

將其更改爲:

for ($i = 1; $i -lt $row; $i++) { 

在循環內的if聲明,還有另外一個問題:=

爲了給相等比較兩個值,使用-eq操盤==僅用於分配):

if ($sheet.cells.Item($i,2).Value() -eq "PASSED") { 
    $sheet.Cells.Item(1,$i+1).Font.ColorIndex = 10 
    $sheet.Cells.Item(1,$i+1).Font.Bold = $true 
} 

最後, Excel單元格引用不是基於零的,所以Item(1,2)將引用在您的示例中具有值「test」的單元格(請注意它是如何將一行作爲第一個參數,並將列作爲第二個參數的)。將其更改爲Item(2,3)以針對正確的單元格進行測試,並將if單元格內的單元格座標轉置。

您可能需要更新for循環,以反映這個問題,以及:

for ($i = 2; $i -le $row; $i++) { 
    if ($sheet.cells.Item($i,3).Value() = "PASSED") { 
     $sheet.Cells.Item($i,3).Font.ColorIndex = 10 
     $sheet.Cells.Item($i,3).Font.Bold = $true 
    } 
} 
+0

即使添加當量爲後提到它沒有工作,沒有任何錯誤導致難以調試代碼,請您解釋一下爲什麼它不起作用並提供合適的解決方案。 – Emman

+0

@Emman更新了答案 –

+0

是的,我應該看到for循環,並有您的建議。謝謝 – Emman

相關問題