2016-06-21 19 views
0

enter image description hereExcel VBA In Formel basiert auf Reihe

So habe ich die Tabelle oben, verwende ich Excel VBA neuen Preise fügen Sie dann die Formel der Entscheidung Spalte hinzuzufügen.

Wie Sie sehen können, Zelle B2 Formel =IF($A2>50000,"Ignore","Buy") und Zelle B3 Formel sollte sein sollte =IF($A3>50000,"Ignore","Buy") so die Formel in B2 in A2 auf den Wert bezieht, ist dies das gleiche für B3-A3 und so weiter. Ich benutze die VBA unten, um die gleiche Formel zu leeren Zellen hinzuzufügen. Ja, es wird leere Entscheidungszellen geben und sie brauchen Formel. Ich darf AUTOFILL NICHT von oben nach unten verwenden. Ich habe versucht, unter Verwendung von (LastRow ist die usedrange.row):

Sheet1.Range("B2:B" & LastRow).SpecialCells(xlCellTypeBlanks). _ 
Formula = "=IF($A2>50000,""Ignore"",""Buy"")" 

Das Problem mit dieser VBA ist auch in Zelle B5 der Formel =IF($A2>50000,""Ignore"",""Buy"") ist, wenn es =IF($A5>50000,""Ignore"",""Buy"") sein sollte (sollte $A5 statt $A2 sein). Was mache ich falsch?

+0

die $ aus der Formel entfernen. –

+0

@RyanWildry leid, dass nicht funktioniert – jay

Antwort

1

Ich glaube, dass diese Antwort von Siddharth ist, was Sie suchen. https://stackoverflow.com/a/25788894/6494460

Es ist eigentlich ein Liner. Keine Notwendigkeit verwenden .Autofill

Range ("M3: M" & LastRow) .Formula = "= G3 & "","“& L3"

+0

Nein, ich fürchte, ich bin zu vermeiden, die nicht-leere, muss ich einfach Formel eingeben, um leere – jay

0

Sie können die Formel in allen Zellen einfügen, erwägen Sie die Formel in Zelle „B2“ haben:

Range("B2").Copy 
Range("B2:B" & LastRow).PasteSpecial xlPasteFormulas 
+0

Ich muss die nicht-leere Zellen allein lassen.Der Grund dafür ist, dass der Benutzer ist Ich habe die Freiheit, diese Formel durch eine personalisierte Antwort zu ersetzen.Wenn ich AutoFill verwende oder wenn ich die gesamte Spalte einfüge, werden diejenigen, die der Benutzer angepasst hat, gelöscht – jay

1

Mit SpecialCells(xlCellTypeBlanks) Sie wahrscheinlich einen nicht kontinuierlichen Bereich bekommen. Damit funktioniert der Autofill-Prozess nicht mit A1 Formeln. Aber mit R1C1 Formeln wird es.

Verwendung:

.Range("B2:B" & lastrow).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=IF(RC1>50000,""Ignore"",""Buy"")" 

RC1 bedeutet die R ow Sie sich gerade befinden, aber immer C PALTE 1 beheben.

Für R1C1 Referenzen siehe https://support.office.com/en-us/article/Overview-of-formulas-7abfda78-eff3-4cc6-b4a7-6350d512d2dc?CorrelationId=2bedf5ef-a3b7-4a82-9b12-6ee86b494ae9&ui=en-US&rs=en-US&ad=US#bmusing_references_in_formulas. Scrollen Sie nach unten zu The R1C1 reference style.

+0

Wie macht man FormelR1C1, wenn die zu platzierende Formel "" = ist IFERROR (SVERWEIS (RC3, Datenbank! $ A: $ F, 3, FALSCH), "" Missing "") " – jay

+0

@jay Sie könnte die 'INDIRECT' Funktion verwenden, siehe meine Antwort – arcadeprecinct

+1

@jay:' .FormulaR1C1 = "= IFERROR (SVERWEIS (RC3, Datenbank! C1: C6,3, FALSE)," "Missing" ")" '. 'C1' ist fix' C'olumn '1' =' $ A' und 'C6' ist fix' C'olumn'6' = '$ F'. –

