Hi, ich möchte per VBA in meiner Tabellen die letzte Zeile ermitteln und in der nächst freien zeile kopieren. DAnke.?

...komplette Frage anzeigen

2 Antworten

Die eleganteste Methode ist im obigen Link leider nicht enthalten (oder ich hab nicht genau genug geschaut):

Worksheets("Blatt1").Cells.SpecialCells(xlLastCell).Row + 1

liefert direkt die nächste Zeile

anstatt Worksheets("Name"). auch Activesheet. möglich

Ach so, die vielen anderen Anforderungen hab ich erst mal überlesen, mal sehen, was sich da machen lässt.

  • Dim R
  • ActiveSheet.Unprotect "Blatt-Passwort"
  • R = Worksheets("wohin").Cells.SpecialCells(xlLastCell).Row
  • Debug.Print Worksheets("wohin").Cells.SpecialCells(xlLastCell).Row
  • Worksheets("wohin").Range("A" & R & ":F" & R).Copy
  • Worksheets("wohin").Range("A" & R + 1)
  • Worksheets("wohin").Range("H" & R).Copy Destination:=Range("H" & R + 1)
  • Worksheets("wohin").Range("J" & R).Copy Destination:=Range("J" & R + 1)
  • Worksheets("wohin").Range("BF" & R & ":BG" & R).Copy Destination:=Range("BF" & R + 1)


war tatsächlich nicht ganz einfach. Die Syntax ist etwas umständlich (da ließe sich auch noch was vereinfachen, mag jetzt aber nicht mehr, es tut ja so, wie es ist)
Den Passwortschutz kannszt Du natürlich wiederherstellen, aber wenn Du das Modul nicht ebenfalls verbirgst, kann es ohnehin jeder auslesen.
Die Debug.print-zeile hab ich zur Kontrolle drin: Machst Du nämlich einen Fehlversuch, wandert die Lastcell eine Zeile nach unten, es wird eine leere Zeile ausgelesen und weiter kopiert, die letzte Zeile damit noch weiter nach unten geschoben. Um das zu korrigieren, musst Du nach Fehlversuchen oder wieder gelöschten Einträgen Zeilen unterhalb löschen (wirklich LÖSCHEN, nicht nur Inhalte entfernen!) und anschließend SPEICHERN!
Nur dann wird die Information bzgl der letzten Zeile/Zelle zurückgesetzt!

Viel Erfolg!

1
@Iamiam

das erste Copy muss so heissen:

Worksheets("wohin").Range("A" & R & ":F" & R).Copy Range("A" & R + 1)

(da darf also kein Umbruch rein nach .copy, nur ein Leerzeichen)

ausserdem kann man das erneute Worksheets("...") weglassen, ebenso ist später das Destination:= überflüssig

Hatte ich nur drin, um beim Debuggen alle Fehlermöglichkeiten auszuschließen (der tatsächliche Fehler lag dann ganz woanders...)

1
@Iamiam

Hey, vielen Dank für deine Bemühungen.

Leider habe ich einen Laufzeitfehler 1004. Darin steht, dass ich zuerst den Schutz des Blatts aufheben müsse, um diesen Befehl zu verwenden :(

Hast du da noch eine Idee?

0
@KaiserWilhelmXL

Das war gleich die 2. Codezeile.

Wenn Das Blatt verborgen sein sollte, geht ActiveSheet natürlich nicht, musst das ggf erst auf ähnliche Weise aufheben (weiß nie, ob es hidden = false oder visible = true heißt, kannst Dir aber so eine Aktion im VBA-Recorder aufzeichnen. Vllt(???) reicht es auch, das Worksheet zu benennen:

Worksheets("dessenName").unprotect "Blattpasswort"

0
@Iamiam

Danke für deine Mühe.

Aufzeichnen bringt mir leider nicht viel, da ich möchte, dass immer die letzte Zeile kopiert werden. Das kann ich leider schlecht simulieren.

Der Fehler ist leider unverändert :( Immer bei:

Debug.Print Worksheets(".....").Cells.SpecialCells(xlLastCell).Row

0
@KaiserWilhelmXL

Das Aufzeichnen sollte nur zum einmaligen Eruieren der richtigen Syntax dienen (ob es hidden oder visible heißt)

Das Debug.print ... tut in einem ungeschützten Blatt auf alle Fälle.

Zeichne mal nur den Vorgang der Blattauswahl und des manuellen Entschützens bei Dir auf, dazu ist der Recorder da, und kopiere das (viel zu ausführliche) Ergebnis an die Stelle des Worksheets("...") unprotect. (Mit Verstand Kürzen kann man dann immer noch.)

0
@Iamiam

Das Problem ist, ich habe die Excel-Datei nur übernommen und nicht selbst komplett entworfen, daher weiß ich auch nicht 100pro wie der Schutz per VBA bei meiner Excel-Datei funktioniert.

Könnte ich das über einen Umweg machen? Ich habe mir ganz unten mit einer Formel immer die letzte Zeile der Tabelle auslesen lassen. Könnte man sagen per VBA, ich möchte in dem Berech der Tabelle an der ersten Freien Position (Anhand der Spalte J) diese eine Zeile einfügen. Verstehst du mich?

0
@KaiserWilhelmXL

um -auch per VBA- im Blatt Änderungen vorzunehmen, muss der Blattschutz aufgehoben werden. (soll ja ein Schutz sein). Nehmen wir mal an, Du schaffst das, dann wäre der Codeausschnitt, der das bewirkt, Folgender:

  • Sub ZeileAusEinemBlattUnterEndeJkopieren()
  • Sheets("Herkunftsblatt").activate
  • Sheets("Herkunftsblatt").Range("A5").entirerow.copy (anstatt A5 kannst du eine andere Zelle, aber aus der zu kopierenden Zeile nennen)
  • Sheets("Zielblattname").activate
  • Range("J1").end(xldown).offset(1, -9).paste
  • end Sub


Das Passwort für das Blatt kann(?)/konnte man per VBA ermitteln, wie da beschrieben:
http://ulrichhanke.de/MicrosoftTipps/Excel-Blattschutz_entfernen.html

0

Was möchtest Du wissen?