Excel VBA automatisches Ausfüllen: Wie programmiere ich, dass er automatisch die nächste Zeilennummer hernimmt?

...komplette Frage anzeigen

1 Antwort

Übergib 

rngPruefung

als Parameter.

was meinst du damit?

0
@agent888

Sub ArchivierungDerDaten(rngPruefung as Range)


Wie rufst du die Prozedur überhaupt auf?

1
@Suboptimierer

Momentan noch in der Programmierung, also mit F5

Später will ich eine function daraus machen!

1
@agent888

Dann würde ich zum Testen eine Aufrufprozedur machen (z. B. Sub Main()) und daneben die Funktion, wie du sie später im Sheet aufrufen willst → Function ArchiviereDaten(rngPruefung As Range) As Boolean

Aus rngPruefung ziehst du die Zeile als Integer mit rngPruefung.Row, die gesamte Zeile als Range mit rngPruefung.EntireRow

2
@Suboptimierer

was ist eine aufrufprozedur?

Also meinst du, dass ich Sub Main() mache und ein function ArchiviereDaten(rngPruefung as range) as boolean?

Also beides extra?

Und was soll ich dann in Sub main() reinschreiben?

0
@agent888

In Main() kommt nur der Aufruf:

Sub Main()
  dim rngPruefung as Range : Set rngPruefung = Tabelle1.Cells(3, 12)   debug.print ArchiviereDaten(rngPruefung)
End Sub

Hinweis: Wenn du deine Funktion im Sheet nutzen willst, wird sie nur bei Neuberechnung des Zellwerts ausgeführt. Das ist i. d. R. nur dann der Fall, wenn du sie kopierst oder editierst und mit Enter verlässt.

2
@agent888

Daraus machst du wie oben vorgeschlagen eine Funktion und belässt sie, wie sie ist, mit der Ausnahme dass du den Parameter hinzufügst und rngPruefung nicht mehr in der Funktion setzt.

Du musst außerdem einen Rückgabewert definieren, der später in der Zelle stehen soll.

ArchiviereDaten = "hat alles geklappt" ' zum Beispiel

1
@agent888

Jetzt verstehe ich was du meinst mit Sub und Function!

Die Sub ist nur zum ausführen der function!

Danke Suboptimierer für deine unglaublich tolle Hilfe und Gedult mit mir!

1
@Suboptimierer

Ja, ich bin eh noch nicht ganz fertig....

Du solltest auch einmal wissen, was ich da mache, deshalb sag ich's dir:

Das Programm schreibe ich für die Schulbücherei! Ich hab dem zuständigen Lehrer den Vorschlag gemacht über die Sommerferien ein Programm dazu zu entwickeln!

Die Spalte in der rngPruefung ist, in die schreiben die Bibliothekare mit Strg + . immer ein Datum. Die Spate heißt "Zurückgegeben" also hier kommt ein Datum rein sobald ein Buch zurückgegeben wurde. Dann wird die ganze Zeile in das Tabellenblatt Archivierung kopiert! Soweit bin ich bis jetzt, einiges muss noch gemacht werden

PS: Bin 13 Jahre alt und gehe in die Hauptschule/Neue Mittelschule

0
@agent888

Mein aktueller Code:

Function ArchiviereDaten(rngPruefung As Range) As Boolean
    Dim rngKopie As Range
        Set rngKopie = Tabelle1.Rows(3)
        Set rngPruefung = Tabelle1.Cells(3, 12)
            If rngPruefung <> "" Then
               rngKopie.Copy Destination:=Tabelle5.UsedRange.Rows.Offset(1).EntireRow
            End If
End Function
Sub main()
Dim rngPruefung As Range
    Set rngPruefung = Tabelle1.Cells(3, 12)
        Debug.Print ArchiviereDaten(rngPruefung)
End Sub

Das mit dem weiterzählen bekomme ich leider nicht hin . :-$

0
@agent888

Wichtig ist zu wissen, was das Archivieren auslösen soll.

Wenn du z. B. eine Schaltfläche in dein Sheet einbaust, dann kannst du mit ActiveCell die gerade aktive Zelle ansprechen.

Startest du einfach ein Makro, kannst du der Funktion nichts als Parameter übergeben.

Wenn du Excelformeln wie SVERWEIS usw. verwenden willst, wird die Archivierungsfunktion nur beim Berechnen der Zellen ausgeführt.

Willst du es ausführen, sobald in der Spalte sich etwas ändert, bekommst du automatisch am Ereignis mit, welche Zelle geändert wurde.

2
@agent888

Schlussendlich soll das Programm folgendes können:

