Avatar billede Brian Møller Juniormester
01. oktober 2018 - 13:45 Der er 10 kommentarer og
1 løsning

Omregn dato til forrige tirsdag (VBA)

Hej

I databasens formular har jeg brug for hjælp til kode, for at få dato fra et felt omregnet til forrige tirsdag i et andet felt. Det skal kunne indsættes i et felts efteropdatering.

Der er 2 regler:
1) Hvis feltet me.jubilæumsdato er udfyldt med en dato lig med ugedag tirsdag, skal der i feltet me.[Hvidovre avis] skrives dato for forrige tirsdag
2) Hvis feltet me.jubilæumsdato er udfyldt med en dato ulig med ugedag tirsdag, skal der i feltet me.[Hvidovre avis] skrives dato for sidste tirsdag

Håber det er forklaret godt nok
Avatar billede claes57 Ekspert
01. oktober 2018 - 15:23 #1
du skal se på weekday()
https://www.excelfunctions.net/vba-weekday-function.html
hvis du bruger
dagsdag = Weekday( Datoen, vbTuesday )
så vil den være 1 på tirsdage, og du skal 7 dage tilbage - ellers en uge længere tilbage
Tirsdag = dateadd( datoen, 1-(7+dagsdag))

du må selv teste de to kodelinjer
Avatar billede falster Ekspert
01. oktober 2018 - 16:39 #2
Lidt vba:

Public Function GetTuesday(InputDate As Variant) As Date
  If Weekday(InputDate, vbSunday) = vbTuesday Then
  GetTuesday = DateAdd("ww", -2, CDate(InputDate))
  Else
GetTuesday = InputDate - Weekday(InputDate, vbTuesday) + 1
End If
End Function

Det kan muligvis gøres elegantere. Men min minitest ser OK ud:

Inddato            Uddato
01-10-2018    25-09-2018
02-10-2018    18-09-2018
05-11-2018    30-10-2018
Avatar billede Brian Møller Juniormester
02. oktober 2018 - 07:08 #3
Tak Falster

Nu er det noget tid siden, at jeg rodede med vba i databaser. Jeg kan vel ikke få en function ind i efteropdatering, så den skal vel i stedet kaldes? Derudover, hvordan vil skulle sættes op til feltet me.jubilæumsdato?
Avatar billede claes57 Ekspert
02. oktober 2018 - 08:43 #4
me.[Hvidovre avis] = dateadd(me.jubilæumsdato, 1-(7+Weekday(me.jubilæumsdato, vbTuesday)))
Avatar billede falster Ekspert
02. oktober 2018 - 11:30 #5
#3: "at jeg rodede med vba i databaser" - også mig :-)

Formularer brugte jeg sjældent. Data ind i tabel ( [jubilæumsdato] ). Forespørgsel med vba-funktionen giver [Hvidovre avis].

Det må vel kunne lade sig gøre i formular - afhængigt af dine databaseobjekter og med de rette hændelsesprocedurer mm.

Eller måske kan claes' "formel-løsninger" anvendes (sammensat med hvis-kriterier).

Held og lykke.
Avatar billede Brian Møller Juniormester
03. oktober 2018 - 13:20 #6
Falster: Når jeg bruger din function, får jeg kun resultat 00:00:00 ud af det. Jeg tænker det er fordi jubilæumsdatofeltet ikke kommer ind som Inputdate.

Claes: Bruger jeg din kode, får jeg fejl "Argument not optional". Jeg har ikke hjerne til at gennemskue hvor det går galt
Avatar billede falster Ekspert
03. oktober 2018 - 13:39 #7
Som nævnt har jeg aldrig "gidet"/haft brug for at indsamle og bearbejde data via formularer.

Tabeller med efterfølgende forespørgsler med indbyggede og egne funktioner (og evt. opdateringsforespørgsler samt enkelte rapporter) har været tilstrækkeligt for mig.

Håber andre med mere forstand på anvendelse af formularer kigger med :-)
Avatar billede claes57 Ekspert
03. oktober 2018 - 14:38 #8
microsoft har 2 (TO) versioner af weekday()
en til makro, og en til excel osv - jeg havde brugt argument til makro, og så er der forkert rækkefølge i DateAdd ( interval, number, date ) (jeg bør slå efter, istedet for at prøve at huske...)

me.[Hvidovre avis] = DateAdd("d", 1-(7+Weekday(me.jubilæumsdato, 12)), me.jubilæumsdato)

håber det løser det.
Avatar billede fdata Forsker
04. oktober 2018 - 11:39 #9
En lille funktion:

Sub Test_Find_Tirsdag()
  Dim i As Integer
  For i = 1 To 14
    Debug.Print Date + -10 + i; " -> "; Find_Tirsdag(Date - 10 + i)
  Next i
End Sub

Function Find_Tirsdag(Dato As Date) As Date
  Dim w As Integer
 
  w = Weekday(Dato, vbMonday)
  If w < 3 Then 'Ma..Ti
    Find_Tirsdag = DateAdd("d", -w - 5, Dato)
  Else          'On..Sø
    Find_Tirsdag = DateAdd("d", -w + 2, Dato)
  End If
End Function
Avatar billede Brian Møller Juniormester
09. oktober 2018 - 10:06 #10
Jeg får fejlen "invalid call or procedure" ved Claes' forslag.
Fdata hvor skal feltet [Hvidovre avis] være i Sub testen ?
Avatar billede fdata Forsker
09. oktober 2018 - 17:08 #11
I din form:
Me.[Hvidovre avis] = Find_Tirsdag(Me.Jubilæumsdato)

(I øvrigt: Undgå mellemrum i feltnavne. Det kan give problemer)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester