Textboxen ausblenden wenn Spaltenüberschrift leer

Hallo Experten,

Ich möchte gerne meine Textboxen in einer Userform ausblenden wenn die dazugehörige Spaltenüberschrift leer ist…

Irgendwie klappt es nicht so ganz :frowning:

Sub Spaltenüberschriften\_ausblenden\_wenn\_leer(ByRef UF As UserForm)
Dim Spa As Integer
With ActiveSheet
 For Spa = 1 To 15 'Vorgesehen bis Spalte 15 TB`s
 If Datenmaske.Controls("TB" & Spa).Caption = .Cells(2, 2).Value = "" Then
 Datenmaske.Controls("TB").Visible = False
 Next Spa
End With

End Sub

Was ist hier falsch?

Gruss Sascha

Hallo Sascha.

Sub Spaltenüberschriften_ausblenden_wenn_leer(ByRef UF As
UserForm)
Dim Spa As Integer
With ActiveSheet
For Spa = 1 To 15 'Vorgesehen bis
Spalte 15 TB`s
If Datenmaske.Controls(„TB“ & Spa).Caption = .Cells(2,
2).Value = „“ Then
Datenmaske.Controls(„TB“).Visible = False
Next Spa
End With

End Sub

Die Systax ist nicht korrekt.

Möglicherweise sollte die For-Next-Schleife so geschrieben werden:

For Spa = 1 To 15
 If .Cells(2, Spa).Value = "" Then
 Datenmaske.Controls("TB" & Spa).Visible = False
 End if
Next Spa

VG
Carsten

Möglicherweise sollte die For-Next-Schleife so geschrieben
werden:

For Spa = 1 To 15
If .Cells(2, Spa).Value = „“ Then
Datenmaske.Controls(„TB“ & Spa).Visible = False
End if
Next Spa

Funktioniert auch nicht… :frowning:

Wenn ich einzelne Zellen überprüfe funktionierts.

If Range ("B2").Value = "" Then
TB2.Visible = False
Else
TB2.Visible = True
End If

Aber ich möchte nicht unbedingt für alle (B2:open_mouth:2) diesen Code eingeben.
Das kann man doch sicher automatisieren oder?

Hallo Sascha,

For Spa = 1 To 15
If .Cells(2, Spa).Value = „“ Then
Datenmaske.Controls(„TB“ & Spa).Visible = False
End if
Next Spa

Funktioniert auch nicht… :frowning:

was funftioniert was nicht, was geschieht? Der Code von Carsten funktioniert doch.

Wenn ich einzelne Zellen überprüfe funktionierts.

If Range („B2“).Value = „“ Then
TB2.Visible = False
Else
TB2.Visible = True
End If

Hast du den Code hier reingeschrieben und nicht kopiert?
Der Editor wandelt doch m.W.
If Range („B2“).Value = „“ Then
sofort um in
If Range(„B2“).Value = „“ Then

Probier mal diesen Code:

Sub Spaltenüberschriften\_ausblenden\_wenn\_leer(ByRef UF As UserForm)
Dim Spa As Long
With ActiveSheet
 For Spa = 1 To 15 'Vorgesehen bis Spalte 15 TB`s
 UF.Controls("TB" & Spa).Visible = Not .Cells(2, Spa).Value = ""
 Next Spa
End With
End Sub

Gruß
Reinhard

Guten Morgen zusammen,

ich hatte den Code als eigenen Sub hinterlegt. Keiner der Codes funktionierte.
und als ich bei Private Sub UserForm_Initialize()

den Code mittels: Call Sub Spaltenüberschriften_ausblenden_wenn_leer
aufrufen wollte bekam ich einen Fehler…

Nun habe ich Carstens Code direkt bei Userform_Initialize() eingefügt und es funktioniert. :smile:

Der Code von
Carsten funktioniert doch.

Ja stimmt. Mein Fehler. Entschuldige Carsten

Wenn ich einzelne Zellen überprüfe funktionierts.

