doranb
Goto Top

Access 2002 - nur Arbeitstage zählen lassen

Guten Tag zusammen

Ich besitze momentan eine Access 2002 Datenbank und möchte sie gerne erweitern.
In einem Formular erfasse ich jeweils meine Pendenzen.
Wenn ich jetzt die Priorität auf hoch setzte, dann rechnet mir Access aus, bis wann die Pendenz fertig sein muss (siehe VBS Code).
Jetzt ist mein Problem folgendes:
Wenn der Tag der Fertigstellung auf einem Samstag/Sonntag gesetzt wird ist das schlecht.
Kann man irgendwie definieren, dass man nur die Arbeitstage (Mo. - Fr.) berücksichtigt, oder das Wochenende auslässt?


Sub Priorität_AfterUpdate()

Select Case Me.Priorität

Case "hoch"
Me.Termin.Value = Date + 5
Case "mittel"
Me.Termin.Value = Date + 15
Case "tief"
Me.Termin.Value = Date + 25
Case Else
Me.Termin.Value = ""
Me.Termin.SetFocus
End Select Me.Termin.Requery

End Sub
6c5dcd57c46871796c4c3631607eee0c

Vielen Dank im Voraus für eure Antworten.

LG
Doran

Content-Key: 233568

Url: https://administrator.de/contentid/233568

Printed on: April 19, 2024 at 13:04 o'clock

Member: colinardo
Solution colinardo Mar 25, 2014 updated at 08:41:14 (UTC)
Goto Top
Hallo Doran,
könntest du so machen:
Sub Priorität_AfterUpdate()
	dim d
	Select Case Me.Priorität
		Case "hoch"  
			d = Date + 5
		Case "mittel"  
			d = Date + 15
		Case "tief"  
			d = Date + 25
		Case Else
			d = ""  
	End Select
	If d <> "" Then  
		Select Case Weekday(d)
			Case 7
				d = d + 2
			Case 1
				d = d + 1
		End Select
	End If
        Me.Termin.SetFocus
	Me.Termin.Value = d
End Sub
Grüße Uwe
Mitglied: 115420
115420 Mar 25, 2014 at 08:20:47 (UTC)
Goto Top
Hallo!

und was ist mit den Feiertagen?


Grüße

Der Ratsuchende
Member: colinardo
colinardo Mar 25, 2014 updated at 08:24:39 (UTC)
Goto Top
Zitat von @115420:
und was ist mit den Feiertagen?
... müsstest du dir die Liste der Feiertage besorgen oder in deinen Kalender eintragen und dann eben über eine Abfrage des Datums mit dem Kalender abgleichen ...
Member: DoranB
DoranB Mar 25, 2014 at 08:39:22 (UTC)
Goto Top
Guten Morgen Uwe

Es hat funktioniert! Danke dir herzlich!!

LG
Doran


Zitat von @colinardo:

Hallo Doran,
könntest du so machen:
> Sub Priorität_AfterUpdate()
> 	dim d
> 	Select Case Me.Priorität
> 		Case "hoch"  
> 			d = Date + 5
> 		Case "mittel"  
> 			d = Date + 15
> 		Case "tief"  
> 			d = Date + 25
> 		Case Else
> 			d = ""  
> 	End Select
> 	If d <> "" Then  
> 		Select Case Weekday(d)
> 			Case 7
> 				d = d + 2
> 			Case 1
> 				d = d + 1
> 		End Select
> 	End If
>         Me.Termin.SetFocus
> 	Me.Termin.Value = d
> End Sub
> 
Grüße Uwe
Member: DoranB
DoranB Mar 25, 2014 at 08:40:53 (UTC)
Goto Top
hmm... im Outlook 2010 Kalender sind sie eingetragen, wenn du das meinst.
Member: DoranB
DoranB Mar 25, 2014 at 09:39:38 (UTC)
Goto Top
Aber meine Frage wäre jetzt, wie kann ich eine Abfrage erstellen? face-big-smile
Sorry, kenne mich echt nicht gut aus mit VBS.
Member: colinardo
colinardo Mar 25, 2014 updated at 09:48:58 (UTC)
Goto Top
Zitat von @DoranB:

Aber meine Frage wäre jetzt, wie kann ich eine Abfrage erstellen? face-big-smile
Sorry, kenne mich echt nicht gut aus mit VBS.
mache dir gerade ein Beispiel.... bin noch anderweitig beschäftigt, kann etwas dauern
Member: DoranB
DoranB Mar 25, 2014 at 09:53:45 (UTC)
Goto Top
Ja, kein Ding. Danke nochmals!
Member: colinardo
colinardo Mar 25, 2014 updated at 11:12:30 (UTC)
Goto Top
Zitat von @DoranB:

Aber meine Frage wäre jetzt, wie kann ich eine Abfrage erstellen? face-big-smile
Sorry, kenne mich echt nicht gut aus mit VBS.
So, eine Abfrage könntest du folgendermaßen machen (Funktion getestet mit Outlook 2010). Ich gehe jetzt davon aus das deine Feiertage mit der Kategorie Feiertag in Outlook versehen sind (Standard, wenn man Outlook die Feiertage eintragen lässt) und diese im Standardkalender eingetragen sind. Die Funktion sucht so lange das nächste Datum bis es nicht mehr auf ein Wochenende oder einen Feiertag fällt.
Sub Priorität_AfterUpdate()
	dim mydate
	Select Case Me.Priorität
		Case "hoch"  
			mydate = Date + 5
		Case "mittel"  
			mydate = Date + 15
		Case "tief"  
			mydate = Date + 25
		Case Else
			mydate = ""  
	End Select
	If mydate <> "" Then  
		mydate = getNextWorkday(mydate)
	End If
        Me.Termin.SetFocus
	Me.Termin.Value = mydate
End Sub

Function getNextWorkday(ByVal d As Date) As Date
    set objOL = CreateObject("Outlook.Application")  
    Set cal = objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
    Do
        isHoliday = False
        Select Case Weekday(d)
            Case 7
                d = d + 2
            Case 1
                d = d + 1
        End Select
        For Each itm In cal.Items
            If itm.start = d Then
                If itm.AllDayEvent And itm.Categories = "Feiertag" Then  
                    isHoliday = True
                    Exit For
                End If
            End If
        Next
        If isHoliday Then
            d = d + 1
        End If
    Loop Until isHoliday = False
    getNextWorkday = d
    set objOL = Nothing
    set cal = Nothing
End Function
Eventuell erhältst du eine Sicherheitswarnung von Outlook beim Zugriff, bei Outlook-Versionen >= 2007 lässt sich dies im Sicherheitscenter von Outlook abschalten. Bei älteren Versionen ist dies nicht so einfach ohne weitere Änderungen am System zu eliminieren.

Grüße Uwe
Member: DoranB
DoranB Mar 25, 2014 updated at 10:16:58 (UTC)
Goto Top
Ich danke dir 1000mal!!!
Aber noch eine Verständnisfrage Uwe.
Von wo aus weiss der Funktionsbereich, wo es das anwenden soll?
Und jetzt funktioniert das "Date + 5" etc. auch nicht mehr face-smile

Zitat von @colinardo:

> Zitat von @DoranB:
>
> Aber meine Frage wäre jetzt, wie kann ich eine Abfrage erstellen? face-big-smile
> Sorry, kenne mich echt nicht gut aus mit VBS.
So, eine Abfrage könntest du folgendermaßen machen. Ich gehe jetzt davon aus das deine Feiertage mit der Kategorie
Feiertag in Outlook versehen sind (Standard, wenn man Outlook die Feiertage eintragen lässt) und diese im
Standardkalender eingetragen sind. Die Funktion sucht so lange das nächste Datum bis es nicht mehr auf ein Wochenende oder
einen Feiertag fällt.
> Sub Priorität_AfterUpdate()
> 	dim d
> 	Select Case Me.Priorität
> 		Case "hoch"  
> 			d = Date + 5
> 		Case "mittel"  
> 			d = Date + 15
> 		Case "tief"  
> 			d = Date + 25
> 		Case Else
> 			d = ""  
> 	End Select
> 	If d <> "" Then  
> 		d = getNextWorkday(d)
> 	End If
>         Me.Termin.SetFocus
> 	Me.Termin.Value = d
> End Sub
> 
> Function getNextWorkday(ByVal d As Date) As Date
>     set objOL = CreateObject("Outlook.Application")  
>     Set cal = objOL.GetNamespace("MAPI").GetDefaultFolder(9)  
>     Do
>         isHoliday = False
>         Select Case Weekday(d)
>             Case 7
>                 d = d + 2
>             Case 1
>                 d = d + 1
>         End Select
>         For Each itm In cal.Items
>             If itm.start = d Then
>                 If itm.AllDayEvent And itm.Categories = "Feiertag" Then  
>                     isHoliday = True
>                     Exit For
>                 End If
>             End If
>         Next
>         If isHoliday Then
>             d = d + 1
>         End If
>     Loop Until isHoliday = False
>     getNextWorkday = d
>     set objOL = Nothing
>     set cal = Nothing
> End Function
> 
Eventuell erhältst du eine Sicherheitswarnung von Outlook beim Zugriff, bei Outlook-Versionen >= 2007 lässt sich dies
im Sicherheitscenter von Outlook abschalten. Bei älteren Versionen ist dies nicht so einfach ohne weitere Änderungen am
System zu eliminieren.

Grüße Uwe
Member: colinardo
colinardo Mar 25, 2014 updated at 10:19:24 (UTC)
Goto Top
Zitat von @DoranB:
Ich danke dir 1000mal!!!
Aber noch eine Verständnisfrage Uwe.
Von wo aus weiss der Funktionsbereich, wo es das anwenden soll?
Verstehe deine Frage nicht ? An die Funktion wird das Datum übergeben, die Funktion sucht den nächsten Tag der kein Wochenende oder Feiertag ist und gibt es zurück.
Member: DoranB
DoranB Mar 25, 2014 updated at 10:23:28 (UTC)
Goto Top
Achso ok, ne alles klar. face-smile
Jetzt funktioniert aber das Ganze nicht mehr. Er kann nicht mal mehr einen Termin setzten.
Member: colinardo
colinardo Mar 25, 2014 updated at 10:26:17 (UTC)
Goto Top
Zitat von @DoranB:

Achso ok, ne alles klar.
Jetzt funktioniert aber das Ganze nicht mehr. Er kann schon keinen Termin setzten.
Das ganze im VBA-Editor im Einzelschrittmodus durchlaufen lassen .... und Breakpoints setzen dann lässt sich der Fehler bei Dir aufspüren, hier geht's soweit einwandfrei.
Member: DoranB
DoranB Mar 25, 2014 updated at 10:29:10 (UTC)
Goto Top
Wenn ich das Ganze im Einzelschrittmodus (F8) durchlaufen lasse, geschieht nichts.
Wie setzt man den breakpoints ? Also meinste einen Teil auskommentieren?

Zitat von @colinardo:

> Zitat von @DoranB:
>
> Achso ok, ne alles klar.
> Jetzt funktioniert aber das Ganze nicht mehr. Er kann schon keinen Termin setzten.
Das ganze im VBA-Editor im Einzelschrittmodus durchlaufen lassen .... und Breakpoints setzen dann lässt sich der Fehler bei
Dir aufspüren, hier geht's soweit einwandfrei.
Member: colinardo
colinardo Mar 25, 2014 updated at 10:36:20 (UTC)
Goto Top
Zitat von @DoranB:

Wenn ich das Ganze im Einzelschrittmodus (F8) durchlaufen lasse, geschieht nichts.
Wie setzt man den breakpoints ? Also meinste einen Teil auskommentieren?
Och nö.... muss ich das ganze jetzt hier runterbeten ? Setze in der Funktion einen Breakpoint indem du links neben dem Code ganz am Rand in die graue Randleiste klickst (es erscheint ein roter Punkt), dann gehst du in dein Formular und machst ein Update deines Textfeldes so dass die Funktion aufgerufen wird, dann wird der Debugger an der Stelle an der du den Breakpoint gesetzt hast stoppen und du kannst mit F8 die Schritte durchlaufen. Die Variablen lassen sich dann auch mit Überwachungsausdrücken kontrollieren. Sorry das sind Debugging-Grundlagen die ich jetzt hier nicht alle aufzählen werde.

