2017-11-23 7 views
0

Ich entwickle ein Finanzmodell für eine Bank und stoße auf das folgende Problem, das ich nicht in Excel VBA lösen kann, und würde Ihre Hilfe zu schätzen wissen.Excel VBA Dynamischer Bereich/Loop-Problem

Ich habe ein einfaches Makro gebaut, das im Wesentlichen zwei Dinge tut: (i) es löscht Inhalte in einem bestimmten Bereich, (ii) es füllt den gleichen Bereich mit einer Formel. In einer sehr abgekürzten Weg sieht es wie folgt aus:

Sub AutoCalculateCashFlows() 
    Range(D208:L208).ClearContents 
    Range("L208").FormulaR1C1 = "=+R[-34]C-R[-34]C[-1]" 
    Range("L208").AutoFill Destination:=Range("E208:L208"), Type:=xlFillDefault 
End Sub 

Mein Problem ist, dass der Bereich, der automatisch bevölkert abhängt Zellen ab, wie viele sollte der Benutzer füllen im Bereich von E10 hat: L10. Benutzer werden diesen Bereich von rechts nach links auffüllen, aber ich weiß nicht, wie weit sie von Spalte L nach links gehen werden. Die Formel, die mein Makro automatisch auffüllt, benötigt mindestens zwei Daten, d. mindestens L10 und K10 sollten gefüllt werden, und wenn Letzteres der Fall ist, dann muss das Makro nur L208 mit Formel füllen, falls J10: L10 ausgefüllt wird, dann muss das Makro den Bereich L208 automatisch füllen: K208 und so weiter bis zu dem Punkt, dass, falls der volle D10: L10-Bereich ausgefüllt ist, E208: L208 mit Formel gefüllt sein sollte.

Ich habe gedacht, um dieses Problem über zwei Routen zu lösen: (i) nähert es als ein dynamisches Reichweitenproblem in diesem Fall brauche ich einen VBA-Code, um die vorletzte Zelle durch den Benutzer im Bereich D10 zu bestimmen: L10 und verwende den Spaltencode dieser Zelle unter "Ziel: = Bereich (" E208: L 208 ") oder (ii) führe eine Schleife aus, die den Bereich E208: L208 mit der Formel bis zur Zelle in der vorherigen Spalte füllt innerhalb des Bereichs D10: L10 wird vom Benutzer ausgefüllt und stoppt, wenn dies nicht der Fall ist.

Hope das macht Sinn und danke im Voraus für die Hilfe.

Antwort

1

Wenn Sie einen dynamischen Bereich in VBA benötigen, sollten Sie einfach einen erstellen. Dies ist wahrscheinlich die einfachste Methode:

Sub TestMe() 

    Dim colRange As Long 
    Dim rowRange As Long 
    Dim rngMain  As Range 

    rowRange = 10 

    With Worksheets(1) 
     colRange = .Cells(1, .Columns.Count).End(xlToLeft).Column 
     Set rngMain = .Range(.Cells(rowRange, colRange), .Cells(100, 200)) 
     MsgBox rngMain.Address 
    End With 

End Sub 

Es ist dynamisch, basierend auf dem zuletzt verwendeten Spalte in Zeile 1 des ersten Arbeitsblatts.

die zweite verwendete Spalte in Reihe Bezüglich 1, eine dieser 3 täte es wahrscheinlich für Sie, je nachdem, was genau Sie wollen:

.Cells(1, 1).End(xlToRight).End(xlToRight).Column 
.Cells(1, 1).End(xlToRight).Column 
.Cells(1, 1).End(xlToRight).Column + 1 
+0

Dank. Ich denke, das deutet mich in die richtige Richtung, aber aus der Perspektive der obigen Lösung würde ich meinen Bereich von der zweiten verwendeten Spalte in Zeile 1 bis L1 benötigen. Können Sie mir bitte mitteilen, wie Sie Ihren Code ändern können? –

+0

@TonyFiante - siehe Bearbeiten. – Vityata

+0

Der dritte hat den Trick für mich gemacht. Danke, Vityala. Wie beziehe ich mich später auf rngMain in meinem AutoFill-Befehl? Ich gebe folgendes ein, aber es kommt zu einem 'anwendungsdefinierten oder objektdefinierten Fehler': Bereich ("L10") AutoAusfüllen Ziel: = Bereich ("rngMain"), Typ: = xlFillDefault –