If Range („B2“).Value = „“ Then
TB2.Visible = False
Else
TB2.Visible = True
End If

Hast du den Code hier reingeschrieben und nicht kopiert?
Der Editor wandelt doch m.W.
If Range („B2“).Value = „“ Then
sofort um in
If Range(„B2“).Value = „“ Then

Ja ich hatte den Code hier reingeschrieben anstatt kopiert

Vielen Dank für die Antwort Reinhard…
Bin recht vorwärts gekommen beim Milchprojekt.
Fehlt nicht mehr so viel, aber das mit dem:

  • Automatisch Ende Monat abspeichern und neue Mappe mit neuem
    Monat generieren
  • Pro Monat nur so viele Datensätze eingeben wie der Monat
    Tage hat
  • Mappennamen monatlich mit Milch_Dispo_09_2011.xls
    abspeichern

kriege ich nicht alleine hin :frowning:

Liebe Grüsse Sascha

Hallo Sascha,

ich hatte den Code als eigenen Sub hinterlegt. Keiner der
Codes funktionierte.
und als ich bei Private Sub UserForm_Initialize()

den Code mittels: Call Sub
Spaltenüberschriften_ausblenden_wenn_leer
aufrufen wollte bekam ich einen Fehler…

definiere „einen Fehler“. kam etwa eine Fehlermeldung? Welche?
wurde im Code eine Zeile farblich markiert, welche?

Nun habe ich Carstens Code direkt bei Userform_Initialize()
eingefügt und es funktioniert. :smile:

Zurück zu deinem Code, der konnte nie funktionieren weil eine TextBox keine Eigenschaft „Caption“ hat.

Call Sub Spaltenüberschriften_ausblenden_wenn_leer
muß Fehler auslösen, korrekt wäre gewesen:
Call Spaltenüberschriften_ausblenden_wenn_leer(Datenmaske)
in Userform_Initialize() der UF

Üb das bitte bzw. versuch das hinzukriegen ist mittel- und langfristig ein Muss.

Hast du den Code hier reingeschrieben und nicht kopiert?

Ja ich hatte den Code hier reingeschrieben anstatt kopiert

Mach das bitte nicht, entweder klappt es oder aber du baust da Schreibfehler ein die verwirren.
Beim Reinkopieren fällt diese Fehlermöglichkeit weg.

PS: Zu deiner Milchmappe, sorry, ich hatte paar Tage lang Erkältungsgeschüttelt keinen Kopp für was kompliziertes und sie erst heute angeschaut, also die im namen 21.9.2011 hat.

Gruß
Reinhard

Hi Reinhard,
Danke für Deine Antwort. Oje, ich hoffe Du bist nun wieder auf dem Damm und annähernd Gesund? Ansonsten Gute Genesung!!!

definiere „einen Fehler“. kam etwa eine Fehlermeldung? Welche?
wurde im Code eine Zeile farblich markiert, welche?

Zurück zu deinem Code, der konnte nie funktionieren weil eine
TextBox keine Eigenschaft „Caption“ hat.

Call Sub Spaltenüberschriften_ausblenden_wenn_leer
muß Fehler auslösen, korrekt wäre gewesen:
Call Spaltenüberschriften_ausblenden_wenn_leer(Datenmaske)
in Userform_Initialize() der UF

Dieser Fehler taucht auf:

„Fehler beim kompilieren: Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft“
Und die Zeile: Call Spaltenüberschriften_ausblenden_wenn_leer wird blau markiert.

PS: Zu deiner Milchmappe, sorry, ich hatte paar Tage lang
Erkältungsgeschüttelt keinen Kopp für was kompliziertes und
sie erst heute angeschaut, also die im namen 21.9.2011 hat.

Jo kein Problem. Ich habe ein wenig rumgetüftelt, Muss die Mappe Morgen an der Sitzung präsentieren… Deshalb hatte ich ein wenig Zeitdruck.

Die neueste Mappe ist hier: http://www.uploadagent.de/show-178046-1317052151.html

In der 1. UF habe ich das X oben rechts deaktiviert und unten rechts ein neues eingefügt. Passwort: imark

Das abspeichern resp. zwischenspeichern nach jedem klick auf „Speichern“ fehlt noch, sowie dass immer nur der aktuelle Tag eingegeben werden kann. ( Monat Sept. habe ich im Blatt „Hilf“ gelöst, jedoch nicht die weiteren Monate?).
Auch sollte es am 1. vom neuen Monat automatisch einen neuen Monat generieren. (Wie schon mal erläutert).

Den Rest der Datenmaske ( Abgabe an und Erhalten von, musste ich für Morgen mit Matrixformeln in den Tabellenblättern lösen) Weiss nicht ob das auch per VBA geht, ich kann das jedenfalls nicht programmieren. Ist recht kompliziert, den Wert den ich bei Abgabe an eingebe, auch dem richtigen Tabellenblatt zugewiesen wird, und sogleich beim „anderen Tabellenblatt“ in erhalten von geschrieben wird. Die Spaltenüberschriften Abgabe an und erhalten von werden sich immer wieder ändern…

Ich wünsche Dir einen schönen Abend, werde noch ein wenig tüfteln :smile:

Gruss
Sascha

Hallo Sascha,

„Fehler beim kompilieren: Falsche Anzahl an Argumenten oder
ungültige Zuweisung zu einer Eigenschaft“
Und die Zeile: Call Spaltenüberschriften_ausblenden_wenn_leer
wird blau markiert.

das deutet darauf hin daß du vergessen hast das Argument „Datenmaske“ anzugeben:
Call Spaltenüberschriften_ausblenden_wenn_leer(Datenmaske)

http://www.uploadagent.de/show-178046-1317052151.html
In der 1. UF habe ich das X oben rechts deaktiviert und unten
rechts ein neues eingefügt. Passwort: imark

Verstehe ich nicht, schreib doch die Zeilen für das neue „X“ in das Query_Close Ereignis der UF.

Ansonsten, willst du Code haben wo die UF gleich ohne Schließkreuz erscheint? Ist doch besser als da ein Schöließkreuz zu haben was deaktiviert ist.

Bei Auswahl von MSW1 kommt beim Start von Datenmaske ein Fehler Typen passen nicht o.ä.
Das liegt an dieser Schleife im Modul1, Prozedur „Fuellen“:

For Spa = 2 To 42 'Vorgesehen bis Spalte 42
 UF.Controls("TB" & Spa).Value = Format(.Cells(Nr + 2, Spa).Value, "###0.0")
Next Spa

Denn in Zelle AP29 steht „#Wert!“

Was schon sehr überfällig ist ist eine geplante Fehlerbehandlung im Code wo steht was der Code machen soll bei einem Fehler.
Suche mal im Internet nach
+vba +on +error +goto +errorhandler

Dadurch findest du Codebeispiele wie man sowas machen kann.
Der Name Errorhandler ist kein Muss, kannst auch andere Namen nehmen.

Schreib mal
MsgBox Me.Controls.Count
ganz unten in
Userform_Initialize
von „Datenmaske“.

Gruß
Reinhard

Hallo Sascha.

Die neueste Mappe ist hier:
http://www.uploadagent.de/show-178046-1317052151.html

Ich habe interessehalber 'mal die Mappe herutergeladen und geöffnet. Scheinbar soll die Datei „kommerziell“ eingesetzt werden.
Ich weiß ja nicht, wer das später benutzen soll, aber wenn Du es nicht selbst bist, solltest Du unbedingt noch ein paar Features einbauen. Z.B. war es problemlos möglich, über die Datenmaske Textwerte im Tabellenblatt zu speichern, was nach erneutem Aufruf der Datenmaske zu einem Fehler führt. Du müßtest normalerweise dafür sorgen, das entweder in die Textboxen der Datenmaske ausschließlich Zahlenwerte eingegeben werden können, oder vor dem Speichern überprüfen, ob ausschließlich Zahlenwerte enthalten sind und ggf. eine Meldung anzeigen, die zur Korrektur auffordert.

VG
Carsten

Hallo Sascha.

Ich habe auf dem Formular ‚Datenmaske‘ sage und schreibe 949 Steuerelemente gezählt (im Control-Dropdown des Code-Fensters).

Ist das korrekt so? Und wo sind die abgeblieben?

Kommt mir ein wenig komisch vor.

VG
Carsten

Hallo Carsten,

Ich habe interessehalber 'mal die Mappe herutergeladen und
geöffnet. Scheinbar soll die Datei „kommerziell“ eingesetzt
werden.

Ja, aber nur Intern in unserem Geschäft

Ich weiß ja nicht, wer das später benutzen soll, aber wenn Du
es nicht selbst bist, solltest Du unbedingt noch ein paar
Features einbauen. Z.B. war es problemlos möglich, über die
Datenmaske Textwerte im Tabellenblatt zu speichern, was nach
erneutem Aufruf der Datenmaske zu einem Fehler führt. Du
müßtest normalerweise dafür sorgen, das entweder in die
Textboxen der Datenmaske ausschließlich Zahlenwerte eingegeben
werden können,

daran habe ich nicht gedacht. Aber das stimmt. Dies sollte ein MUSS sein. Nur, wie mache ich das? Irgendwie mit Klassenmodul, oder?

Wollte es mit einer Gültigkeit in der Tabelle versuchen. Aber vba ignoriert dies total…

LG Sascha

WOW, 949 Steuerelemente… wie kriege ich die ungenutzten raus? Wird denn jedesmal wenn ich ein Steuerelement erstelle und wieder lösche, der Eintrag nicht gelöscht?

Hallo Reinhard,

„Fehler beim kompilieren: Falsche Anzahl an Argumenten oder
ungültige Zuweisung zu einer Eigenschaft“
Und die Zeile: Call Spaltenüberschriften_ausblenden_wenn_leer
wird blau markiert.

das deutet darauf hin daß du vergessen hast das Argument
„Datenmaske“ anzugeben:
Call Spaltenüberschriften_ausblenden_wenn_leer(Datenmaske)

Nein, ich habe das Argument (Datenmaske) auch eingegeben. Trotzdem erscheint der Fehler, es wird aber lediglich der text bis vor dem (Datenmaske) markiert…

In der 1. UF habe ich das X oben rechts deaktiviert und unten
rechts ein neues eingefügt. Passwort: imark

Verstehe ich nicht, schreib doch die Zeilen für das neue „X“
in das Query_Close Ereignis der UF.

Ansonsten, willst du Code haben wo die UF gleich ohne
Schließkreuz erscheint? Ist doch besser als da ein
Schöließkreuz zu haben was deaktiviert ist.

Oh ja gerne. Gerne hätte ich den Code zum ausblenden des Schliesskreuzes. Das wäre ja supertoll

Bei Auswahl von MSW1 kommt beim Start von Datenmaske ein
Fehler Typen passen nicht o.ä.
Das liegt an dieser Schleife im Modul1, Prozedur „Fuellen“:

