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
)。
请注意,这些只是函数中使用的范围的示例,但不是作为一个整体作用,而是迭代传递给函数的所述范围内的每个单元格。
about_Return有两种解决方案:
function xlAssignRange
{
Param($shtSheet, [string]$strRange)
$rngRange = $shtSheet.Range($strRange)
return (, $rngRange)
}
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
}