函数意外返回 Excel COM 对象

问题描述 投票:0回答:1
function xlAssignRange
{
    Param($shtSheet, [string]$strRange)

    $rngRange = $shtSheet.Range($strRange)

    $rngRange
    return
}

当我使用上述函数为一系列单元格分配 Excel COM 对象时,该行为有点出乎意料,因为返回的对象的处理方式类似于

ForEach-Object
而不是“整个”对象。

举个例子:

$rngA1E10 = xlAssignRange $shtSheetOne "A1:E10"

上面的代码将范围

A1:E10
放入
$rngA1E10
,但是如果我执行以下操作:

$rngA1E10.Select()

每个单元格都是 单独选择的,一次一个,以 E10 结尾。这不是我期望或打算发生的情况。

我实际上期望发生的是这里的功能等效,而不是使用上面的函数:

$shtSheetOne.Range("A1:E10").Select()

上面选择/突出显示了 A1

E10
整个范围
,这是我的预期行为。

如何修复此函数返回变量的方式,以便将其“作为整个对象”处理,而不是迭代该对象的每个组件?

编辑:严格来说只是另一个例子,相同的意外行为:

function xlCopyRange
{
    Param($strRange)

    $strRange.Copy() | Out-Null
}

传递

xlCopyRange
范围的
"E1:E10"
只会导致剪贴板在完成后具有E10的值(我可以看到每个值的“True”,因为它迭代范围中的每个单独的单元格省略
Out-Null
)。

请注意,这些只是函数中使用的范围的示例,但不是作为一个整体作用,而是迭代传递给函数的所述范围内的每个单元格。

excel powershell com
1个回答
0
投票
如果你想将数组作为单个对象返回,根据

about_Return有两种解决方案:

  1. 您可以使用一元数组表达式:

    function xlAssignRange { Param($shtSheet, [string]$strRange) $rngRange = $shtSheet.Range($strRange) return (, $rngRange) }
    
    
  2. 或者您可以将

    Write-Output

    -NoEnumerate
     参数一起使用:

    function xlAssignRange { Param($shtSheet, [string]$strRange) $rngRange = $shtSheet.Range($strRange) return Write-Output -NoEnumerate $rngRange }
    
    

$rngRange

 转换为数组也适用于您的情况:

function xlAssignRange { Param($shtSheet, [string]$strRange) [array] $rngRange = $shtSheet.Range($strRange) return $rngRange }
    
© www.soinside.com 2019 - 2024. All rights reserved.