Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1464to1468
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA-frm: Code für mehrere Datenfelder

VBA-frm: Code für mehrere Datenfelder
06.01.2016 05:41:09
Giselher
Hallo an alle VBA-Freaks,
mit meinen Anfänger-Kenntnissen stecke ich gerade fest. Vielleicht kann mir jemand von Euch helfen:
Mein Formular hat 36 Felder, in die - nur falls überhaupt ausgefüllt - ein Datum eingegeben werden soll. Wenigstens ein Feld muß , die anderen müssen nicht, aber können ausgefüllt werden.
Wenn alle Felder leer sind, soll die Meldung "Eines von den Datumsfeldern muss einen Eintrag haben" ausgegeben werden.
Das klappt auch mit dem Code "...Value = "" And .... And ..." usw.
Nur für die Felder, die einen anderen Eintrag als ein Datum (z.B.abc) haben, soll die Meldung ausgegeben werden: "Das Datumsfeld xy muß ein Datum beeinhalten".
Das heißt, wenn überhaupt nichts eingetragen ist, soll auch keine Meldung erscheinen.
Probiert habe ich mit folgenden Codes:
1. If Not IsDate (Me.txt...Value) And ..... And .... And usw.
2. If Not IsDate (Me.txt...Value) Or ..... Or .... Or usw.
3. If Not IsDate (Me.txt...Value)[für jedes Datenfeld separat]
Keines dieser 3 Versuche hatte das Ergebnis, dass die Meldung nur für jene Felder erschien, die einen falschen Eintrag hatten. Sie erschien jedesmal auch für die Felder, die überhaupt keinen Eintrag hatten bzw. keinen haben sollten.
Für jede Anregung, wie das zu lösen ist, bin ich dankbar.
VBA-Grüße
Giselher

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
06.01.2016 08:57:34
Beverly
Hi Giselher,
vielleicht eine Möglichkeit:
Private Sub CommandButton1_Click()
Dim intZaehler As Integer
Dim intBox As Integer
Dim strBox As String
For intZaehler = 1 To 36
If Not IsDate(Me.Controls("TextBox" & intZaehler)) And _
Me.Controls("TextBox" & intZaehler)  "" Then
strBox = strBox & vbLf & "TextBox" & intZaehler
ElseIf Me.Controls("TextBox" & intZaehler) = "" Then
intBox = intBox + 1
End If
Next intZaehler
If strBox  "" Then
MsgBox "folgende TextBoxen enthalten kein Datum:" & vbLf & strBox
ElseIf intBox = 36 Then
MsgBox "Eines von den Datumsfeldern muss einen Eintrag haben"
End If
End Sub

