2016-04-07 10 views
0

Ich habe ein SVERWEIS wie dies in meiner Tabelle der F-Spalte eingefügt werden:Excel & Powershell - Paste Failure Mit VLOOKUPs

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

Welche ist, klar, gerettet sein, um richtig in Excel wie folgt aus:

= SVERWEIS (E2, '[locs.xlsx] Device' $ B $ 2: $ C24549,2, FALSCH)

(Es gibt ~ 25k Zeilen in der Referenzdatei, aber es gibt über 200k in der Datei habe ich die VLOOKUP in.)

Aufgrund der Größe der Datei, in der ich in der VLOOKUP machte, und der Kunde kann 32-Bit-Betriebssystem oder Excel werden verwendet, I kopieren Sie müssen/Paste nicht mehr als rund 30000 Zeilen zu einer Zeit, alle 200k Zeilen aus zu füllen, etwa 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() 
} 

ich möchte nur die Formel SVERWEIS von Zelle F2 kopieren, in den nächsten 20k Reihen Spalte F, speichern Sie die Datei und durchlaufen Sie sie erneut, bis ich die gesamte Datei ausgefüllt habe.

Wenn ich die oben tun, und ich habe verschiedene Methoden ausprobiert, abgesehen von diesem Beispiel erhalte ich immer einen MethodInvocation Fehler, , wenn ich die Datei explizit/Blatt sichtbar machen, wie so, bevor die obigen Schleife:

$xlsObject.Visible = $true 

Was habe ich an den Funktionsaufrufen Copy()/PasteSpecial() falsch verstanden? Warum muss das Blatt sichtbar sein?

HINWEIS: Ich habe versucht, den obigen Code anonymisieren und zu begrenzen, was notwendig ist, um das Problem zu verstehen. Die Code-Funktionen, möchte ich nur nicht die Excel-Instanz zu jedem Zeitpunkt in Aussicht gebracht werden. Ich würde es vorziehen, wenn das Skript für den Endbenutzer nicht sichtbar wäre.

Der MethodInvocation Fehler I erhalten, ist typischerweise wie folgt: "Pasteverfahren Arbeitsblatt-Klasse nicht bestanden" In Zeile:

Exception "Paste" mit "1" Argument (e) Aufrufen 1 char 25 + $ sheetTrans.PasteSpecial < < < < (9) + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: ComMethodTargetInvocation

Antwort

0

Ich konnte dies lösen, indem ein paar direkte Verweise zu tun, und die Änderung der Art, wie ich den Bereich zugewiesen, und dann Paste Aufruf, etwa so:

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

Mit Erklärungen wie folgt aus:

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