Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1804to1808
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

Function Aufruf

Function Aufruf
22.01.2021 19:55:41
Peer
Hallo VBA-Gemeinde.
Ich versuche im Initialize-Event einer UF von zwei Zeitwerten die Nachtzeit zu ermitteln.
Dabei habe ich als Anfänger im Netz folgende Funktion gesehen und wollte sie für meine Zwecke _ benutzen.

Option Explicit
Function NachtZeit(Beginn As Date, ende As Date) As Date
Dim NsStart As Date, NsEnde As Date
Dim Ns As Boolean, ZweiTage As Boolean
Dim Rc As Variant
NsStart = CDate("20:00")   'Beginn der Nachtschicht
NsEnde = CDate("06:00")     'Ende der Nachtschicht
If ende = NsStart Or Beginn = NsStart Then Ns = True
If Ns Then
If ZweiTage Then  'Beginn vor Mitternacht
If Beginn >= NsStart Then  'Beginn in der Nachtschicht
Rc = 1 - Beginn
Else  'Beginn vor der Nachtschicht
Rc = 1 - NsStart
End If
Rc = Rc + WorksheetFunction.Min(ende, NsEnde)
Else  'Nur an 1 Tag
If Beginn 

Hier sollen die Zeiten über Mitternacht berücksichtigt werden.
Nun habe ich mir vorgestellt, dass ich für "Beginn" meine TextBox txt_ArbZ_Beginn nehme und für "ende" txt_ArbZ_Ende.
Im Userform_Initialize Event habe ich einfach

'Arbeitstag
txt_ArbZ_Beginn.Value = Format(Cells(zeile, 20), "hh:mm") 'Beginn
txt_ArbZ_Ende.Value = Format(Cells(zeile, 21), "hh:mm")  'Ende
txt_NachtZ.Value = NachtZeit (txt_ArbZ_Beginn, txt_ArbZ_Ende)
einfügen wollen, aber der Debugger meldet Typfehler 13.
Also habe ich etwas anderes probiert,

txt_NachtZ = NachtZeit(Format(Cells(zeile, 20), "hh:mm"), Format(Cells(zeile, 21), "hh:mm"))
aber auch hier Typfehler 13.
Habe ich den Sinn von Function nicht verstanden? Wie kann ich es besser machen?
Danke im Voraus für eure Hilfe.
Gruß Peer

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Function Aufruf
22.01.2021 20:09:41
Sigi.21
Hallo Peer,
mit dem Ausdruck " NachtZeit(Format(Cells(zeile, 20), "hh:mm"), Format(Cells(zeile, 21), "hh:mm")) "
übergibst du der Funktion Text(!), denn Format() erzeugt Text. Die Funktion erwartet jeweils den Typ Date (Beginn As Date, ende As Date).
Probier' mal so:
txt_NachtZ = NachtZeit(CDate(Cells(zeile, 20)), CDate(Cells(zeile, 21)))
Sigi
AW: Function Aufruf
22.01.2021 20:18:12
onur

Function NachtZeit(ByVal Beginn As Date,ByVal ende As Date) As Date

AW: Function Aufruf
23.01.2021 10:36:56
Peer
Vielen Dank, Sigi.21 und onur.
Entschuldigt die späte Antwort, aber seit gestern versuche ich eure Lösung einzubauen, die auch für mich plausible ausschaut. Aber jetzt, warum auch immer, scheitert es bei mir an einer anderen Stelle im Code mit der Fehlermeldung Typenkonflikt 13 bei der Eingabe der Uhrzeit in txt_ArbZ_Ende, das vorher anstandslos funktioniert hat.
Ich suche schon 4 Stunden die Lösung...
Bei der Eingabe der Zeiten habe ich dank Hilfe hier im Forum die beiden TextBoxen mit

Private Sub txt_ArbZ_Beginn_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Eingabe der korrekten Uhrzeit bei der Eingabe über das Sub uhrzeit
uhrzeit txt_ArbZ_Beginn, KeyAscii
End Sub
und

