Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Abfrageproblem

Betrifft: Abfrageproblem von: Langmantl
Geschrieben am: 04.11.2014 13:32:15

Hallo,
meine erste Frage, ich habe eine Userform und dort sollen Uhrzeiten angegeben werden. Die Routine, mit der ich die Eingaben überprüfe habe ich schon eingebaut, bisher aber in der Routine Commandbutton after Klick. Da ich 7 Zeiten eingeben und überprüfen möchte, wäre es besser, wenn ich die Routine bereits unmittelbar nach eingabe in die Checkbox vornehmen kann. Da ich mich fast gar nicht mit VBA auskenne, wer kann mir sagen wie ich das ändern muss?
Funktioniert mit der Commandbuttonversion bisher ganz gut.

2. Frage
Wie man aus dem Code sieht, wir bei Fehler in den err_handler gesprungen. gibts eine Möglichkeit, dass der Fehler umgangen wird. Also: Wenn kein Eintrag in der Textbox kommt bisher eine MSG Box mit der Info : Wert nicht bekannt : Möchte dass aber so verändern, dass bei keinem Eintrag in der Textbox keine Fehlermeldung ausgegeben wird, damit ich später bei Leer einen Eintrag für die Tabelle definieren kann, muss aber auch für jeden Wochentag extra sein (siehe beigelegte Tabelle)
https://www.herber.de/bbs/user/93534.xlsm

  

Betrifft: AW: Abfrageproblem von: Rudi Maintaire
Geschrieben am: 04.11.2014 13:59:24

Hallo,
1. was soll das denn?
Sheets(1).Range("a16") = Clear
etc????
wenn schon, dann
Sheets(1).Range("a16").Clear

2. und das:
lngDay = Weekday(Sheets(1).Range("A5"), vb1) Or .....
schau dir mal die Syntax der WeekDay-Funktion an.

3.
Dim ch1 As String
Dim ch2 As String
Dim ch3 As String
Dim ch4 As String
Dim ch5 As String
Dim ch6 As String
Dim ch7 As String

und folgende würde ich als Datenfelder definieren
Dim ch(1 to 7) as String
Dann kannst du die per Schleife abklappern und deinen Code um min. 70% eindampfen.

Gruß
Rudi


  

Betrifft: AW: Abfrageproblem von: Langmantl
Geschrieben am: 04.11.2014 14:23:16

Hallo Rudi, danke für deinen Hinweis, wie ich die Variablen besser definieren kann.
habe ich sofort umgesetzt, bekomme aber eine Fehlermeldung: Kann Teil einer verbundenen Zelle nicht ändern. Wo ist da der Fehler?
Was du mit lngDay = Weekday(Sheets(1).Range("A5"), vb1) Or .....
meinst, weiß ich nicht, habe den Code auch nur übernommen.
Mit den Variablen, dass hat super geklappt, wird dann etwas übersichtlicher
Hier die veränderte Version: https://www.herber.de/bbs/user/93536.xlsm


Hilft mir aber auch nicht bei meiner Grundfrage:


  

Betrifft: AW: Abfrageproblem von: Rudi Maintaire
Geschrieben am: 04.11.2014 14:34:54

Hallo,
du musst auch z.B.
ch1 = Me.CheckBox1
ch2 = Me.CheckBox2
ch3 = Me.CheckBox3
ch4 = Me.CheckBox4
ch5 = Me.CheckBox5
ch6 = Me.CheckBox6
ch7 = Me.CheckBox7

in
ch(1) = Me.CheckBox1
ch(2) = Me.CheckBox2
etc.
ändern.

Gruß
Rudi


  

Betrifft: AW: Abfrageproblem von: Langmantl
Geschrieben am: 04.11.2014 14:43:12

Hallo Rudi, danke ich habe es sofort geändert, gibts hierfür auch eine kurzfassung? also ch(1 to 7) = Me.CheckBox(1 to 7)?
ok, hier die Neufassung. Da wo er mir den Fehler anzeigt, bei den Clear befehl habe ich als Kommentar markiert
https://www.herber.de/bbs/user/93537.xlsm


  

Betrifft: AW: Abfrageproblem von: Rudi Maintaire
Geschrieben am: 04.11.2014 15:04:25

Hallo,
bei den Checkboxen kann man mit einer Schleife arbeiten, da die durchgehen benannt sind.
Bei den Textboxen geht das momentan nicht. Di müsstest du in z.B. txtV1 bis txtV7; txtB1 bis txtB7; txtW1 bis txtW7 umbenennen.

Mal ein grob überarbeiteter Code:

Private Sub CommandButton1_Click()
  'Variablen Definieren'
  Dim ch(1 To 7) As String
  Dim v(1 To 7) As String
  Dim b(1 To 7) As String
  Dim w(1 To 7) As String
  Dim datTest(1 To 7) As Date
  Dim lngDay(1 To 7) As Long
  Dim lngDayS(1 To 7) As String
  'Variablen den Check und Textboxen zuordnen'
  For i = 1 To 7
    ch(i) = Me.Controls("CheckBox" & i)
  Next i
  v(1) = Me.TextBox2.Text
  v(2) = Me.TextBox6.Text
  v(3) = Me.TextBox10.Text
  v(4) = Me.TextBox15.Text
  v(5) = Me.TextBox19.Text
  v(6) = Me.TextBox23.Text
  v(7) = Me.TextBox27.Text
  b(1) = Me.TextBox3.Text
  b(2) = Me.TextBox7.Text
  b(3) = Me.TextBox11.Text
  b(4) = Me.TextBox14.Text
  b(5) = Me.TextBox20.Text
  b(6) = Me.TextBox24.Text
  b(7) = Me.TextBox28.Text
  w(1) = Me.TextBox4.Text
  w(2) = Me.TextBox8.Text
  w(3) = Me.TextBox12.Text
  w(4) = Me.TextBox13.Text
  w(5) = Me.TextBox17.Text
  w(6) = Me.TextBox21.Text
  w(7) = Me.TextBox25.Text
  'Alte Einträge der Tabelle löschen"
  Sheets(1).Range("a16:g16") = ""
  Sheets(1).Range("a18:g18") = ""
  Sheets(1).Range("a23:g23") = ""
  'Prüfung ob Zeit erlaubt erste Spalte'
  For i = 1 To 7
    On Error GoTo err_handler
    If v(i) <> "" Then
      datTest(i) = CDate(v(i))
      lngDay(i) = Weekday(Sheets(1).Cells(5, i), vb1)
      lngDayS(i) = Sheets(1).Cells(8, i).Text
      If lngDayS(i) <> "Schließtag" And lngDayS(i) <> "Feiertag" And lngDayS(i) <> "Urlaub"  _
Then
        If lngDay(i) < 5 Then
          If datTest(i) < "15:00" Then
            MsgBox "Eingabe am " & Format(Sheets(1).Cells(5, i), "ddd dd.mm") & " erst ab 15:00  _
Uhr möglich, da Arbeit", , "Hinweis..."
            Exit Sub
          End If
        ElseIf lngDay1 = 5 Then
          If datTest1 < "13:00" Then
            MsgBox "Eingabe am " & Format(Sheets(1).Cells(5, i), "ddd dd.mm") & " erst ab 13:00  _
Uhr möglich, da Arbeit", , "Hinweis..."
            Exit Sub
          End If
        End If
      End If
    End If
  Next i
  
  For i = 1 To 7
    'Zeiten eintragen'
    Sheets(1).Cells(18, i).Value = v(i) & " bis " & b(i)
    'Wohin eintragen'
    Sheets(1).Cells(23, i).Value = w(i)
  Next i
  Exit Sub
err_handler:
  MsgBox "kein gültiger Wert"
End Sub
Da ist noch Potenzial.

Gruß
Rudi


  

Betrifft: AW: Abfrageproblem von: Langmantl
Geschrieben am: 05.11.2014 07:38:46

Hallo Rudi, danke für den Code, aber hat offensichtlich Fehler, wenn ich Ihn ausführe zeigt er mir folgende Zeiten Rot an:
MsgBox "Eingabe am " & Format(Sheets(1).Cells(5, i), "ddd dd.mm") & " erst ab 15:00 _
Uhr möglich, da Arbeit", , "Hinweis..."

MsgBox "Eingabe am " & Format(Sheets(1).Cells(5, i), "ddd dd.mm") & " erst ab 13:00 _
Uhr möglich, da Arbeit", , "Hinweis..."


Dann gibts noch das Problem, wenn ich die Einträge von Montag bis Freitag, also die wo er prüft, leer lassen will, zeigt er durch den err_handler Fehler an. Wie muss es umgesetzt werden, damit auch ohne Eingabe kein Fehler ausgegeben wird? Nur wenn Zeit eingegeben wird, nur dann soll geprüft werden, wenn leer, dann ist auch leer.
Wo muss ich den Code plazieren, wenn ich die Prüfung bereits nach Eingabe ins Textfeld haben möchte und nicht erst bei Klicken auf Commandbutton?

https://www.herber.de/bbs/user/93551.xlsm


  

Betrifft: Rudi hat nur nicht beachtet, dass die Zeilen-... von: Luc:-?
Geschrieben am: 05.11.2014 13:02:03

…Automatik der ForumsSoftware keine Rücksicht auf in VBA verbotene nur-_-Trennungen innerhalb von Texten nimmt, Langmantl;
diese beiden Trennstellen müssen aufgehoben oder durch " _ in der 1. und & " in der 2.Zeile ersetzt wdn.
Gruß, Luc :-?


  

Betrifft: AW: Rudi hat nur nicht beachtet, dass die Zeilen-... von: Langmantl
Geschrieben am: 05.11.2014 13:08:22

Kapiere nicht was du meinst, kannst du es etwas konkreter benennen?
Automatik der ForumsSoftware keine Rücksicht auf in VBA verbotene nur-_-Trennungen innerhalb von Texten nimmt, Langmantl;
diese beiden Trennstellen müssen aufgehoben oder durch " _ in der 1. und & " in der 2.Zeile ersetzt wdn.
Gruß, Luc :-?



  

Betrifft: Na, genau die vom VBE beanstandeten und ... von: Luc:-?
Geschrieben am: 05.11.2014 14:24:31

…von dir geposteten beiden CodeAbschnitte!
Die ForumsSoftware hat die ursprünglich 1zeiligen Anweisungen automatisch umge-und dabei verbotenerweise TextSequenzen einfach unterbrochen, ohne die dafür erforderlichen Zeichen zu setzen. Also _ entfernen und jeweils 1 Zeile draus machen oder wie von mir beschrieben vorgehen!
Bsp: "abc def" → (¶ = Zeilenumbruch)
falsch:  "abc _¶def"
richtig: "abc " _¶& "def"
Luc :-?

Besser informiert mit …


  

Betrifft: AW: Na, genau die vom VBE beanstandeten und ... von: Langmantl
Geschrieben am: 05.11.2014 14:40:15

ok, Danke, das wäre dann schon mal gelöst, bleiben noch die anderen beiden Fragen,
nämlich:

