Aktive Zeile als Range-Objekt im Makro

Hallo Expertinnen und Experten,

ich habe mir ein kleines Makro über dieses Aufnahme-Tool erstellt, dass Daten aus einem externen Datenblatt (blabla.txt) ausliest und diese in die aktuelle Tabelle1 einpflegt.
Problem dabei ist nur die Zeile ‚Destination:=Range(„D469“)‘, weil er beim Ausführen des Makros jedes Mal in der Zelle D469 anfängt und die Daten dort einpflegt.

Jetzt habe ich keine Lust jedes Mal vor dem Ausführen die Range manuell zu ändern, weil dann könnte ich mir auch das Makro sparen.

Ich würde sonst gerne mit ActiveCell arbeiten, also das er in der Zelle anfängt, die ich gerade ausgewählt habe. Ist das möglich? Wie lautet der korrekte Befehl? (meine Versuche mit ActiveCell.Row & ActiveCell.Column haben nicht funktioniert)

Oder wie könnte man dem Makro sagen, dass er erst bei der nächsten freien Zelle anfängt?

Vielen Dank für eure Zeit und eure Hilfe.
MfG, JL

Oder wie könnte man dem Makro sagen, dass er erst bei der
nächsten freien Zelle anfängt?

Hallo JL,


Dim Zei as Long

Zei=Cells(Rows.count,4).end(xlup).row+1
… Destination:=Range(„D“ & Zei)

4 ist die Spaltennummer, hier also 4 für D.

Gruß
Reinhard

Grüezi jlesch

Eigentlich sollte hier folgendes ausreichend sein:

Destination:=ActiveCell


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

@Thomas:
Schönen Dank , ich werde es gleich mal ausprobieren!
Wobei mein Fehler mit der Methode über ActiveCell wohl daran lag, dass ich mit Range arbeiten wollte. Das wäre ja schön.

@Reinhard:
Vielen Dank für das kleine Makro, aber um in Zukunft sowas selber zu machen zwei kleine Verständnisfragen:
warum end(xlup)? Müsste er nicht von oben runter, also end(xldown) zählen? Und wieso muss in die Range nochmal das D, wenn die 4 in Zei schon die Spalte definiert?

Hallo Jlesch,

warum end(xlup)? Müsste er nicht von oben runter, also
end(xldown) zählen?

du hast prinzipiell Recht, aber das Problem sind Leerzellen.
Xlup usw. entsprechen ja in Excel des Haltens der Strg-Taste und Drückens der entsprechenden Pfeiltaste.

D.h., wenn du A1 stehst, A4 ist leer und in A5 steht wieder was, ergibt xldown 3, aber 5 wäre richtig.
Also stellt man sich in A65536 und macht xlup und erhält die 5.

Damit das auch bei Riesentbellen in Excel2007 klappt, das ja mehr Zeilen als 65536 hat, nimmt man rows.count, das klappt in allen Versionen problemlos.
Es gibt ein Problem wenn A65536 belegt ist, dann kommt ein falsches Ergebnis.

Das kann man bei Bedarf aber abfangen:

Dim lngLetzte As Long
lngLetzte = IIf(Cells(Rows.Count, 1).Value = "", Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
If lngLetzte + 1 \> Rows.Count Then
 MsgBox "Spalte voll"
 Exit Sub
End If
...Destination:=Range("A" & lngletzte + 1)

Kleineres Problemchen ergibt sich wenn die Spalte völlig leer ist, dann kommt man mit lngLetzte + 1 auf 2 , also dadurch bleibt A1 leer.
Kann man ähnlich abfangen wie A65536.

Und wieso muss in die Range nochmal das D,
wenn die 4 in Zei schon die Spalte definiert?

Destination:=Range(„D“ & Zei)

? Range (und Cells) brauchen beide Angaben. Hier ist „D“ die Spalte und „Zei“ die Zeilennummer.

Die 4 für 4te Spalte dient nur zu definieren in welcher Spalte nach dem untersten Zelleintrag gesucht wird.

Gruß
Reinhard

Wobei mein Fehler mit der Methode über ActiveCell wohl daran
lag, dass ich mit Range arbeiten wollte. Das wäre ja schön.

Hallo Jlesch,

mit ActiveCell geht natürlich auch, auf Thomas aufbauend, vielleicht suchst du ja sowas:

Destination:=ActiveCell.Offset(1,0)

Gruß
Reinhard

Vielen herzlichen Dank für diese umfangreiche Erklärung, Reinhard!

Problem gelöst. Übrigens mit beiden Methoden, wobei ich das Makro bevorzuge. Auf diese Weise muss ich nicht mal die Zelle auswählen und es läuft voll automatisch.