5k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo!

Ich versuche nun seit Tagen verzweifelt eine Lösung für mein Problem zu finden.
Ich möchte in Excel ein Formular erstellen, welches ich dann an diverse Anwender
verschicken kann, um es von ihnen ausfüllen zu lassen. Natürlich soll dieses
Formular geschützt sein, bis auf die auszufüllenden Felder. U.a. soll von den
Anwendern Daten in Textform in eine Art Tabelle eingetragen werden. Da ich vorher
nicht weiß, wieviele Zeilen diese Tabelle haben wird, soll sich jedes mal, wenn der
Anwender eine Zeile ausfüllt, automatisch eine neue Zeile eingefügt werden.
Ich habe mich die letzten Tage durch viele Artikel und Lösungsvorschläge zu
ähnlichen Problemen gelesen. Leider bin ich auf keinen grünen Zweig gekommen,
was möglicherweise auch daran liegt, dass ich mich ganz neu mit VBA beschäftige.
Wäre daher für eine Schritt-für-Schritt-Lösung sehr dankbar.

Liebe Grüße
Caro

8 Antworten

0 Punkte
Beantwortet von
Hallo Caro,

für meine Begriffe ginge das mittels Userform (Textboxen oder Comboboxen), welche eine neue Eingabe in die nächste Zeile schreibt.

Gruß

Paul1
0 Punkte
Beantwortet von
Danke, Paul1, für die schnelle Antwort!

Leider kann ich deinen Vorschlag nicht umsetzen, da ich wie gesagt
Anfänger bin und noch nicht so tief in der Materie stecke.

LG
0 Punkte
Beantwortet von
Hallo Caro,

Teste mal ein nachvollziehbares Beispiel aus meinem Archiv, ob es so Deinen Vorstellungen entspricht.

http://p.aon.at/u/772405/?key=CQXHHLT97J9A&share=38635

In die Userform muß in diesem Beispiel lediglich im ersten Feld ein Datum eingegeben werden sonst ist kein Weiterkommen möglich.

Bei Fragen schreibe es

Gruß

Paul1
0 Punkte
Beantwortet von
Hey Paul1,

das trifft es leider nicht ganz, da ich es gerne ohne Userform hätte...

Ich hab mal aus dem, was ich bisher gefunden habe ein kleines
Makro geschrieben:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$28" Then

If Worksheets("Anmeldebogen").Cells(28, 2).Value <> " " Then
Worksheets("Anmeldebogen").Rows(29).Insert
End If

End If

End Sub


Im Prinzip wird, sobald ich etwas in die Zelle B28 schreibe, eine
neue Zeile eingefügt. Mein Problem ist jetzt noch, das ganze in einer
Schleife oder so unter zubringen, damit, wenn ich die neu
hinzugefügte Zeile beschreibe, wieder eine neue Zeile eingefügt
wird. (mein Tabellenblatt, mit dem ich arbeite heißt "Anmeldebogen")

LG
0 Punkte
Beantwortet von
Hallo Caro,

Ich müsste diesbezüglich selbst recherchieren, da wären die VBA-Experten gefragt.

Gruß

Paul1
0 Punkte
Beantwortet von
Hallo Caro,

Ich habe dich so verstanden, dass nach der Tabelle nichts mehr kommt.
Versuch also mal folgenden Code:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Cells(Rows.Count, 2).End(xlUp).Address _
And ActiveSheet.Name = "Anmeldebogen" Then

If Target.Value <> " " And Target.Value <> "" Then
Rows(Target.Row + 1).Insert
End If

End If

End Sub


Eigentlich ist And ActiveSheet.Name = "Anmeldebogen" nicht notwendig, da du den Code direkt in das Sheetmodul "Anmeldebogen" kopierst. Hier nur als zusätzliche Einschränkung angegeben.

Mit If Target.Value <> " " prüfst du ob ein Leerzeichen eingegeben wurde. Mit If Target.Value <> "" wird geprüft ob der Inhalt gelöscht wurde.

Tipp: Mit Alt + Enter kann man auch innerhalb einer Zelle einen Zeilenumbruch machen.

Gruß Mr. K.
0 Punkte
Beantwortet von
Hi ExcelKing!

Danke für deine Antwort!
... inwzischen hab ich selbst ein bisschen gebastelt und bin hierauf
gekommen:

Option Explicit

Private Sub worksheet_change(ByVal target As Range)

Dim lngZeile As Long
Dim lngSpalte As Long
Dim rngEnde As Range
Dim rngEineZelleUeberEnde As Range

lngZeile = ActiveCell.Row
lngSpalte = ActiveCell.Column

Set rngEnde = Application.Names("Ende").RefersToRange
Set rngEineZelleUeberEnde = rngEnde.Offset(-1, 0)

If rngEineZelleUeberEnde.Value = "" Then Exit Sub

Application.ScreenUpdating = False
Application.EnableEvents = False

Rows(target.Row).Copy
Rows(target.Row + 1).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
Rows(target.Row + 1).ClearContents

Cells(lngZeile, lngSpalte).Select

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub


... ist etwas umfangreicher als dein Code, funktioniert aber bisher.
Siehst du ein Problem in meinem Code?

Liebe Grüße!
0 Punkte
Beantwortet von
Hallo Caro,

Dein Code geht auch, ist aber sehr umständlich. Auf diese Weise hast du aber wenigstens ein paar Grundfunktionen von VBA kennengelernt.

Wo vielleicht ein Problem auftreten könnte ist bei lngZeile und lngSpalte, da du hier auf ActiveCell verweist. Nach Eingabe und vor Ausführen des Codes wird die ActiveCell verschoben. Meist ist das die darunterliegende Zelle. In den Optionen kann bei einigen Nutzern aber stattdessen die rechte, linke oder darüberliegende Zelle ausgewählt sein. Da du diese Variablen aber nur am Ende für Select verwendest, sollte auch das nicht schlimm sein.

Wenn du wie hier vor dem Einfügen einer Zeile in den Copy-Modus gehst, wird der gesamte Inhalt der kopierten Zeile in die neue übertragen, welchen du nun mit ClearContents wieder löschst, dadurch löst du ein neues Worksheet-Change Ereignis aus, dessen Ausführung du korrekt mit EnableEvents = false bzw. True am Anfang und Ende des codes unterbindest.

Es kann übrigens sein, dass du EnableEvents auch bei meiner Variante vor bzw. nach Rows.Insert nutzen musst. Ich habe den Code vorher nicht testen können.

Wie du für rngEnde auf die letzte Zeile kommst habe ich nicht ganz verstanden, da du hier über die Excel-Internen Namen gehst, aber solange es bei dir funktioniert...

Sorry für das viele Geschwafel

L. G. Mr. K.
...