0

bearbeiten für weitere Details: Sie können die R1C1 Referenzstil, wichtiger, R[1]C[1] Notation verwenden. Es gibt jedoch einen Vorbehalt für verschiedene Sprachen, siehe das Ende des Posts. Beispiele:

R2C4  'row 2, column 4 so it's the cell D2 in A1-notation 
R[2]C[4] 'the cell 2 to the right and 4 down from the current cell (where this reference is located) 
R[2]C4  'the cell 2 to the right from the current cell in column 4 (D) 
R[-2]C[-4] 'you can also give negative arguments, this is the cell 2 to the left and 4 up 
R[2]C  'the same as R[2]C[0] 
RC[4]  'the same as R[0]C[4] 
R2C  'the same as R2C[0] 
RC4  'the same as R[0]C4 
R2   'row 2 
C4   'column 4 (the same as D:D) 

Wie Sie aus den letzten drei Beispielen sehen können, können die Notationen nicht gemischt werden.

Jetzt für Ihren Fall:
Wenn Sie das folgende in Zelle Bx (ersetzen x durch eine beliebige Anzahl)

"=IF($Ax>50000,""Ignore"",""Buy"")" 

Dies wäre der R1C1 Formel

"=IF(RC1>50000,""Ignore"",""Buy"")" 

oder haben wollen es ist wichtiger, dass es die Säule auf der linken Seite ist:

"=IF(RC[-1]>50000,""Ignore"",""Buy"")" 

Letzteres wäre das gleiche wie das Fallenlassen der $ aus der ursprünglichen Formel.

Ihre zweite Formel war

"=IFERROR(VLOOKUP(RC3,Database!$A:$F,3,FALSE),""Missing"")" 

und Axel Antwort

"=IFERROR(VLOOKUP(RC3,Database!C1:C6,3,FALSE),""Missing"")" 

sollte nun klar sein.

Wenn Sie die -Eigenschaft nicht verwenden möchten oder können, aber immer noch die R1C1-Stilreferenz für eine einzelne Zelle verwenden, können Sie die Arbeitsblattfunktion INDIRECT verwenden. INDIRECT("R1C1",FALSE) ist eine Referenz auf R1C1. Die FALSE sagt ihm R1C1 anstelle von A1 Notation zu verwenden. Es kann sich etwas anders verhalten als eine einfache Referenz, wenn in der referenzierten Zelle etwas anderes als Zahlen vorhanden ist.

Ich persönlich mag die R1C1-Notation besser als die A1-Notation, weil es einfacher ist, Zellen relativ zur aktuellen Position zu referenzieren, aber auch weil sie für hohe Spaltennummern leichter zu lesen ist und näher an der Cells(rowIndex,columnIndex)-Syntax liegt.

Eine letzte Sache: In anderen Sprachversionen von Excel könnte R1C1 anders benannt werden. Das beeinflusst die Formel nicht, wenn Sie sie über VBA eingeben (denke ich), aber wenn Sie sie aus dem Arbeitsblatt eingeben wollen, müssen Sie dies im Hinterkopf behalten. Auf Deutsch ist es zum Beispiel Z1S1. Dies kann auch Probleme beim Öffnen der Datei mit einer anderen Sprachversion verursachen. Wenn Sie INDIRECT("R1C1",FALSE) in einer Formel verwendet, die INDIRECT und FALSE werden übersetzt werden, aber die Saite nicht so funktioniert es nicht :((Der letzte Teil aus dem Speicher ist)

+0

Was ist 'RC [-1]' und funktioniert das, wenn ich A1 anstelle von R1C1 wähle? Ich habe versucht, mit INDIRECT in Excel zu spielen, aber ich bekomme immer wieder "Verschieben von Zellen verursachte einen ungültigen Zellbezug" – jay

+0

@jay Ich habe den ganzen Beitrag neu geschrieben, aber ich bin mir nicht sicher über Ihren neuen Fehler. Ich würde wahrscheinlich besser 'FormulaR1C1' anstelle von' INDIRECT' verwenden – arcadeprecinct