Ich habe vorausgesetzt, dass die Textfelder TextBox1 bis TextBox36 heißen.


Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
07.01.2016 04:30:24
Giselher
Hallo Karin,
herzlichen Dank nicht nur für Deinen Vorschlag, sondern dass Du überhaupt geantwortet hast. Auf diese Weise bin ich auf Deine Seite gelangt: eine wahre Fundgrube! Sehr übersichtlich und gut erklärt! Auch die Links zu weiteren Seiten sind für mich von großem Nutzen.
Nun zu Deinem Vorschlag:
Da ich von VBA noch zu wenig weiß, hab bitte Nachsicht für laienhafte Verständnislücken.
Zu meiner frm:
Die Textfelder heißén nicht TextBox1 .... Textbox36, sondern haben jedes einen eigenen Namen, der jeweils mit txt ... beginnt, sind also nicht numeriert.
Außerdem gibt es noch weitere Textboxen vor den besagten 36, für die jeweils ein eigener Code-Teil besteht und die deshalb nicht von der vorgeschlagenen Prozedur betroffen sein sollen.
Frage dazu:
(Wie) muss der Code angepasst werden? Zur Zeit enthält er ja an mehreren Stellen: 1-36 bzw. +1 bzw. 36.
Sind nun stattdessen die 36 Namen einzeln einzugeben? Wenn ja, an welcher Stelle genau?
Für eine weiterführende Antwort wäre ich sehr dankbar.
Herzlichen Gruß
Giselher

Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
07.01.2016 08:09:26
Beverly
Hi Giselher,
wenn die TextBoxen keine fortlaufende Nummerierung haben ist das auch kein Problem.
Bei jedem Steuerelement findest du unter den Eigenschaften eine die "Tag" (engl. Schild oder Etikett) heißt. Dieses kann man nutzen, um die verschiedensten, für die Codeausführung wichtigen Inmformationen abzulegen - so auch in deinem Fall, um die relevanten TextBoxen von den nicht relevanten zu unterscheiden. Schreibe dazu in die Tag-Eigenschaft jeder TextBox, die infrage kommen, von Hand z.B. ein X. Mit dem folgenden Code werden dann alle Steuerelemente durchlaufen, geprüft ob in der Tag-Eigenschaft ein X steht und sie somit relevant sind und dann bei der Auswertung berücksichtigt:
Private Sub CommandButton1_Click()
Dim intBox As Integer
Dim strBox As String
Dim ctrControl As Control
' Schleife über alle Steuerelemente
For Each ctrControl In Me.Controls
' in der Tag-Eigenschaft steht X und somit ist das Element relevant
If ctrControl.Tag = "X" Then
If Not IsDate(ctrControl) And ctrControl  "" Then
strBox = strBox & vbLf & ctrControl.Name
ElseIf ctrControl = "" Then
intBox = intBox + 1
End If
End If
Next ctrControl
If strBox  "" Then
MsgBox "folgende TextBoxen enthalten kein Datum:" & vbLf & strBox
ElseIf intBox = 36 Then
MsgBox "Eines von den Datumsfeldern muss einen Eintrag haben"
End If
End Sub



Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
09.01.2016 00:18:59
Giselher
Hallo Karin,
funktioniert dank Deiner neuen Version genau so wie gewünscht (nachdem ich die 1. Zeile "PrivatSub CommandButton1_ Click()" entfernt habe. Die hatte eine Debug-Fehlermeldung "EndSub erwartet" - am Ende des vorausgehenden Code-Teils - angestoßen, weil ja der vorausgehende Code-Teil schon mit "PrivatSub.." beginnt).
Also nun alles bestens - was das Formular selbst anbetrifft!
Was mir noch fehlt, ist der entscheidende Schritt, das Formular mit der Tabelle zu verbinden.
Mit dem Beispiel von Martin Green´s "Fact-Sheet: Build a UserForm for Excel" bin ich da nicht weitergekommen, obwohl es ansonsten gut aufgebaut und erklärt ist. Ich kann aber seine Beispieldaten nicht für meinen Fall umsetzen (leider kann ich ihn nicht selbst fragen, weil er bisher nicht erreichbar war).
Am Code-Anfang (nach PrivatSub..):
Dim RowCount As Long
Dim ctl As Control
Nach 'Check User Input .....
'Write data to worksheet RowCount = Worksheets ("Sheet1").Range("A").CurrentRegion.Rows.Count
Frage 1: Ist anstelle Sheet 1 die für meine Tabelle gültige Zahl lt. ProjektExplorer("Sheet22")
einzutragen?
Frage 2: Beginnt "Range" immer mit "A1", auch wenn "1" die Überschriften enthält?
Der Beispiel-Code geht weiter mit
With Worksheets ("Sheet1")Range("A1")
.Offset(RowCount, 0).Value = Me.txtFirstName.Value
.Offset(RowCount, 1).Value = Me.txtLastName.Value
..... usw.
End With
Soweit ich das verstanden habe,
beinhaltet "Row" die Anzahl Reihen mit Daten
und die
Ziffern - wie "0"), "1") ...usw. die Positions-Nr. der Spalten in Distanz zu Spalte A.
Besonderheit in meiner Tabelle:
Spalte A ist mit fortlaufenden Nummern (z.Zt. 1 - 1000) vorbelegt , darf also nicht ausgefüllt werden.
Für die Reihe, die als nächste auszufüllen ist, soll aber im Formular - wenn die übrigen Eingabefelder noch leer sind - die jeweilige (vorbelegte) Nr. für die jetzt fällige Eingabe angezeigt werden
(im Formular ist natürlich ein entsprechendes Testfeld vorhanden, das grau hinterlegt ist als Hinweis, das hier nur angezeigt wird, aber nichts eingegeben werden soll. Wenn es möglich ist, dieses Feld für Eingaben zu sperren, wäre das noch besser).
Ideal wäre auch, wenn man im Formular durch die Tabelle blättern könnte, wie das in Access-Formularen geht (mit "vor", "zurück", "Anfang", "Ende" und "Neu" Schaltflächen) oder sogar bei simplen Excel-Masken. In der VBA-Werksammlung befinden sich aber in der Standard-Ansicht nur Bildlauf-Leiste u. Drehfeld.
Gibt es dennoch für Exc.-VBA eine ähnliche Möglichkeit wie in Access, die irgendwo verborgen ist? Oder kann der gewünschte Effekt auf andere Weise erreicht werden?
Für mich sind das viele Fragen. Aber, wenn ich mich verständlich ausgedrückt habe, ist das für Dich wahrscheinlich nur eine Routine-Übung. Darf ich also nochmal um Deine Hilfe bitten?
Mit erwartungsfrohem Gruß
Giselher

Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
09.01.2016 08:49:46
Beverly
Hi Giselher,
wenn du meinen Code in eine andere Sub eingebunden hast, brauchst du natürlich weder die erste Zeile noch die letzte - aber das konnte ja nicht wissen.
Zu Frage 1: ja
Zu Frage 2: der Codeteil Worksheets("Sheet1").Range("A1").CurrentRegion.Rows.Count ermittelt die Anzahl an Zeilen in einem zusammenhängenden Zellbereich (ohne Leerzellen dazwischen), ausgehend von Zelle A1 - wenn also bei Spalte A bereits bis Zeile 1001 Daten vorhanden sind (A1 mit Überschrift und A2:A1001 Zahlen 1 - 1000) darfst du nicht "A1" als Grundlage sondern musst z.B. "B1" verwenden (oder eine andere Spalte, in die ohne Leerzellen fortlaufend Daten eingetragen werden). Am günstigsten ist jedenfalls B1, da Spalte B offensichtlich deine erste Spalte mit den eigentlichen Daten ist und ohne Leerzellen befüllt wird:
With Worksheets("Sheet1").Range("B1")
.Offset(RowCount, 0).Value = Me.txtFirstName.Value
.Offset(RowCount, 1).Value = Me.txtLastName.Value
'..... usw.
End With