For Spa = 2 To 42 'Vorgesehen bis
Spalte 42
UF.Controls(„TB“ & Spa).Value = Format(.Cells(Nr + 2,
Spa).Value, „###0.0“)
Next Spa
Denn in Zelle AP29 steht „#Wert!“

Das habe ich korrigiert. Nur kommt nun komischerweise je ein Laufzeitfehler 380 beim versuch die Auswahl der MSW7 MSW8 MSW9 und MSW11 zu öffnen… :frowning: hmmm…

hier das neueste (passwort jeweils „imark“): http://www.uploadagent.de/show-178160-1317231616.html

Was schon sehr überfällig ist ist eine geplante
Fehlerbehandlung im Code wo steht was der Code machen soll bei
einem Fehler.
Suche mal im Internet nach
+vba +on +error +goto +errorhandler
Dadurch findest du Codebeispiele wie man sowas machen kann.
Der Name Errorhandler ist kein Muss, kannst auch andere Namen
nehmen.

Ich werde mich da durchlesen. Vielleicht kommen noch Fragen auf…

Schreib mal
MsgBox Me.Controls.Count
ganz unten in
Userform_Initialize
von „Datenmaske“.

WOW, 949 Steuerelemente… wie kriege ich die ungenutzten raus? Wird denn jedesmal wenn ich ein Steuerelement erstelle und wieder lösche, der Eintrag nicht gelöscht?

Hallo Sascha

daran habe ich nicht gedacht. Aber das stimmt. Dies sollte ein
MUSS sein. Nur, wie mache ich das? Irgendwie mit Klassenmodul,
oder?

Nein, ein Klassenmodul brauchst Du dazu gar nicht. Der folgende Code könnte schon ausreichend sein, oder zumindest ein Ansatz. Du müsstest ihn allerdings für jedes Textbox_KeyPress-Ereignis schreiben.

Private Sub TB2\_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 Select Case KeyAscii
 Case 8, 9, 48 To 57 'Backspace, Tab, 0 bis 9
 Case Else
 KeyAscii = 0
 Beep
 End Select
End Sub

Vg
Carsten

Hallo Sascha.

WOW, 949 Steuerelemente… wie kriege ich die ungenutzten
raus? Wird denn jedesmal wenn ich ein Steuerelement erstelle
und wieder lösche, der Eintrag nicht gelöscht?

Das weiß ich leider auch nicht.

VG
Carsten

Hallo Carsten

Nein, ein Klassenmodul brauchst Du dazu gar nicht. Der
folgende Code könnte schon ausreichend sein, oder zumindest
ein Ansatz. Du müsstest ihn allerdings für jedes
Textbox_KeyPress-Ereignis schreiben.

Private Sub TB2_KeyPress(ByVal KeyAscii As
MSForms.ReturnInteger)
Select Case KeyAscii
Case 8, 9, 48 To 57 'Backspace, Tab, 0 bis 9
Case Else
KeyAscii = 0
Beep
End Select
End Sub

hmmm. nun bekomme ich einen fehler: „typen unverträglich“ weil ich da schon die zellenformatierung gesetzt habe.
es wird blau markiert:

UF.Controls("TB" & Spa).Value = Format(.Cells(Nr + 2, Spa).Value, "###0.0")

gruss sascha

Hallo Sascha.

hmmm. nun bekomme ich einen fehler: „typen unverträglich“ weil
ich da schon die zellenformatierung gesetzt habe.
es wird blau markiert:

UF.Controls(„TB“ & Spa).Value =
Format(.Cells(Nr + 2, Spa).Value, „###0.0“)

Bei mir tritt kein Fehler auf.

Tritt der Fehler bei Dir auf, wenn Du die Datenmaske öffnest, oder wenn Du in der Datenmaske die Datensätze scrollst?

VG
Carsten

Hallo Carsten

Bei mir tritt kein Fehler auf.

Tritt der Fehler bei Dir auf, wenn Du die Datenmaske öffnest,
oder wenn Du in der Datenmaske die Datensätze scrollst?

Der Fehler tritt auf, wenn ich in der Datenmaske einen Text hineinschreib und danach auf Speichern klick

Gruss Sascha

Hallo Sascha.

Der Fehler tritt auf, wenn ich in der Datenmaske einen Text
hineinschreib und danach auf Speichern klick

Jetzt hab ich den Fehler auch hinbekommen. So, wie es aussieht, liegt es daran, dass die Textboxen, die unsichtbar sind, ja auch keinen Text enthalten, und daß dann kein Wert an die Format-Funktion übergeben werden kann.

Weiterhin ist mir aufgefallen: Wenn man einen Datensatz speichert, dann steht die Zahl in der entsprechenden Zelle auf dem Tabellenblatt linksbündig. Das dürfte bedeuten, dass hier ein Text eingetragen wird und das die Format-Function nicht geeignet ist.

Bitte ersetze die entsprechende For-Next-Schleife in der Prozedur „SatzEinfuegen“ 'mal durch folgenden Code und probiere es dann erneut.

For n = 2 To 27
 If Datenmaske.Controls("TB" & n).Value "" Then
 Cells(Zei, n) = CSng(Datenmaske.Controls("TB" & n).Value)
 End If
Next n

Eins noch: Wenn Du in die Textboxen auch Dezimalzahlen eingeben willst, dann kannst Du den Select-Case-Block noch um die Zahl 44 ergänzen, also so: Case 8, 9, 44, 48 To 57. Dann kannst Du auch ein Komma reinschreiben.

VG
Carsten

Hallo Sascha,

„Fehler beim kompilieren: Falsche Anzahl an Argumenten oder
ungültige Zuweisung zu einer Eigenschaft“
Und die Zeile: Call Spaltenüberschriften_ausblenden_wenn_leer
wird blau markiert.

das deutet darauf hin daß du vergessen hast das Argument
„Datenmaske“ anzugeben:
Call Spaltenüberschriften_ausblenden_wenn_leer(Datenmaske)

Nein, ich habe das Argument (Datenmaske) auch eingegeben.
Trotzdem erscheint der Fehler, es wird aber lediglich der text
bis vor dem (Datenmaske) markiert…

Ansonsten, willst du Code haben wo die UF gleich ohne
Schließkreuz erscheint? Ist doch besser als da ein
Schöließkreuz zu haben was deaktiviert ist.

Oh ja gerne. Gerne hätte ich den Code zum ausblenden des
Schliesskreuzes. Das wäre ja supertoll

Code steht nachstehend.

Nur kommt nun komischerweise je ein
Laufzeitfehler 380 beim versuch die Auswahl der MSW7 MSW8 MSW9
und MSW11 zu öffnen… :frowning: hmmm…

Na und :smile: Klick auf Debuggen, dann siehst du
Datenmaske.Show
gelb markiert, nun F8, schauen zu welcher Prozedur gesprungen wird, dort dann in kleinen Scxhritten mit F8 weiter.
Oder aber weil effektiver, schauen wo man da einen Haltepunkt einbaut, dann mit F5 dorthin.

Kommt kein Fehler, so weitersuchen…
Irgendwann komst du dann zur Fehlerstelle:

Das liegt an der Codezeile
Datenmaske.Links_Rechts.Value = i
in Modul2, SatzEinfuegen()
i ist größer als Datenmaske.Links_Rechts.Max

hier das neueste (passwort jeweils „imark“):
http://www.uploadagent.de/show-178160-1317231616.html

MsgBox Me.Controls.Count

WOW, 949 Steuerelemente… wie kriege ich die ungenutzten
raus? Wird denn jedesmal wenn ich ein Steuerelement erstelle
und wieder lösche, der Eintrag nicht gelöscht?

K.A. Scheinbar sind sie nicht gelöscht. Das hatte ich so noch nicht.
Kommt auf die ToDo-Liste *gg*

Gruß
Reinhard

Code in das Modul der jeweiligen UF:

Option Explicit

Private Const GWL\_STYLE = (-16)
Private Const WS\_SYSMENU = &H80000

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "User32" (ByVal hWnd As Long) As Long

Private Sub UserForm\_Activate()
' Code ist von Nepumuk 
Dim xl\_hwnd, lStyle
 xl\_hwnd = FindWindow(vbNullString, Me.Caption)
 If xl\_hwnd 0 Then
 lStyle = GetWindowLong(xl\_hwnd, GWL\_STYLE)
 lStyle = SetWindowLong(xl\_hwnd, GWL\_STYLE, lStyle And Not WS\_SYSMENU)
 DrawMenuBar xl\_hwnd
 End If
End Sub