Private Sub txt_ArbZ_Ende_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Eingabe der korrekten Uhrzeit bei der Eingabe über das Sub uhrzeit
uhrzeit txt_ArbZ_Ende, KeyAscii
End Sub
gesteuert, und bei Verlassen der TextBoxen oben genanntes Sub laufen gelassen

Private Sub txt_ArbZ_Beginn_Exit(ByVal Cancel As MSForms.ReturnBoolean)
AZ_berechnung
End Sub
Private Sub txt_ArbZ_Ende_Exit(ByVal Cancel As MSForms.ReturnBoolean)
AZ_berechnung
End Sub
Zusätzlich habe ich noch Change bei txtx_ArbZ_Ende abfragen lassen

Private Sub txt_ArbZ_Ende_Change()
If txt_ArbZ_Ende.Value "" Then
AZ_berechnung
Else
Exit Sub
End If
End Sub

Für die Berechnung der Arbeitszeit habe ich das Sub (bei gelber Markierung bleibt der Debugger _ mit Tyoenfehler 13 )

Sub AZ_berechnung()
Dim Beginn As Date, ende As Date, Summe As Date
On Error GoTo Fehler
If frm_Tag.txt_ArbZ_Beginn = "" Or frm_Tag.txt_ArbZ_Ende = "" Then Exit Sub
Beginn = CDate(frm_Tag.txt_ArbZ_Beginn)
ende = CDate(frm_Tag.txt_ArbZ_Ende)
Application.EnableEvents = False
If Beginn 
Hier noch das "Uhrzeit"-Sub, das bis jetzt anstandslos funktioniert hat.

Sub uhrzeit(ByRef theBox As MSForms.TextBox, ByVal KeyAscii As MSForms.ReturnInteger)
'Eingabebeschränkung Textbox_Uhrzeit mit autom. Doppelpunkt
'Format hh:mm
'by Josef Ehrensberger
'a little enhanced by Luschi
Dim ok As Boolean
Select Case Len(theBox)
Case 0
Select Case KeyAscii
Case 48 To 50
Case 51 To 57
'erste Ziffer 3 bis 9 --> 03: - 09:
theBox.Value = theBox.Value & "0" & Chr(KeyAscii) & ":"
KeyAscii = 0
Case Else
KeyAscii = 0
End Select
Case 1
ok = True
If Left(theBox, 1) = 2 Then
Select Case KeyAscii
Case 48 To 51
Case Else
ok = False
KeyAscii = 0
End Select
Else
Select Case KeyAscii
Case 48 To 57
Case Else
ok = False
KeyAscii = 0
End Select
End If
If ok Then
'2. Ziffer korrekt, dann ':' ranhängen
theBox.Value = theBox.Value & Chr(KeyAscii) & ":"
KeyAscii = 0
End If
Case 2
Select Case KeyAscii
Case 48 To 53, 58
Case Else
KeyAscii = 0
End Select
Case 3
If Right(theBox, 1) = ":" Then
Select Case KeyAscii
Case 48 To 53
Case Else
KeyAscii = 0
End Select
End If
Case 4
Select Case KeyAscii
Case 48 To 57
Case Else
KeyAscii = 0
End Select
Case Else
KeyAscii = 0
End Select
End Sub

Die Berechnung der NachtZeit

'Nachtzeiten
txt_NachtZ = Format(NachtZeit(CDate(Cells(zeile, 20)), CDate(Cells(zeile, 21))), "hh:mm")
ist davon unbeeindruckt. Selbst wenn ich sie auskommentiere, bleibt das Problem.
Ich würde gern die Datei hochladen, aber sie ist zu groß dafür (> 700kb) und nur einen Teil davon zu nehmen, würde alles aus dem Zusammenhang reißen und vieles nicht mehr funktionieren.
Ich habe noch keine Lösung gefunden, wie man "Layout" und "Daten" bei Excel-Dateien trennen kann, ähnlich wie bei Access (Frontend und Backend). Deshalb kann ich nur hoffen, durch viel Text und Codeschnipsel zu erklären, was ich habe oder nicht.
Vielleicht findet sich trotz der vielen Informationen und Texte jemand, der den Fehler (außer mich ;-)) erkennen kann.
Eine Möglichkeit wäre noch, eine txt-Datei (oder rtf) mit dem gesamten Code und eine xslm-Datei ohne Code hochzuladen, um alles zu trennen, fällt mir gerade noch ein.
Mit besten Gruß
Peer
Anzeige
AW: Function Aufruf
23.01.2021 10:48:48
Matthias
Moin!
Wenn der Debugger anspringt (ggf. das on error vorher auskommentierten), dann geh mal mit der Maus auf frm_Tag.txt_ArbZ_Ende und schaue, was er dir da für einen Wert anzeigt. Optional im Direktfenster ausgeben lassen. Evtl. steht dort keine Zahl sondern ein Text.
VG
AW: Function Aufruf
23.01.2021 11:22:29
Peer
Hallo Matthias.
Danke, auf die Idee bin ich noch gar nicht gekommen.
Ich habe deinen Vorschlag befolgt und folgendes angezeigt bekommen.
Userbild
Bis jetzt hat es ja funktioniert, auch ohne das Hinzufügen der NachtZeit Funktion?
Jetzt muss ich den Fehler im gesamten Code suchen. Es kann doch eigentlich nur bei der Eingabe und beim Aktualisieren der TextBoxen liegen?
Gruß Peer
Anzeige
AW: Function Aufruf
23.01.2021 11:54:15
Matthias
Moin!
Da hast du ja deinen Übertäter. Die "06:" können nicht in ein Datum gewandelt werden. Ich vermute mal, dass dein change Event in der Textbox durch das Makro Uhrzeit anspringt (dort werden ja die Daten eingetragen). Ist aber nur eine Vermutung - lässt sich schlecht nur am Code nachvollziehen.
Erweitere in der Arbeitszeitberechnung deine IF Abfrage mit dem Exit sub einfach so.
If frm_Tag.txt_ArbZ_Beginn = "" Or frm_Tag.txt_ArbZ_Ende = "" Or Not IsDate(frm_Tag.txt_ArbZ_Ende) Then Exit Sub

Damit wird zu den leeren Boxen auch abgefragt, ob die TB Ende kein Datum hat. Ggf. noch für Beginn ebenso einbauen. Das not vor Isdate dreht die Auswertung um. D.h. kein Datum ergibt bei isdate falsch und mit dem not wird es zu einem wahr. Damit bricht die sub ab.
VG
Anzeige
AW: Function Aufruf
23.01.2021 14:40:11
Peer
Das war es Matthias.
Vielen Dank. Du hast mir wieder einmal eine Menge Zeit gespart.
Hier nochmal der Code

Sub AZ_berechnung()
Dim Beginn As Date, ende As Date, Summe As Date
On Error GoTo Fehler
If frm_Tag.txt_ArbZ_Beginn = "" Or Not IsDate(frm_Tag.txt_ArbZ_Ende) Or frm_Tag.txt_ArbZ_Ende =  _
"" Or Not IsDate(frm_Tag.txt_ArbZ_Ende) Then Exit Sub
Beginn = CDate(frm_Tag.txt_ArbZ_Beginn)
ende = CDate(frm_Tag.txt_ArbZ_Ende)
Application.EnableEvents = False
If Beginn 

und im Userform_Initialize Event

'Nachtzeiten
txt_NachtZ = Format(NachtZeit(Cells(zeile, 20), Cells(zeile, 21)), "hh:mm")
Gruß
Peer
Anzeige
AW: Function Aufruf
23.01.2021 15:36:37
Matthias
Moin!
Kleiner Hinweis noch. Du hast jetzt bei der Prüfung zweimal Arbz_Ende drin. Auf Grund des Codeaufbaus gehe ich davon aus, dass das erste der Beginn sein sollte. Das müsstest du nochmal ändern.
VG
AW: Function Aufruf
23.01.2021 18:15:29
Peer
Stimmt Matthias.
Danke für den Hinweis.
Vor lauter Copy & Paste....
Schönes Wochenende
Peer
AW: Function Aufruf
23.01.2021 14:41:10
Peer
Nochmal vielen Dank, euch allen.
Ich konnte wieder einiges lernen.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige