Powershell使用已打开的Excel工作表选择整行

时间:2019-03-18 17:26:55

标签: excel powershell

我正在编写一些GUI以便于处理某些excel文档。它具有启动此功能的按钮,以打开excel文件并选择所需的行。

Function open_bible_file
{


$Excel = New-Object -ComObject excel.application

$Excel.WindowState= "xlMaximized"

$Excel.visible = $true

$WorkBook = $Excel.Workbooks.Open($SCOMBibleFile)

$Worksheet = $Workbook.WorkSheets.item("(1) Alerts")

$worksheet.activate()

$Range = $Worksheet.Cells.Item($excelrow,1).EntireRow

[void]$Range.Select()
}

}

它将打开文件,并根据需要选择行。但是,当我再次使用此按钮时,它将再次打开excel,然后再次选择另一行。当我尝试执行另一个按钮以仅选择行时,它对已经打开的工作表一无所知。我该如何解决?

1 个答案:

答案 0 :(得分:0)

代码应检查Excel是否已在运行,如果已经运行,则是否存在工作簿(文件$SCOMBibleFile)。在这种情况下,请重新激活Excel,否则启动一个新实例。

这应该有效:

function open_bible_file {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Path,

        [Parameter(Mandatory = $false, Position = 1)]
        [int]$RowToSelect = 1
    )

    $WorkBook = $null
    # check if Excel is already open
    try {
        # Note: this only gets the excel instances that were started 
        #       by the same user that runs this powershell function.
        $Excel = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')
        # test if the $Path workbook is present in this Excel instance
        foreach ($wb in $Excel.Workbooks) {
            if ($wb.FullName -match [regex]::Escape($Path)) {
                $WorkBook = $wb
                break
             }
        }
    }
    catch {
        # Excel wasn't opened yet, create a new instance
        $Excel = New-Object -ComObject Excel.Application
    }

    if (!($Excel))    { Write-Error "Error opening Excel"; return }

    if (!($WorkBook)) { 
        $WorkBook = $Excel.Workbooks.Open($Path)
    }

    # see https://docs.microsoft.com/en-us/office/vba/api/excel.xlwindowstate
    $xlMaximized = -4137

    $Excel.Visible = $true
    $Excel.WindowState = $xlMaximized
    $Excel.ActiveWindow.Activate()

    $Worksheet = $Workbook.WorkSheets.item("(1) Alerts")
    $worksheet.activate()
    $Range = $Worksheet.Cells.Item($RowToSelect, 1).EntireRow
    [void]$Range.Select()
}


$SCOMBibleFile = '<PATH TO YOUR .xlsx FILE>'
open_bible_file -Path $SCOMBibleFile -RowToSelect 3

如您所见,我已将open_bible_file函数更改为采用参数。第一个(-Path)是您给它打开文件名的地方。第二个(-RowToSelect)是您要选择的行号。

希望这会有所帮助