Wenn der Bibliothekar in der Spalte L (egal welche Zeile) das Datum mit Strg+. eingibt und Enter drückt, dann wird die gesamte Zeile in der das Datum eingetragen wurde ins Tabellenblatt Statistik kopiert und die Zellen E bis L dieser Zeile werden wieder gelöscht (Falls es nötig ist, in Spalte L eine Formel zu erstellen, soll die Formel nicht gelöscht werden, nur das Datum)

0
@agent888

Das würde ich über ein Ereignis lösen. Das Löschen hast du in deinem Beispiel noch gar nicht drin.

Vorschlag:

Private Sub Worksheet_Change(ByVal Target As Range)
  If (Target.Count = 1) And (Not Intersect(Target, Range("L:L")) Is Nothing) Then
    If IsDate(Target.Value) Then
      Target.EntireRow.Copy Destination:=Tabelle5.UsedRange.Rows.Offset(1).EntireRow
    End If
  End If
End Sub
2
@Suboptimierer

Das Sheet von dir habe ich mir noch nicht angeschaut, aber noch ein paar Hinweise:

Wenn du das soeben in Spalte L eingetragene Datum nach dem Kopieren wieder löschen willst, musst du die Ereignisse vorher deaktivieren.

Das UsedRange erstreckt sich über mehrere Zeilen. Ein Offset verrückt nur die Adresse der gesamten Matrix. Du hast immer noch eine Zeilendimension > 1. Deswegen musst du die letzte Zeile explizit auswählen.

Nächster Versuch:

...
    If IsDate(Target.Value) Then
      Application.EnableEvents = False
      On Error GoTo Fehler
      Target.EntireRow.Copy Destination:=Tabelle5.UsedRange.Rows(Tabelle5.UsedRange.Rows.Count).Offset(1).EntireRow
      Target.Resize(1, 8).Offset(0, -7).Delete ' Spalte E bis L
Fehler:
      Application.EnableEvents = True
    End If
...
1
@Suboptimierer

Welchen Code soll ich jetzt wo hinschreiben? Ist das Sub wieder extra und gehört der zweite Code den du geschrieben hast zum  Private Sub dazu oder wird das vom Private Sub dadurch ersetzt?

Bitte verlier nicht die Geduld mit mir, ich bin dir sehr dankbar, dass du mir hilfst!

Also bitte schick de kompletten Code, das heißt alles was ich brauche um  das auszuführen so wie ich es dann einfügen soll, sonst weiß ich nicht was ich wohin schreiben soll!

Wäre sehr nett von dir! Mehr als alles bestens Bewerten kann ich leider nicht für dich tun!

0
@agent888

Mit dieser ereignisorientierten Variante brauchst du nur die Sub in den Code des Tabellenblatts 1 kopieren.

Der obere Block kopiert nur (wie in deinem Beispiel). Da du erwähntest, dass du auch löschen willst, habe ich den unteren Codeschnipsel ergänzt. Du müsstest dann die entsprechende Stelle im oberen Code durch den unteren Code ersetzen.

Du kommst sowieso nicht umher, zu versuchen, den Code zu verstehen. Verstehst du ihn, weißt du auch, warum was wohin gehört.

Falls du ein paar Befehle nicht verstehen solltest, schlage sie nach oder frage hier wieder.

1
@Suboptimierer

Ich glaube ich habe mich da zu schlecht ausgedrückt, das was gelöscht werden soll, soll nicht vom kopierten, also Tabelle5 gelöscht werden, sondern von Tabelle eins!

0
@agent888

Wenn du den Code unter das Tabellenblatt 1 kopierst, sollte der Datensatz in Tabelle1 gelöscht werden.

Target ist die Zelle, in der das Datum mit Strg + . eingefügt wurde. Das ist der Dreh- und Angelpunkt. Die komplette Zeile des Datumsfelds wird zuerst kopiert. Danach wird der Bereich des Targets in die Länge gezogen und auf die zu löschenden Spalten geschoben.

1
@Suboptimierer

Oke, danke!

Was ist Target eigentlich? Ist das ein Schlüsselwort oder eine Variable?

Ich denke mal eine Variable aber oben in der Klammer steht (ByVal Targer as Range), was bedeutet ByVal?

0
@agent888

Target ist der Parameter, der zu dem Ereignis gehört. Sobald eine oder ein Bereich geändert wird, wird der geänderte Bereich als Target dieser Sub übergeben.

Das bedeutet, wenn jemand z. B. in L5 ein Datum einträgt, ist Target der Zellbezug auf L5.

0
@agent888

ByVal ist Standard (bedeutet, kann man weglassen). Es sagt aus, dass für die Funktion eine Kopie der übergebenen Variable erstellt wird. Das Original kann nicht verändert werden. Der Gegenpart ist ByRef.

0

Was möchtest Du wissen?