Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Datumsdifferenz in Jahr,Monat,Tag

Begonnen von accessy, Juli 05, 2015, 18:51:28

⏪ vorheriges - nächstes ⏩

accessy

Ich habe das Thema im Bereich Formularfragen als erledigt deklariert, weil ich es ohne VBA doch nicht hinbekommen habe.

Ich habe ein wenig gesucht und eine Funktion gefunden in VBA.
Aber ich komme schon gar nicht mal dazu die Funktion zu testen,
weil beim Aufruf der Funktion schon der erste Fehler kommt.

Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
Me.Kunde.SetFocus
Call Besuchsdiff
End Sub
[b]Der Fehler heißt:  Argument ist nicht optional.[/b]
Außerdem habe ich den Call Aufruf ins MouseWeel Ereignis gelegt, weil ich kein Ereignis gefunden habe, so wie in Excel das "Selection_Change".
Beim Weiterschalten zum nächsten DS muss dieses Ereignis greifen.

[code]
Public Function Besuchsdiff(Beginn As Date, Ende As Date) As String
   Dim Y As Integer, m As Integer, jdiff As Integer, mdiff As Integer, tdiff As Integer
   Beginn = Date
   Y = Year(Beginn)
   m = Month(Beginn)
   jdiff = Year(Form_Besuchsberichte.Besucht_am)
   mdiff = Month(Form_Besuchsberichte.Besucht_am)
   tdiff = Day(Form_Besuchsberichte.Besucht_am) - Day(Beginn)
   
   If tdiff < 0 Then
      mdiff = mdiff - 1
      tdiff = tdiff + Day(DateSerial(Y, m + 1, 0))
   End If
     
   If mdiff < 0 Then
      jdiff = jdiff - 1
      mdiff = mdiff + 12
   End If

   Besuchsdiff = jdiff & " Jahr(e), " & mdiff & " Monate(e), " & tdiff & " Tag(e)"
   Form_Kunden.Diff_Besuch = Besuchsdiff
End Function

Das ungebunden Textfeld im Formular KUNDEN heißt "Diff_Besuch"
Es geht um die Differenz vom heutigen Datum zum Tag des letzten Besuch, das im Feld
Form_Besuchsberichte.Besucht_am steht.

Was ist denn falsch, oder mit dem nicht Optional gemeint?
Die Function steht im Modul1

Gruß Achim

MzKlMu

Hallo,
der Code muss in das Ereignis "Beim Anzeigen" des Formulars.
Das wird bei einem Datensatzwechsel ausgelöst.
Den Code selbst habe ich jetzt nicht getestet.
Gruß Klaus

accessy

Jetzt verstehe ich gar nichts mehr.
Ich kann doch nicht in das
Private Sub Form_Current() Ereignis
auch noch die
Public Function Besuchsdiff
einsetzen.
Das geht gar nicht....

MzKlMu

Hallo,
das habe ich ja auch nicht gesagt, der Aufruf muss in das Feld in dem Du den String sehen willst. Und dabei müssen die beiden Datumswerte übergeben werden. Auch das Datum.
Gruß Klaus

MaggieMay

Hi,

was hast du dir dabei gedacht, das MouseWheel-Ereignis für den Aufruf der Funktion zu wählen? ???

Die Funktion erwartet nicht optionale Parameter, das erkennt man an der Prozedurdeklaration (Kopfzeile), und das war mit der Fehlermeldung gemeint.
Freundliche Grüße
MaggieMay

accessy

Das Ereignis "Beim Anzeigen" gibt es nur für das Formular.
Hier kann ich Ereignisprozedur wählen. Da drin stehen bereits ein paar Dinge.
Die Function zusätzlich da rein geht nicht.

Das Ereignis "Beim Anzeigen" gibt es für dieses Textfeld mit Namen "Diff_Besuch" nicht.

Ihr habt mir schon so viel geholfen, daher möchte ich hier an dieser Stelle nichts kaputt machen. Ich werde mein Vorhaben wieder verwerfen. Das geht weit über meine VBA Kenntnisse hinaus. Ich komme einfach nicht klar damit.
Ich habe ja die DatDiff mit der Anzeige in Tagen..... Das geht gut.....
Vielen Dank.....Liegt nicht an euch....vielleicht ist es heute zu heiß von den Temperaturen her... :-\

MaggieMay

Hallo,
ZitatDas Ereignis "Beim Anzeigen" gibt es nur für das Formular.
das ist zutreffend.
Zitatvielleicht ist es heute zu heiß von den Temperaturen her
Ganz sicher ist es das - aber du solltest das Thema nicht abhaken, es gibt sicher eine geeignete Lösung.
Bis jetzt ist aber noch nicht klar, was genau du eigentlich erreichen willst.
Freundliche Grüße
MaggieMay

accessy

Na gut. Dann versuchen wir es weiter.

Ich habe ein Textfeld, in dem steht das Datum meines letzten Kontakts zu diesem Kunden.
Als Differenz dazu nehme ich immer HEUTE.

Meine derzeitige Lösung  ist diese hier.

="Letzter Kontakt vor " & DatDiff("d";Besuchsberichte.Formular!Besucht_am;Jetzt()) & " Tagen"

Das steht in meinem Feld Diff_Besuch in Steuerelementeinhalt.
Dann wollte ich das ganze ausweiten auf Jahre, Monate, Tage.

Aber ich erhielt die Antwort, dass DatDiff nur ein Element rechnet; also entweder TAGE, oder MONATE, oder..oder... geht also nicht mit DatDiff.

Einen Umweg über 3 DatDiff-Felder habe ich nicht hinbekommen.

Also doch besser mit VBA lösen.
Dann fand ich diesen Code, den ich angepasst habe.
http://www.access-o-mania.de/forum/index.php?topic=20540.0

Aber ob der funktioniert weiß ich nicht, weil ich bis dahin noch gar nicht kam.
Der Code muss ja mit jedem Weiterschalten zum nächsten DS gelesen werden.

Ins Current Ereignis kann ich die Function aber nicht stecken.
Lege ich sie ins Modul und rufe sie über einen CALL Befehl auf, gibt es eine Fehlermeldung "Argument ist nicht optional".

Alles kompliziert.....Und da dachte ich, bevor ich mich hier wer weiß wie weit reinhänge...
Tja, in Excel geht das wesentlich einfacher....

Gruß Achim

MzKlMu

Hallo,
der Link auf den eigenen Beitrag nutzt ja nichts. Zeige bitte den Originalcode ohne Deine Anpassungen.

Du braucht hier gar kein Ereignis. Der Code wird als Funktion im Feld aufgerufen und dabei müssen 2 Parameter übergeben werden.
Zeige erst mal den Originalcode, Deine Anpassung hat den nämlich fehlerhaft gemacht.
Gruß Klaus

MaggieMay

Hi,

so sollte das klappen:
="Letzter Kontakt vor " & BesuchsDiff([Besucht_am];Datum())
Allerdings hast du die Funktion durch deine "Anpassungen" unbrauchbar gemacht.

Und was das betrifft:
Zitatweil ich kein Ereignis gefunden habe, so wie in Excel das "Selection_Change".
Beim Weiterschalten zum nächsten DS muss dieses Ereignis greifen.
so wäre das Ereignis "Beim Anzeigen" genau das richtige - wenn es nicht auch anders ginge.
Freundliche Grüße
MaggieMay

accessy

Der Original Code ist von Herber.
Ich glaube, aus dem damaligen Spotlight-Forum.
Der steht hier, etwas weiter unten drin.
http://www.ms-office-forum.net/forum/showthread.php?t=74154

Gruß Achim

MaggieMay

Dann solltest du auch diese Funktion übernehmen und sie wie bereits gezeigt einsetzen.
Zu Ändern ist da nämlich nichts mehr dran.

Du solltest ihr lediglich einen anderen Namen geben, wegen Verwechslungsgefahr, bspw. "myDateDiff".
Freundliche Grüße
MaggieMay

MzKlMu

Hallo,
kopiere die Funktion unverändert in ein Modul.
[code]Function BesuchDiff(Beginn As Date, Ende As Date) As String
'*                                 Hans W. Herber                                 *
'*                                 Im Schönblick 5                                *
'*                                 D-53567 Asbach                                 *
'*                              Tel.: +49 2683 949047                             *
'*                              Fax: +49 2683 949049                              *
'*                            EMail: herber@herber.de                             *
'*                              http://www.herber.de                              *
'Datumsdifferenz in der Form "12 Jahre, 3 Monate, 4 Tage"
    Dim y As Integer, m As Integer, jDiff As Integer, mDiff As Integer, tDiff As Integer
    y = Year(Beginn)
    m = Month(Beginn)
    jDiff = Year(Ende) - y
    mDiff = Month(Ende) - m
    tDiff = Day(Ende) - Day(Beginn)

    If tDiff < 0 Then
        mDiff = mDiff - 1
        tDiff = tDiff + Day(DateSerial(y, m + 1, 0))
    End If

    If mDiff < 0 Then
        jDiff = jDiff - 1
        mDiff = mDiff + 12
    End If

    BesuchDiff = jDiff & " Jahr(e), " & mDiff & " Monat(e), " & tDiff & " Tag(e)"
End Function

Den Funktionsnamen habe ich angepasst.
Und dann Aufruf wie es MaggieMay auch schon gepostet hat.
[code]="Letzter Kontakt vor " & BesuchsDiff([Besucht_am];Datum())
Ein Ereignis bzw. Aufruf mit Call ist nicht notwendig.

PS:
Wenn man Code findet mit Autorenvermerk, so muss der mit veröffentlicht werden. Rein rechtlich bist Du auch verpflichtet den Autorenhinweis in der eigene DB zu belassen. Ich wollte das nur mal erwähnt haben.
Gruß Klaus

accessy

Dass mit der Veröffentlichung "Geistigem Eigentums" habe ich schon paar Mal gelesen, oder in TV Beiträgen gesehen. (Facebook- Schulfotos von früher..etc...etc...)

Uiii, danke für den Hinweis mit dem Code und dem Zusammenhang des "Geistigen Eigentums". Werde in Zukunft darauf achten.
Vielleicht sollte ich den Beitrag mit dem Code löschen.
Möchte keinen Ärger haben.

Nochmals Danke für den Beitrag mit dem Code.
Ich werde die Function mal so übernehmen und probieren.
Ich melde mich dazu nochmal, ob das läuft.

Gruß Achim

accessy

Also,
ich habe den Code von Herber incl. seinem Autorenhinweis in das Modul1 gepackt. Und ich habe nichts verändert, außer oben in Function noch das fehlende "s" bei Besuchsdiff eingesetzt.

Dann habe ich im Steuerelementeinhalt das hier stehen.

="Letzter Kontakt vor " & BesuchsDiff([Besucht_am];Datum())


Aber ich erhalte im Feld Steuerelementeinhalt den Fehler #Name?

Ich habe mal einen Haltepunkt mitten in die Funktion gesetzt.
Aber die wird wohl aufgrund des Fehlers #Name? gar nicht erst aufgerufen.
Also der Haltepunkt wird gar nicht erreicht.

Dann habe ich mal vor Function noch das Public gesetzt.
Brachte aber auch nichts.

Ich habe nochmal die Feldnamen überprüft.
Das Feld mit dem Datum für den letzten Besuch heißt definitiv "Besucht_am".

Was ist jetzt noch falsch, bzw. wo muss ich noch was ändern?
Gruß Achim