Grüße Uwe
Member: DoranB
DoranB Mar 25, 2014 updated at 11:04:13 (UTC)
Goto Top
Ganz ehrlich. Ich habe echt keine Ahnung und ich sage ja auch nicht das ich das und jenes kann.
Ist sicher mühsam für dich Uwe. Entweder bin ich unfähig, oder es passiert trotzdem nichts. Habe genau das gemacht wo du gesagt hast...

Hier noch als Bestätigung der Code:

Sub Pendenz_Priorität_AfterUpdate()
Dim d
Select Case Me.Pendenz_Priorität
Case "hoch"
d = Date + 5
Case "mittel"
d = Date + 15
Case "tief"
d = Date + 25
Case Else
d = ""
End Select
If d <> "" Then
d = getNextWorkday(d)
End If
Me.Termin.SetFocus
Me.Termin.Value = d
End Sub

Function getNextWorkday(ByVal d As Date) As Date
Set objOL = CreateObject("Outlook.Application")

Set cal = objOL.GetNamespace("MAPI").GetDefaultFolder(9)
Do
isHoliday = False
Select Case Weekday(d)
Case 7
d = d + 2
Case 1
d = d + 1
End Select
For Each itm In cal.Items
If itm.Start = d Then
If itm.AllDayEvent And itm.Categories = "Feiertag" Then
isHoliday = True
Exit For
End If
End If
Next
If isHoliday Then
d = d + 1
End If
Loop Until isHoliday = False
getNextWorkday = d
Set objOL = Nothing
Set cal = Nothing
End Function

edit: "Pendenz Priorität" heisst eig. das Feld (nicht Priorität). Aber habe das ja richtig verändert.
Tut mir echt leid, dass es so mühsam ist für dich..


Zitat von @colinardo:

> Zitat von @DoranB:
>
> Wenn ich das Ganze im Einzelschrittmodus (F8) durchlaufen lasse, geschieht nichts.
> Wie setzt man den breakpoints ? Also meinste einen Teil auskommentieren?
Och nö.... muss ich das ganze jetzt hier runterbeten ? Setze in der Funktion einen Breakpoint indem du links neben dem Code
ganz am Rand in die graue Randleiste klickst (es erscheint ein roter Punkt), dann gehst du in dein Formular und machst ein Update
deines Textfeldes so dass die Funktion aufgerufen wird, dann wird der Debugger an der Stelle an der du den Breakpoint gesetzt hast
stoppen und du kannst mit F8 die Schritte durchlaufen. Die Variablen lassen sich dann auch mit Überwachungsausdrücken
kontrollieren. Sorry das sind Debugging-Grundlagen die ich jetzt hier nicht alle aufzählen werde.

Grüße Uwe
Member: colinardo
colinardo Mar 25, 2014 updated at 11:04:54 (UTC)
Goto Top
erstens würde ich den Namen des Textfeldes Pendenz_Priorität ändern so dass kein Umlaut darin vorkommt, damit gibt es immer mal wieder Probleme im VBA-Code, und zweitens auch mal im Select Case die Value Eigenschaft verwenden:
Select Case Me.Pendenz_Prioritaet.Value
Ansonsten wäre die letzte Chance eine TeamViewer-Session.
Mitglied: 115420
115420 Mar 25, 2014 updated at 11:06:30 (UTC)
Goto Top
Hallo!

Hatte in Excel mal eine Feiertags-Tabelle erstellt, die die Feiertage (Rot) automatisch in Abhängigkeit der Jahreszahl und des betreffenden Bundeslandes festlegt.

Es muss nur die Zelle B34 mit der Jahreszahl eines Datums und die Zelle B35 mit dem Bundesland in irgendeiner Form initialisiert werden. Der Rest wird durch entsprechende Formeln berechnet.

In Zelle C3 wird der Ostersonntag eines Jahres mit folgender Formel berechnet:
=RUNDEN(DATUM($B$34;4;TAG(MINUTE($B$34/38)/2+55))/7;0)*7-6

In Zelle C26 wird der letzte Sonntag (4. Advent) vor dem 24.12. mit folgender Formel berechnet:
=DATUM($B$34;12;25)-WOCHENTAG(DATUM($B$34;12;25);2)

Im Bereich C4:C12 stehen die Tage (+/-) auf den Ostersonntag bezogen und im Bereich C24:C33 die Tage auf den 4.Advent bezogen

Die Formel für den Bereich D4:D12 (D4 Abwärtskopie) lautet:
=WENN(INDIREKT("$E" & ZEILE($E4) + VERGLEICH($B$35;$E$34:$T$34;0)-1;1)="x";$C$3+$C4;"")

Die Formel für den Bereich D27:D33 (D27 Abwärtskopie) lautet:
=WENN(INDIREKT("$E" & ZEILE($E27) + VERGLEICH($B$35;$E$34:$T$34;0)-1;1)="x";$C$26+$C27;"")

Enthält ein Bundesland bei einem der Feiertage kein 'x', dann bleibt die dazugehörigen Zelle im Bereich D4:D33 Leer.


Bin in Access nicht so der Hecht, aber evenmtuell könnt ihr ja damit etwas anfangen?face-wink

Die Tabelle für die VBA-Abfrage sieht so aus:
0aed6fc6cff180c41be25e176dadcf62


Grüße

Der Ratsuchende
Member: DoranB
DoranB Mar 25, 2014 at 12:16:12 (UTC)
Goto Top
Also im Moment funktioniert es nicht.
Ich würde es gerne mit dem TeamViewer lösen. Es wäre sicherlich auch einfacher für dich.

Zitat von @colinardo:

erstens würde ich den Namen des Textfeldes Pendenz_Priorität ändern so dass kein Umlaut darin vorkommt,
damit gibt es immer mal wieder Probleme im VBA-Code, und zweitens auch mal im Select Case die Value Eigenschaft
verwenden:
> Select Case Me.Pendenz_Prioritaet.Value
> 
Ansonsten wäre die letzte Chance eine TeamViewer-Session.
Member: DoranB
DoranB Mar 25, 2014 at 12:20:01 (UTC)
Goto Top
Vielen Dank für deine Antwort, jedoch denke ich, dass die Variante mit dem Outlook die sauberere Lösung ist.

Zitat von @115420:

Hallo!

Hatte in Excel mal eine Feiertags-Tabelle erstellt, die die Feiertage (Rot) automatisch in Abhängigkeit der Jahreszahl und
des betreffenden Bundeslandes festlegt.

Es muss nur die Zelle B34 mit der Jahreszahl eines Datums und die Zelle B35 mit dem Bundesland in irgendeiner Form initialisiert
werden. Der Rest wird durch entsprechende Formeln berechnet.

In Zelle C3 wird der Ostersonntag eines Jahres mit folgender Formel berechnet:
=RUNDEN(DATUM($B$34;4;TAG(MINUTE($B$34/38)/2+55))/7;0)*7-6

In Zelle C26 wird der letzte Sonntag (4. Advent) vor dem 24.12. mit folgender Formel berechnet:
=DATUM($B$34;12;25)-WOCHENTAG(DATUM($B$34;12;25);2)

Im Bereich C4:C12 stehen die Tage (+/-) auf den Ostersonntag bezogen und im Bereich C24:C33 die Tage auf den 4.Advent bezogen

Die Formel für den Bereich D4:D12 (D4 Abwärtskopie) lautet:
=WENN(INDIREKT("$E" & ZEILE($E4) + VERGLEICH($B$35;$E$34:$T$34;0)-1;1)="x";$C$3+$C4;"")

Die Formel für den Bereich D27:D33 (D27 Abwärtskopie) lautet:

Enthält ein Bundesland bei einem der Feiertage kein 'x', dann bleibt die dazugehörigen Zelle im Bereich D4:D33
Leer.


Bin in Access nicht so der Hecht, aber evenmtuell könnt ihr ja damit etwas anfangen?face-wink

Die Tabelle für die VBA-Abfrage sieht so aus:
0aed6fc6cff180c41be25e176dadcf62


Grüße

Der Ratsuchende