1.Wie kann ich bei dieser Routine so eingeben, dass auch leereingaben (also kein Eintrag akzeptiert wird, ohne dass ein Fehler ausgegeben wird.

2. Bisher findet die Prüfung im Formular nach Eingabe des Controlbuttons statt, ich will es aber so haben, dass die Prüfung und Ausgabe der Meldung unmittelbar nach Eingabe der Uhrzeit in das Textfeld passiert, wie muss ich den Code umstellen?

Hier Code des Checkbuttons

Private Sub CommandButton1_Click()
  'Variablen Definieren'
  Dim ch(1 To 7) As String
  Dim v(1 To 7) As String
  Dim b(1 To 7) As String
  Dim w(1 To 7) As String
  Dim datTest(1 To 7) As Date
  Dim lngDay(1 To 7) As Long
  Dim lngDayS(1 To 7) As String
  'Variablen den Check und Textboxen zuordnen'
  For i = 1 To 7
    ch(i) = Me.Controls("CheckBox" & i)
  Next i
  v(1) = Me.TextBox2.Text
  v(2) = Me.TextBox6.Text
  v(3) = Me.TextBox10.Text
  v(4) = Me.TextBox15.Text
  v(5) = Me.TextBox19.Text
  v(6) = Me.TextBox23.Text
  v(7) = Me.TextBox27.Text
  b(1) = Me.TextBox3.Text
  b(2) = Me.TextBox7.Text
  b(3) = Me.TextBox11.Text
  b(4) = Me.TextBox14.Text
  b(5) = Me.TextBox20.Text
  b(6) = Me.TextBox24.Text
  b(7) = Me.TextBox28.Text
  w(1) = Me.TextBox4.Text
  w(2) = Me.TextBox8.Text
  w(3) = Me.TextBox12.Text
  w(4) = Me.TextBox13.Text
  w(5) = Me.TextBox17.Text
  w(6) = Me.TextBox21.Text
  w(7) = Me.TextBox25.Text
  'Alte Einträge der Tabelle löschen"
  Sheets(1).Range("a16:g16") = ""
  Sheets(1).Range("a18:g18") = ""
  Sheets(1).Range("a23:g23") = ""
  'Prüfung ob Zeit erlaubt erste Spalte'
  For i = 1 To 7
    'On Error GoTo err_handler'
    If v(i) <> "" Then
      datTest(i) = CDate(v(i))
      lngDay(i) = Weekday(Sheets(1).Cells(5, i), vb1)
      lngDayS(i) = Sheets(1).Cells(8, i).Text
      If lngDayS(i) <> "Schließtag" And lngDayS(i) <> "Feiertag" And lngDayS(i) <> "Urlaub" _
Then
        If lngDay(i) < 5 Then
          If datTest(i) < "15:00" Then
            MsgBox "Eingabe am " & Format(Sheets(1).Cells(5, i), "ddd dd.mm") & " erst ab 15:00  _
Uhr möglich, da Arbeit", , "Hinweis..."
            Exit Sub
          End If
        ElseIf lngDay1 = 5 Then
          If datTest1 < "13:00" Then
            MsgBox "Eingabe am " & Format(Sheets(1).Cells(5, i), "ddd dd.mm") & " erst ab 13:00  _
Uhr möglich, da Arbeit", , "Hinweis..."
            Exit Sub
          End If
        End If
      End If
    End If
  Next i
  
  For i = 1 To 7
    If ch(i) = True Then
    Sheets(1).Cells(16, i).Value = "Ja"
    End If
    'Zeiten eintragen'
    If v(i) = "" Then
    Sheets(1).Cells(18, i).Value = "Heute kein Ausgang"
    Else:
    'Zeit von bis eintragen'
    Sheets(1).Cells(18, i).Value = v(i) & " bis " & b(i)
    'Wohin eintragen'
     Sheets(1).Cells(23, i).Value = w(i)
     End If
  Next i
  Exit Sub
'err_handler:'
  'MsgBox "kein gültiger Wert"'
End Sub
Hier Code Userform_activate
Private Sub UserForm_Activate()
'Datum auslesen und als Wochentage ins Formular schreiben'
Me.TextBox1 = Sheets(1).Range("A5").Value
TextBox1.Value = Format(TextBox1.Value, "ddd dd.mm")
Me.TextBox5 = Sheets(1).Range("B5").Value
TextBox5 = Format(TextBox5.Value, "ddd dd.mm")
Me.TextBox9 = Sheets(1).Range("C5").Value
TextBox9 = Format(TextBox9.Value, "ddd dd.mm")
Me.TextBox16 = Sheets(1).Range("D5").Value
TextBox16 = Format(TextBox16.Value, "ddd dd.mm")
Me.TextBox18 = Sheets(1).Range("E5").Value
TextBox18 = Format(TextBox18.Value, "ddd dd.mm")
Me.TextBox22 = Sheets(1).Range("F5").Value
TextBox22 = Format(TextBox22.Value, "ddd dd.mm")
Me.TextBox26 = Sheets(1).Range("g5").Value
TextBox26 = Format(TextBox26.Value, "ddd dd.mm")
'Wochentagseintrag prüfen und bei Frei, Urlaub, Schließtag die Checkbutton und das  _
Beschriftungslabel ausblenden'
If Sheets(1).Range("A8").Value = "Frei" Or Sheets(1).Range("A8").Value = "Feiertag" Or Sheets(1) _
.Range("A8").Value = "Schließtag" Then
CheckBox1.Visible = False
Label2.Visible = False
Else
CheckBox1.Visible = True
Label2.Visible = True
End If
If Sheets(1).Range("B8").Value = "Frei" Or Sheets(1).Range("B8").Value = "Feiertag" Or Sheets(1) _
.Range("B8").Value = "Schließtag" Then
CheckBox2.Visible = False
Label7.Visible = False
Else
CheckBox2.Visible = True
Label7.Visible = True
End If
If Sheets(1).Range("c8").Value = "Frei" Or Sheets(1).Range("c8").Value = "Feiertag" Or Sheets(1) _
.Range("c8").Value = "Schließtag" Then
CheckBox3.Visible = False
Label9.Visible = False
Else
CheckBox3.Visible = True
Label9.Visible = True
End If
If Sheets(1).Range("d8").Value = "Frei" Or Sheets(1).Range("d8").Value = "Feiertag" Or Sheets(1) _
.Range("d8").Value = "Schließtag" Then
CheckBox4.Visible = False
Label19.Visible = False
Else
CheckBox4.Visible = True
Label19.Visible = True
End If
If Sheets(1).Range("e8").Value = "Frei" Or Sheets(1).Range("e8").Value = "Feiertag" Or Sheets(1) _
.Range("e8").Value = "Schließtag" Then
CheckBox5.Visible = False
Label23.Visible = False
Else
CheckBox5.Visible = True
Label23.Visible = True
End If
If Sheets(1).Range("f8").Value = "Frei" Or Sheets(1).Range("f8").Value = "Feiertag" Or Sheets(1) _
.Range("f8").Value = "Schließtag" Then
CheckBox6.Visible = False
Label36.Visible = False
Else
CheckBox6.Visible = True
Label36.Visible = True
End If
If Sheets(1).Range("g8").Value = "Frei" Or Sheets(1).Range("g8").Value = "Feiertag" Or Sheets(1) _
.Range("g8").Value = "Schließtag" Then
CheckBox7.Visible = False
Label37.Visible = False
Else
CheckBox7.Visible = True
Label37.Visible = True
End If
Me.TextBox2.SetFocus
End Sub



  

Betrifft: Warum verwendest du dann kein TextBox-... von: Luc:-?
Geschrieben am: 07.11.2014 03:42:14

…Ereignis dafür, Langmantl,
die haben auch mehrere. Wähle im VBE links oben die entsprd TextBox aus und rechts oben dann das passende Ereignis dazu. IdR dürfte das nicht das Standard-Ereignis …_Change sein, das wird mit Eingabe jedes einzelnen Zeichens ausgelöst, sondern …_Exit.
Morrn, Luc :-?


  

Betrifft: AW: Warum verwendest du dann kein TextBox-... von: Langmantl
Geschrieben am: 07.11.2014 08:30:24

Danke für den Hinweiß


  

Betrifft: Bitte sehr! owT von: Luc:-?
Geschrieben am: 07.11.2014 12:37:35

:-?


  

Betrifft: AW: Bitte sehr! owT von: Langmantl
Geschrieben am: 07.11.2014 12:40:21

ok, danke