2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo zusammen!
Ich fange gerade an mich in Vba einzuarbeiten und bin bei einem meiner ersten Makros prompt auf ein Problem gestoßen.

Ich habe da einen bestimmten Bereich ab C19 wo ich in die erste freie Zelle einen Wert einfügen möchte, den ich vorher aus der aktiven Zelle kopieren.

Ich habe mir zwei möglichkeiten ausgedacht, die aber beide nicht funktionieren:

If .Cells(3, 19).Value = "" Then Range("C19").PasteSpecial Paste:=xlValues Else: Range("C19").End(xlDown).PasteSpecial Paste:=xlValues

oder komplizierter:

Dim intz As Integer

ActiveCell.Copy
intz = 19

Do Until .Cells(intz, 3) = ""
.Cells(intz, 3).Select
intz = intz + 1
Loop

intz = intz - 1

Range(Cells(intz, 3)).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False

Was kann ich da ändern, bzw. verbessern?

lg Kokoska

2 Antworten

0 Punkte
Beantwortet von
Hi,

Ich fange gerade an mich in Vba einzuarbeiten...

Sehr schön. Interessantes, weitläufiges Feld, welches Du Dir da aneignen möchtest. Glückwunsch, Viel Spass und ausreichend Ausdauer!

Was kann ich da ändern, bzw. verbessern?

Ändern und verbessern kann man wohl immer etwas. Auch entwickelt wohl jeder für sich einen eigenen Stil beim Programmieren. (Ob dieser dann im Endeffekt ein "guter" oder "weniger guter" Stil sein wird, mag ich nicht beurteilen.)

Meine Meinung:
Solang Du mit Deinem Code allein bist, musst DU ihn verstehen und auch nachvollziehen können. So niemals jemand anders damit arbeiten/Anpassungen daran vornehmen muss, kann wohl auch niemand Einwände erheben. (die Funktion ist das Ziel ;-) )

Wie würde ich z.B. Deine Aufgabe lösen wollen? Mein Code sähe dabei aus wie folgt:
Sub Test()
Dim varScratch As Variant 'Zwischenlager fuer Inhalt der aktiven Zelle
Dim lngLetzteZelle_Reihe3 As Long 'VAR fuer letzte beschriebene Zelle in Reihe3 (C)

With ActiveSheet 'nachfolgender Abschnitt bezieht sich auf die aktive Tabelle
varScratch = ActiveCell.Value 'Wert/Inhalt der aktiven Zelle zwischenspeichern
lngLetzteZelle_Reihe3 = .Cells(Rows.Count, 3).End(xlUp).Row 'letzte beschriebene Zelle in Spalte"C" ermitteln
If lngLetzteZelle_Reihe3 < 19 Then 'wenn letzte Zelle oberhalb C19
lngLetzteZelle_Reihe3 = 18 'setze den Wert auf 18
End If
.Cells(lngLetzteZelle_Reihe3 + 1, 3).Value = varScratch 'Zwischenspeicherwert in die naechste freie Zelle der Spalte"C"
End With
End Sub


Siehe oben: Stil gut oder weniger gut, das zu beurteilen überlasse ich anderen. Ich für meinen Teil sehe in diesem Fall sofort, was ich da "getrieben" habe, und würde das in einem "echten" Project sicher auch nicht so detailiert kommentieren.

Was ich (und so wie ich es oft lese, auch andere) gern vermeide, sind die Methoden ".Activate" und ".Select". Sie verlängern die Laufzeit (gerade umfangreicher Makros oder Programme) doch enorm.

btw: Es wäre, wenn Du denn an vielen Meinungen zu diesem Thema interessiert bist, evtl. nicht schlecht, wenn Du einen Moderator /Admin darum bitten würdest, diesen Thread in die Gruppe "Tabellenkalkulation" zu verschieben. (Ist aber nur so eine Idee...)

Bye
malSchauen
0 Punkte
Beantwortet von
Hallo,

vielen Dank für die ausführliche Antwort. Wenn ich hier im falschen Forum bin tut es mir Leid, dann wäre es wohl wirklich besser es zu verschieben. Ich bin wegen einer ähnlichen Frage auf diese Seite hier gestoßen und die war auch hier gestellt.

Wie genau muss ich denn .
Cells(Rows.Count, 3).End(xlUp).Row
lesen? Er geht zur Zellen in Spalte drei, in Zeile alle gezählte Zeilen? Ist das nicht die allerunterste? und was bedeutet .Row ?

danke für die Hinweise, schon allein die Idee den Inhalt der Zelle einfach in einer Variabelen zwischenzuspeichern vereinfacht mir das ganze enorm.

lg Kokoska
...