2016-06-21 1 views
0

Jeder weiß an dieser Stelle können Sie etwas wie folgt ausführen, um eine Formel auf einen Bereich anzuwenden, und die Zellreferenzen auf der rechten Seite werden dynamisch aktualisiert:VBA: Verwenden von Array-Index in Position für die rechte Seite des Bereichs.Formel

Range("A1:A10").Formula = "=J2+M2" 

Das ist nicht, was ich fragen. Ich versuche, einen Array-Index in die rechte Seite eines Range.Formula übergeben und ich bekomme nicht die Ergebnisse, die ich begehre. Für den Anfang, hier ist mein Code und linke Seite funktioniert gut (mind Sie die xl. aufgrund dieses von MS Access initiiert wird):

' Get the new amount of columns since new ones have been added 
lastColumn = xl.Cells(1, xl.Columns.Count).End(xlToLeft).Column 

' Create and array of the header names to quickly locate column number 
cols = xl.Range(xl.Cells(1, 1), xl.Cells(1, lastColumn)).Value 

' Apply the formulas 
xl.Range(xl.Cells(2, xl.Match("FCode", cols, 0)), xl.Cells(lastRow, xl.Match("FCode", cols, 0))).Formula = 

So viel gilt für den richtigen Bereich. Wenn ich "ASD", "=J2+M2" auf die rechte Seite setze, aktualisiert es den korrekten Bereich. Das Problem kommt, wenn ich xl.Match(...) auf der rechten Seite als Teil der Formel verwenden muss.

Zum Beispiel:

"=ISBLANK(" & xl.Range(xl.Cells(2, xl.Match("NCode", cols, 0)), xl.Cells(2, xl.Match("NCode", cols, 0))) & ")" 

Gibt einen 1004: Application-defined or object-defined error. Dies sollte =ISBLANK(K2), =ISBLANK(K3), etc. im Anwendungsbereich zurückgeben.

nur eine einfache Referenzen, die =K2, =K3, etc landet gleich dem Wert, der in der Zelle K2 gleich sollte. Zum Beispiel =14 und das gilt für den gesamten Bereich. Es wird nicht einmal die Werte in K3, K4, etc zurückgeben. Dies ist die Formel, die dafür verwendet wird:

"=" & xl.Range(xl.Cells(2, xl.Match("PCode", cols, 0)), xl.Cells(2, xl.Match("PCode", cols, 0))) 

Was mache ich falsch? Der Grund hierfür ist, dass die Spalte, auf die ich verweisen muss, sich auf Änderungen zwischen Berichten bezieht, der Kopfzeilenname jedoch gleich bleibt. Es könnte Spalte M in einem Bericht sein, aber Spalte Z in einem anderen. Bis jetzt habe ich For Loops benutzt, aber sie sind langsam und wollen sie vermeiden.

+0

'Debug.Print' Ihre ISBLANK() Formel sein sollte, und ich denke, Sie werden es nicht, was Sie erwarten. –

+0

Warum verwenden Sie keine Variablen und füllen sie mit den verschiedenen Match-Ergebnissen? Dann müssen Sie nur die Variablen in die Formel einklinken und der Code wird viel einfacher zu beheben sein. – teylyn

Antwort

6
"=ISBLANK(" & xl.Range(xl.Cells(2, xl.Match("NCode", cols, 0)), _ 
         xl.Cells(2, xl.Match("NCode", cols, 0))) & ")" 

wahrscheinlich

"=ISBLANK(" & xl.Cells(2, xl.Match("NCode", cols, 0)).Address(false, false) & ")" 
+2

Sie prächtiger Mann. – sockpuppet

+0

Tim hat mehr Fortschritte beim "Magnificent Man" Abzeichen! – Rodger

Verwandte Themen