Excel & PowerShell - PasteSpecial Failure With VLOOKUPs

Deadly 提交于 2019-12-13 03:02:23

问题


I have a VLOOKUP being inserted into my spreadsheet's F column like this:

$vLookup = "=VLOOKUP($refCol,'$xlsLocsDIR[locs.xlsx]Device'!`$B`$2:`$C$rowsDvcs,2,FALSE)"
$sheetSave.Cells.Item(2,6).Formula = $vLookup

Which is, to be clear, saved properly in Excel like this:

=VLOOKUP(E2,'[locs.xlsx]Device'!$B$2:$C24549,2,FALSE)

(There are ~25k lines in the reference file, but there are over 200k in the file I have the VLOOKUP in.)

Because of the size of the file in which I'm doing the VLOOKUP within, and the customer could be utilizing 32-bit OS or Excel, I have to Copy/Paste no more than around 30000 rows at a time, to fill all 200k rows out, like so:

#32-bit OS/Excel app compatibility
#Excel/32-bit OS/memory errors occur if doing more than 30k cells
#instead, we do 20k, save, 20k, save, etc

for ($i=2; $i -le $rowsTrans; ($i+30000))
{
    #set the stop point, not to exceed total usedrows
    if (($i + 30000) -gt $totalRows)
        {$j = $totalRows}
    else 
        {$j = ($i+30000)}

    #copy the data
    $copyCell = (("F" + $i))
    $copyRange = $sheetTrans.Range($copyCell)
    $copyRange.Copy() | Out-Null

    $sheetSave.Activate()
    $pasteRange = $sheetTrans.Range(("F"+$i+":F"+$j)).Select()
    $sheetSave.PasteSpecial(7)
    $fileWorking.Save()
}

I only want to copy the VLOOKUP formula from Cell F2, into the next 20k rows of column F, then save the file, and iterate through again until I've populated the entire file.

When I do the above, and I've tried different methods aside from this example, I always receive a MethodInvocation Error, unless I explicitly make the file/sheet visible, like so, before the above loop:

$xlsObject.Visible = $true

What am I misunderstanding about the Copy() / PasteSpecial() function calls? Why does the sheet have to be visible?

NOTE: I've tried to anonymize the above code and limit what is necessary to understand the issue. The code functions, I just don't want to require the Excel instance to be brought into view at any point. I'd prefer the script run invisible to the end-user.

The MethodInvocation error I receive is typically as follows:

Exception calling "PasteSpecial" with "1" argument(s): "PasteSpecial method of Worksheet class failed" At line:1 char:25 + $sheetTrans.PasteSpecial <<<< (9) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation


回答1:


I was able to solve this by doing a few direct references, and changing the way I assigned the range, and then calling PasteSpecial, like so:

$pasteRange = $sheetTrans.Range(("F"+$i+":F"+$j))
$pasteRange.PasteSpecial($xlPasteValues) | Out-Null

With declarations like this:

Add-Type -ASSEMBLY "Microsoft.Office.Interop.Excel" | out-null
$global:xlPasteFormulas = -4123
$global:xlPasteValues = -4163


来源:https://stackoverflow.com/questions/36477528/excel-powershell-pastespecial-failure-with-vlookups

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!