2016-11-21 6 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

また、[値]は財産ではない方法があり、削除すべきである '()' – Avshalom

答えて

1

$rowは、forのループ内のプロパティーと比較すると、最後の行番号を含む文字列であるため、文字列自体の長さがわかります。

変更、それに:ループ内if声明で

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

、別の問題があります:代わりに=-eq演算子を使用し、平等のための2つの値を比較するために=

=代入の場合のみ):

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"のセルを参照します(行が最初のパラメータとして、行が2番目のように見えます)。正しいセルに対してテストするには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

たとしても-eqを追加した後それがうまくいっていないと言いましたが、コードをデバッグするのが難しいエラーはありませんでした。なぜそれがうまくいかず、適切な解決策を提供したかについて少し説明してください。 – Emman

+0

@Emmanは答えを –

+0

で更新しました。私はforループを見たことがあります。ありがとう – Emman

関連する問題