Zu Frage 3: benutze entweder ein Label für die Anzeige der nächstfolgenden Nummer oder eine TextBox, für die du die Eigenschaft "Enabled" auf False setzt - damit ist kein Zugriff darauf möglich. Anzeigen kannst du die Nummer aus Spalte A, indem du (wie bereits weiter oben abgehandelt) die letzte belegte Zeile in Spalte B ermittelst Worksheets("Sheet1").Range("B1").CurrentRegion.Rows.Count und dann mittels .Offset(RowCount, -1) den Wert aus Spalte A erhältst.
Zu Frage 4: direkt von einer Zeile zu anderen scrollen wie in Access geht in Excel nicht, man kann so etwas allerdings mit etwas Aufwand mittels ScrollBar oder SpinButton programmieren.


Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 08:25:41
Giselher
Hallo Karin,
erstmal danke für Deine letzte Erklärung, die ja sehr einleuchtend war.
Leider mache ich noch irgendwo einen Fehler - ich weiß bloß nicht wo genau.
Also, ich hab´s testweise erstmal mit einigen Spalten wie folgt probiert:
'Write Data to worksheet
RowCount = Worksheets("Sheet22").Range("B1").CurrentRegion.Rows.Count
With Worksheets("Sheet22").Range("B1")
.Offset(RowCount, -1).Value = Me.txtDN.Value [Dokumenten-Nr.]
.Offset(RowCount, 0).Value = Me.txtED.Value [Eingangsdatum]
.Offset(RowCount, 1).Value = Me.cboDA.Value [Dokumenten-Art]
.Offset(RowCount, 2).Value = Me.txtDD.Value [Dokumenten-Datum]
.Offset(RowCount, 3).Value = Me.txtDok.Value [Dokument-Name]
.Offset(RowCount, 4).Value = Me.txtMailIn.Value [Eingangsart Mail; 5=Fax, 6=@ usw.]
.Offset(RowCount, 10).Value = Me.txtactDat.Value [Datum eines der 36 möglichen Bearb.-Stufen]
End With
Debuggen im Entwurfsmodus ist OK, erst beim Ausführen mit dem eigentlichen Formular gibt´s die Fehlermeldung "Laufzeitfehler 9: Index außerhalb des gültigen Bereichs" (danach funktioniert auch der Button "Cancel" nicht mehr).
Schreiben sollte der Code ab Zeile 496 (DN 495), ab da tut sich nichts. Ich hab auch wiederholt geprüft ob die Zeilen bis dahin ausgefüllt sind. Das ist bei den Spalten 0 - 3 der Fall (Spalte 4 muss nicht ausgefüllt sein, da sie nur alternativ zu den Spalten 5 - 8 zu befüllen ist).
Eigentlich sollten also ab Zeile 496 (DN 495) die Werte txtED,cboDA,txtDD,txtDok,(cboMailIn)(txtactDat)lt. Formular eingetragen werden. Aber leider bleibt die Zeile leer (s.o.).
Fällt Dir noch was dazu ein, was ich da noch falsch mache?
Herzlichen Gruß
Giselher

Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 09:58:04
Beverly
Hi Giselher,
wozu benötigst du den Zusatz in den [...]? Den gibt es in dem Code aus meinem vorhergehenden Beitrag nicht.


AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 19:01:31
Giselher
Hallo Karin,
der Zusatz [...] steht auch nicht in dem Code. Den habe ich nur für Dich zum besseren Verständnis hier hinzugefügt.
Frdl. Gruss
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 19:05:58
Beverly
Hi Giselher,
ok, das konnte ich nicht wissen.
Der Fehler "Index außerhalb des gültigen Bereichs" bedeutet, dass das angesprochene Objekt nicht vorhanden ist - heißt das Tabellenblatt vielleicht nicht "Sheet22"?


Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 19:27:16
Giselher
Hallo Karin,
das war aber eine schnelle Antwort. Schön, dass Du gerade online bist :-)
Also, im Projekt-Explorer steht Sheet22, obwohl die Tabelle nur 2 Sheets enthält. Das besagte Sheet habe ich zu Testzwecken aus der eigentlichen Tabelle in eine separate Testdatei kopiert. Dabei wurde die Sheet-Nr. beibehalten.
An die Möglichkeit, dass es daran liegen könnte, hatte ich auch schon gedacht. Allerdings funktioniert der "alte" Teil des Codes (also ohne die letzte Ergänzung `Write Data to WorkSheet) einwandfrei.
Übrigens, wenn man im Anschluss an die Fehlermeldung debuggt, wird die Codezeile "RowCount ...." gelb eingefärbt.
Könnte es sein, dass nur die letzte Ergänzung 'Write Data .... allergisch auf die kopierte Version der Tabelle reagiert?
Fragende Grüsse
Giselher

Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 20:03:27
Beverly
Hi Giselher,
ich kann an dem Code auch keinen Fehler erkennen. Könnte es ein, dass auf dem Tabellenreiter hinter oder vor Sheet22 ein Leerzeichen ist?


AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 20:51:22
Giselher
Hallo Karin,
der Tabellenreiter zu Sheet22 enthält ja den "richtigen" Sheet-Namen. Da ist auch kein Leerzeichen, weder vor noch hinter. Aber nach dieser Theorie dürfte m.E. ja auch der erste Code-Teil nicht funktionieren.
Ratlose Grüsse
Giselher
[Edit3]
Übrigens habe ich den Code nun um die noch fehlenden Anfangsteile ergänzt:
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub

Private Sub cmdClear_Click()
'Clear the form
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then
ctl.Value = ""
End If
Next ctl
End Sub

Anzeige
AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 21:06:55
Beverly
Hi Giselher,
Frage: ist im VBA-Editor Sheet22 der Name der in Klammern steht oder der ohne Klammern? Der Name in Klammern ist der Name der auch auf dem Tabellenreiter steht - diesen verwendet man so wie in deinem Code Worksheets("Sheet22"). Der Name ohne Klammern ist der Codename und darf so nicht verwendet werden. Ist das bei dir der Fall, dann muss der Code so heißen:
Sheet22.Range("B1").CurrentRegion.Rows.Count


AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 23:44:27
Giselher
Hallo Karin,
ich glaube, ein Fehler ist dank Deiner Hilfe schon mal entdeckt:
Im Projekt-Explorer steht: Tabelle22 (Test Exc-*Acc 3(2))
Unter "Eigenschaften" steht: 1. Zeile: (Name) Tabelle22
9. Zeile: Test Exc-*Acc 3(2)
Probiert habe ich es nun mit beiden Versionen:
1. Wenn ich im Code eintrage: RowCount .......... Tabelle22 ...
With Worksheets ... Tabelle22 ...
werden diese beiden Zeilen in rot ausgewiesen.
2. Wenn ich im Code eintrage: RowCount ...........("Test Exc-*Acc 3(2)"). ....
With Worksheets ....("Test Exc-*Acc 3(2)"). ...
ist debuggen OK,
aber
beim Formular-Test kommt wieder: Laufzeitfehler 9 "... außerhalb ...gültigem Bereich ..;
anschließendes debuggen führt zur Gelb-Färbung der Zeile RowCount.
*steht für "größer"-Zeichen, das hier im Forum - wie ich gerade gelernt habe - nicht verwendet werden
darf. Hoffentlich ist das nicht Ursache für das Nichtfunktionieren des Code.
Mit weiterhin ratlosen Grüssen
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 04:35:33
Giselher
Hallo Karin,
zuerst die gute Nachricht:
Der Code schreibt in die Tabelle :-)), es gibt keine Fehlermeldung und das Formular "cleared" sich von selbst für den nächsten Eintrag.
Wie das? Ich hab die Datei kopiert, das Leer-Register gelöscht und die eigentliche Tabelle auf dem Register und im Code umbenannt in den schlichten Namen "VBA-Test".
Vielleicht hat´s ja doch an dem "größer" im Registernamen der letzten Test-Tabelle gelegen. Anders kann ich mir jedenfalls nicht erklären, dass es jetzt funktioniert.
Jetzt die weniger gute Nachricht:
Es wird nicht in die vornumerierten Zeilen (z.Zt Zeile 1-599) geschrieben, sondern erst an deren Ende, also unter 600 statt derzeit unter 495 (495 ist die nächste freie Zeile, sofern die Vornumerierung unbeachtet bleibt).
Auch wird - aus dem gleichen Grund (?) - die Vornumerierung nicht wie gedacht im Formular angezeigt.
Ist das zu lösen?
Wenn nicht, müßte als Hilfslösung (*zähneknirsch) die jeweils nächste Nr. im Formular selbst eingetragen werden. Dazu sollte das Formular aber am rechten Bildschirmrand öffnen. Von den 4 Alternativen der Startup-Position öffnen jedoch 2 mittig und weitere 2 links. Kann man das anderweitig einstellen?
Auf jeden Fall bin ich dank Deines Hinweises auf die Registernamen nun einen wesentlichen Schritt weiter.
Als Versuch eines kleinen Dankeschöns ein Tip, der hoffentlich neu für Dich ist:
Vor ein paar Tagen habe ich mir die "ASAP Utilities" runtergeladen. Mit ist aufgefallen, dass sich einige der hier im Forum aufgeworfenen Probleme mit diesem (für mich genialen) Excel-Tool (über 300 Einzelttols) im Handumdrehen lösen lassen.
Allerdings habe ich bisher an keiner Stelle von einem Verweis auf dieses Tool gelesen.
Kennst Du es? So oder so, bei Gelegenheit würde mich interessieren, was Du davon hältst.
Viele Grüße
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 04:38:50
Giselher
Hallo Karin,
zuerst die gute Nachricht:
Der Code schreibt in die Tabelle :-)), es gibt keine Fehlermeldung und das Formular "cleared" sich von selbst für den nächsten Eintrag.
Wie das? Ich hab die Datei kopiert, das Leer-Register gelöscht und die eigentliche Tabelle auf dem Register und im Code umbenannt in den schlichten Namen "VBA-Test".
Vielleicht hat´s ja doch an dem "größer" im Registernamen der letzten Test-Tabelle gelegen. Anders kann ich mir jedenfalls nicht erklären, dass es jetzt funktioniert.
Jetzt die weniger gute Nachricht:
Es wird nicht in die vornumerierten Zeilen (z.Zt Zeile 1-599) geschrieben, sondern erst an deren Ende, also unter 600 statt derzeit unter 495 (495 ist die nächste freie Zeile, sofern die Vornumerierung unbeachtet bleibt).
Auch wird - aus dem gleichen Grund (?) - die Vornumerierung nicht wie gedacht im Formular angezeigt.
Ist das zu lösen?
Wenn nicht, müßte als Hilfslösung (*zähneknirsch) die jeweils nächste Nr. im Formular selbst eingetragen werden. Dazu sollte das Formular aber am rechten Bildschirmrand öffnen. Von den 4 Alternativen der Startup-Position öffnen jedoch 2 mittig und weitere 2 links. Kann man das anderweitig einstellen?
Auf jeden Fall bin ich dank Deines Hinweises auf die Registernamen nun einen wesentlichen Schritt weiter.
Als Versuch eines kleinen Dankeschöns ein Tip, der hoffentlich neu für Dich ist:
Vor ein paar Tagen habe ich mir die "ASAP Utilities" runtergeladen. Mit ist aufgefallen, dass sich einige der hier im Forum aufgeworfenen Probleme mit diesem (für mich genialen) Excel-Tool (über 300 Einzelttols) im Handumdrehen lösen lassen.
Allerdings habe ich bisher an keiner Stelle von einem Verweis auf dieses Tool gelesen.
Kennst Du es? So oder so, bei Gelegenheit würde mich interessieren, was Du davon hältst.
Viele Grüße
Giselher

Dieses Tool...
12.01.2016 08:39:14
Beverly
Hi Giselher,
... kenne ich nicht und kann dazu also nichts sagen.
Wenn ich mir die Arbeit erleichtern will, dann schreibe ich mir selbst schnell ein Makro. ;-)


AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 05:37:30
Giselher
[Edit] zum Post v. 12.01.16 04:38
Auch wenn die Vornumerierung in Spalte A gelöscht wird (hier: Zeile 496 bis Zeile 599), wird weiterhin ab Zeile 600 geschrieben statt ab Zeile 495. :-(
Gerad geht mir durch den Kopf, ob durch das Löschen der Vornumerierung alle Spalten wirklich leer sind.
Erwischt! Sind sie nicht: am rechten Ende der Tabelle befinden sich noch verschiedene Formeln, mit denen der Zeileninhalt ausgewertet wird.
Wenn ich die lösche, wird dann tatsächlich ab der nächsten freien Zeile geschrieben! :-)
Nachteil: nach jedem Abschluß der Einträge (beispielsweise eines Tages) müssen die Formel-Spalten
für diese Einträge wiederhergestellt werden.
Das ist lästig. Daher die Frage: Gibt es vielleicht eine Möglichkeit, im Code unter "RowCount" bestimmte Spalten von der Prüfung, ob die Zeile leer ist, auszuschließen?
So, gleich ist es 6:00 Uhr morgens und ich kann endlich Gute Nacht sagen.
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 08:35:55
Beverly
Hi,
die erste freie Zeile einer Spalte (im Beispiel A) kannst du so ermitteln:
    Dim lngErste As Long
lngErste = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows. _
Count) + 1


AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 19:22:51
Giselher
Hallo Karin,
danke für den Tip "erste freie Zeile ermitteln".
Ich möchte gern meine Frage wiederholen, ob es eine Möglichkeit gibt, mit "RowCount" bestimmte Spalten von der Prüfung, ob die Zeile leer ist, auszuschließen.
Wenn ja, könnte der Code in die Tabelle schreiben, obwohl in der betreffenden Zeile Zellen mit Inhalt sind.
So könnten im vorliegenden Fall Formeln am rechten Rand der Tabelle erhalten bleiben und dennoch würde der Code in die ansonsten leere Zeile schreiben.
Grüße
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 20:51:26
Beverly
Hi Giselher,
sorry, aber irgendwie verstehe ich jetzt dein Problem nicht - wenn du den Code aus meinem letzten Beitrag verwendest, kannst du doch in einer beliebigen!!! Spalte (unabhängig von allen anderen) die letzte belegte Zeile (bzw. erste freie Zeile) ermitteln. Du musst halt nur eine Spalte verwenden, in der eben keine Formeln stehen.


AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 23:45:14
Giselher
Hallo Karin,
vielleicht habe ich mich noch zu unklar ausgedrückt.
Ich möchte gerne in den letzten Spalten der Tabelle (CU bis CX) verschiedene Formeln im Voraus (z.B. bis Reihe 600) unterbringen.
Die nächste freie Reihe außer diesen Formeln ist aber z.B. die Reihe 500.
Also sollte der Code bei diesem Beispiel in die Reihe 500 schreiben, obwohl die Formeln der letzten Spalten bis Reihe 600 gehen.
Deshalb meine Frage, ob der Code so geändert werden kann, dass bestimmte Spalten (bei diesem Beispiel die letzten am Ende der Tabelle) zur Bestimmung der nächsten freien Zeile unberücksichtigt bleiben.
Frdl. Gruß
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
12.01.2016 19:44:08
Giselher
Hallo Karin,
eine weitere für mich noch offene Frage ist, ob man das Formular so einstellen kann, dass es am rechten Bildschirmrand öffnet.
Kannst Du mir vielleicht dazu noch einen Tip geben?
Ich gehe davon aus, dass ich dann vorerst keine weiteren Fragen zu diesem Projekt habe und möchte mich noch mal ganz, ganz herzlich bei Dir bedanken für Deine Geduld und die verständliche Art, mit der Du Dein KnowHow hier weitergegeben hast.
Herzlichen Gruß
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 21:37:07
Giselher
[Edit4]
Hallo Karin,
Meine Schlußfolgerung war falsch. Der erste Teil des Codes bezieht sich ja nur auf das Formular und noch nicht auf die Tabelle. Also funktioniert nur der Codeteil nicht, der sich auf die Tabelle bezieht.
Mit ein wenig klarer sehendem Gruß
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 19:09:38
Giselher
[Edit]
hier der ganze Code "am Stück", wie ich ihn für den Test verwendet habe:
Private Sub cmdOK_Click()
Dim RowCount As Long
Dim ctl As Control
'Check user input
If Me.txtED.Value = "" Then
MsgBox "Please enter a date of receipt.", vbExclamation, "Dokumenten-Erfassung"
Me.txtED.SetFocus
Exit Sub
End If
If Not IsDate(Me.txtED.Value) Then
MsgBox "The datebox must contain a date.", vbExclamation, "Dokumenten-Erfassung"
Me.txtED.SetFocus
Exit Sub
End If
If Me.cboDA.Value = "" Then
MsgBox "Please enter a document type.", vbExclamation, "Dokumenten-Erfassung"
Me.cboDA.SetFocus
Exit Sub
End If
If Me.txtDD.Value = "" Then
MsgBox "Please enter a document date.", vbExclamation, "Dokumenten-Erfassung"
Me.txtDD.SetFocus
Exit Sub
End If
If Not IsDate(Me.txtDD.Value) Then
MsgBox "The datebox must contain a date.", vbExclamation, "Dokumenten-Erfassung"
Me.txtDD.SetFocus
Exit Sub
End If
If Me.txtDok.Value = "" Then
MsgBox "Please enter a document name.", vbExclamation, "Dokumenten-Erfassung"
Me.txtDok.SetFocus
Exit Sub
End If
If Me.cboMailIn.Value = "" And Me.txtFaxIn.Value = "" And Me.txtEmailIn.Value = "" And Me. _
txtPIin.Value = "" And Me.txtNOin.Value = "" Then
MsgBox "Please enter kind of receipt.", vbExclamation, "Dokumenten-Erfassung"
Exit Sub
End If
Dim intBox As Integer
Dim strBox As String
Dim ctrControl As Control
' Schleife über alle Steuerelemente
For Each ctrControl In Me.Controls
' in der Tag-Eigenschaft steht X und somit ist das Element relevant
If ctrControl.Tag = "X" Then
If Not IsDate(ctrControl) And ctrControl  "" Then
strBox = strBox & vbLf & ctrControl.Name
ElseIf ctrControl = "" Then
intBox = intBox + 1
End If
End If
Next ctrControl
If strBox  "" Then
MsgBox "folgende BSt-Datumsfelder enthalten kein Datum:" & vbLf & strBox
ElseIf intBox = 36 Then
MsgBox "Eines von den BSt-Datumsfeldern muss einen Eintrag haben"
End If
'Write Data to worksheet
RowCount = Worksheets("Sheet22").Range("B1").CurrentRegion.Rows.Count
With Worksheets("Sheet22").Range("B1")
.Offset(RowCount, -1).Value = Me.txtDN.Value
.Offset(RowCount, 0).Value = Me.txtED.Value
.Offset(RowCount, 1).Value = Me.cboDA.Value
.Offset(RowCount, 2).Value = Me.txtDD.Value
.Offset(RowCount, 3).Value = Me.txtDok.Value
.Offset(RowCount, 4).Value = Me.txtMailIn.Value
.Offset(RowCount, 10).Value = Me.txtactDat.Value
End With
End Sub
Grüsse
Giselher

AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 20:21:14
Giselher
[Edit2]
Der Testcode schließt noch mit "Clear the form" (in logischer Folge zum Code-Anfang "Dim ctl As Control":
'Clear the Form
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then
ctl.Value = ""
End If
Next ctl
End Sub

AW: VBA-frm: Code für mehrere Datenfelder
11.01.2016 20:35:38
Beverly
Meinen Hinweis bezüglich des Tabellennamens hast du gelesen?


AW: VBA-frm: Code für mehrere Datenfelder
06.01.2016 10:58:14
fcs
Hallo Giselher,
hier eine Datei mit zwei Beispiel-Userformen.
https://www.herber.de/bbs/user/102604.xlsm
Im frmDatum werden ähnlich wie bei Beverly die systematisch mit fortlaufender Nummer benamten Textboxen in einer Schleife geprüft.
Schaltfläche "Prüfen" zeigt das Ergebnis der Prüfung an.
Schaltfläche "OK" führt entsprechend Prüfergebnis bestimmte Aktionen aus.
Im Userform frmDatum_Klassen werden die Textboxen zusätzlich einer Klasse zugewiesen.
Für die Klasse ist festgelegt, dass nur Ziffern und Punkt in die Textboxen eingetragen werden können.
Gruß
Franz

AW: VBA-frm: Code für mehrere Datenfelder
07.01.2016 04:40:29
Giselher
Hallo Franz,
vielen Dank für Deine beiden Vorschläge.
Zunächst bin ich noch damit beschäftigt, mir Karin´s Beispiel zu erarbeiten.
Danach möchte ich Deine Userformen ausprobieren. Schon vorab kann ich sagen, dass ich eine Schaltfläche "prüfen" vermeiden möchte.
Das Beispiel mit den Klassen kommt wahrscheinlich für meine Zwecke eher in Frage, wenn ich richtig verstanden habe, dass es eine Art "Formatierungs-Zwang" enthält.
Bleibt die Frage, wie sich der von der derzeit verwendeten "If Not IsDate"-Funktion unterscheidet.
Nochmals Dank
und Gruß
Giselher

VBA-frm: Code für mehrere Textboxen mit Datum
07.01.2016 09:06:16
fcs
Hallo Giselherr,
leider kennt die Klasse der Textboxen nicht das Ereignis Exit.
So kann man die Eingabe nicht zu 100% auf Datum prüfen, und im Code des Userforms ist noch eine Prüfung der Textboxen auf gültiges Datum erforderlich.
Ich hab die Klasse der Textbox noch etwas verfeinert, so dass nicht nur die Tasteneingaben sondern auch Änderungen der Textbox überwacht werden.
So werden bis auf wenige Ausnahmen ungültige Datum-Eingaben in die Textboxen erkannt.
Wenn die Textboxen nicht systematisch benamt und durchnummeriert sind, dann kann man sie in der Initialisierungsprozedur einzeln den Elementen eines entsprechend deklarierten Daten-Arrays zuweisen statt in einer Schleife.
In den anderen Makros des Userforms kann man dann dieses Daten-Array in einer Schleife abarbeiten, um die Eigenschaften der einzelnen Textboxen abzufragen.
Ich hab den Code in meiner Beispieldatei mit 5 Textboxen für beide Userformen entsprechend angepasst.
https://www.herber.de/bbs/user/102638.xlsm
Gruß
Franz

AW: VBA-frm: Code für mehrere Textboxen mit Datum
09.01.2016 00:53:25
Giselher
Hallo Franz,
ich werde Dein Beispiel bei einer meiner nächsten - weniger komplexen - Tabellen einbauen, sobald ich Deinen Code besser nachvollziehen kann. Zur Zeit sind meine VBA-Kenntnisse dafür noch zu bescheiden.
Wie schon gesagt, präferiere ich dann eher das Beispiel mit den Klassen.
Vielleicht frage ich Dich dann noch mal zu Einzelheiten des Code.
Bis dahin
und einstweilen
nochmals dankeschön
Giselher

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige