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

相关问题