Find second monday of each month

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Find second monday of each month

25 Jan 2014, 06:35

Hi!

I found this "Find last sunday of each month" script and thought it was easy to modify it to find second monday of each month, but it wasn't. I changed it so the script finds mondays alright, but I'm not sure how to modify the calculation of the second monday of each month. Anyone knows?

Code: Select all

InputBox, Year, , Enter a year., , 300, 135
Date := Year . "0101"
 
while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = 2) ; 2=Monday. Search for mondays <<<<<<<<<<<<<<<<<<<<<<<<<<<
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    Date += 1, Days
}
 
Gui, Font, S10, Courier New
Gui, Add, Text, , % "Last Sundays of " Year ":`n---------------------"
 
Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    Gui, Add, Text, y+1, % Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index%
}
 
Gui, Show
return
User avatar
tomoe_uehara
Posts: 213
Joined: 05 Oct 2013, 12:37
Contact:

Re: Find second monday of each month

25 Jan 2014, 07:42

Here you are: Image

Code: Select all

InputBox, Year, , Enter a year., , 300, 135
Date := Year . "0101"
 
while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = 2)
    {
        aa++
        if aa=2
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
        if aa >= 4
        aa :=
    }
    Date += 1, Days
}
 
Gui, Font, S10, Courier New
Gui, Add, Text, , % "Second Mondays of " Year ":`n---------------------"
 
Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    Gui, Add, Text, y+1, % Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index%
}
 
Gui, Show
return

ESC::
GuiClose:
ExitApp
User avatar
tomoe_uehara
Posts: 213
Joined: 05 Oct 2013, 12:37
Contact:

Re: Find second monday of each month

25 Jan 2014, 08:35

Or the more configurable script:
Image

Code: Select all

;[tomoe] Weekday Calculator
Gui, Font, S10, Courier New
Gui, Add, Text, x22 y10 w30 h20, Year
Gui, Add, Edit, x102 y10 w80 h20 vYear gSave, %A_YYYY%
Gui, Add, Text, x22 y40 w70 h20, Position
Gui, Add, DropDownList, x102 y40 w80 h20 r5 vNum gSave AltSubmit, First||Second|Third|Fourth|Last
Gui, Add, Text, x22 y70 w50 h20, Day
Gui, Add, DropDownList, x102 y70 w80 h20 r7 vDayz gSave AltSubmit, Sunday||Monday|Tuesday|Wednesday|Thursday|Friday|Saturday
Gui, Add, Edit, x12 y100 w170 h240 vResult ReadOnly -VScroll
; Generated using SmartGUI Creator for SciTE
Gui, Show, w193 h354, My GUI #1
GoSub Save
return

Save:
Gui, Submit, Nohide
aa :=
Date := Year . "0101"
Last := SubStr(Date, 5, 2)
while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz)
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Num)
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
}
GuiControl,, Result
Result :=
Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index%
    Result = %Result%`n%Res%
}
GuiControl,, Result, %Result%
return

ESC::
GuiClose:
ExitApp
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

25 Jan 2014, 09:54

Hello tomoe_uehara!

Thanks for helping me out. I did notice script in post 2 goes south from april and onwards. I was hoping you could tell me which line of code in the original script that stipulates particularly the fourth sunday (or monday) of each month to be choosen? I cant work that out from your modifications. I do ask because original script seems to be basically unchanged apart from the code you added in script 2. By the way the last script is very nice and works amazingly well. Wonder if you could add some descriptive comments on key parts so I can have a chance to learn what is happening?

Regards
zcooler
User avatar
tomoe_uehara
Posts: 213
Joined: 05 Oct 2013, 12:37
Contact:

Re: Find second monday of each month

25 Jan 2014, 11:31

Ah yes, on post #2, I mistakenly calculate the number of weeks per month, because some has 4 and the other 5.
Okay, which part of code do you want to be explained further?
timeFlies
Posts: 146
Joined: 22 Oct 2013, 20:54
Location: Somewhere in the northern hemisphere.

Re: Find second monday of each month

25 Jan 2014, 15:17

Could you add comments for non-GUI part? I would like to see this too.
User avatar
tomoe_uehara
Posts: 213
Joined: 05 Oct 2013, 12:37
Contact:

Re: Find second monday of each month

25 Jan 2014, 15:57

I assume that you want the explanations for these code

Code: Select all

Save:
Gui, Submit, Nohide
aa :=
Date := Year . "0101"
Last := SubStr(Date, 5, 2)
while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz)
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Num)
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
}
GuiControl,, Result
Result :=
Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index%
    Result = %Result%`n%Res%
}
GuiControl,, Result, %Result%
return
Hmm... First of all, since we want to know how many day occurrences every month, then we have to set the year at January 1st
So the 'Date' variable will be 20140101, using the YYYYMMDD format.

Code: Select all

Date := Year . "0101"
Then put the month on the 'Last' variable

Code: Select all

Last := SubStr(Date, 5, 2)
After that we will perform a loop for a whole year by using a while-loop, and this will loop if the year is still the same as we specified earlier

Code: Select all

while SubStr(Date, 1, 4) = Year {
We only want to know for each specific days, right? Then we have to convert the 'Date' variable to use the WDay format to be able to see if it's Sunday-Saturday

Code: Select all

FormatTime, WD, % Date, WDay
Then we check if our loop hits the specified day

Code: Select all

if (WD = Dayz)
If equal, then add 1 value to our 'aa' variable

Code: Select all

aa++
We check if this is still the same month or not by doing this

Code: Select all

if (SubStr(Date, 5, 2) != Last)
If it's already a new month, then we update our 'Last' variable and add reset the 'aa' variable to 1 again

Code: Select all

Last := SubStr(Date, 5, 2)
aa := 1
After that, we check if it's the 1st/2nd/3rd/4th/last week by looking to our 'aa' variable

Code: Select all

if (aa = Num)
If it's a match, we can safely store the value into our pseudo array

Code: Select all

MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
This code will trim the leading 0 from our month, so January will be 01 -> 1

Code: Select all

MM := LTrim(SubStr(Date, 5, 2), "0")
This code will store our value (the date) to variable named 'Day1', 'Day2' until 'Day12'

Code: Select all

Day%MM% := SubStr(Date, 7, 2)
After our script decides if that specific date is a match or not to our criteria, we will advance the 'Date' variable by 1 day

Code: Select all

Date += 1, Days
And we will hit the end of the while-loop, so the script will start over from the top of the loop again, until the year is not the same again (2014 -> 2015), and if it's not the same year, it will break (exit) the while-loop.
The rest of the code is just a code to update the GUI

I hope my explanation is clear enough
Image
Feel free to ask if you're still having some questions...
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

25 Jan 2014, 16:12

tomoe_uehara wrote:Okay, which part of code do you want to be explained further?
Oh, you did beat me to it. Saw you were posting before I got the chance to. Thanks for your excellent description :) Did study your last script closer for some hours and do now understand which variables/values to pass to my function in order to make it easy configurable in the bigger script. However when making the function I get some peculiar tab format on some rows in the msgbox. Wonder what could cause it though and if that later on causes troubles when using substr on it to retrieve single dates? In actual msgbox the tab error was after February, but when copying the msgbox content and pasting it in notepad++ the error was after May. When copying the notepad++ result in this forum it gets like the below, which I find strange.

Function:

Code: Select all

Dayz := 2    ; search for mondays
Num := 2     ; 2nd occurence of each month 
Year := 2014 
msgbox % FindXnumWeekdaysOfEachMonth(Num, Dayz, Year)

FindXnumWeekdaysOfEachMonth(ByRef Num, Dayz, Year) {
  aa :=
  Date := Year . "0101"
  Last := SubStr(Date, 5, 2)
  while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz)
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Num)
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
  }
  Result :=
  Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index%
    Result = %Result%`n%Res%
  }
  return Result
}
Msgbox:
---------------------------
find min.ahk
---------------------------

januari 13
februari 10
mars 10
april 14
maj 12
juni 09
juli 14
augusti 11
september 08
oktober 13
november 10
december 08
---------------------------
OK
---------------------------
User avatar
tomoe_uehara
Posts: 213
Joined: 05 Oct 2013, 12:37
Contact:

Re: Find second monday of each month

25 Jan 2014, 16:58

I think the problem is the Font type, see the code below, if the string length is more than 7 you will get 2 tabs, else you will get 1 tab. And your language setting is not English too.

It's really depend on how you want the result to be displayed.
That is to use a single tab on every month, or will you use special rule for the tabs.

Code: Select all

Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index%
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

25 Jan 2014, 17:17

Aha, I see! I think a single space between month and date will do. I'll figure it out, now I know which line to focus on :) This is great, it works like a charm entirely thanks to you.
Many thanks for your excellent help tomoe_uehara :)

Greetings from
zcooler
timeFlies
Posts: 146
Joined: 22 Oct 2013, 20:54
Location: Somewhere in the northern hemisphere.

Re: Find second monday of each month

26 Jan 2014, 01:42

Wow! Thanks for that excellent description! It actually makes sense now and isn't a bunch of mumbo-jumbo!
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

27 Jan 2014, 17:04

Unfortunately I'm totally stuck and seem to only produce brainfarts trying to solve it. I do think I'm supposed to use some kind of array, but haven't got that far in my AHK study. I wanna use the same two variables "Dayz" and "Num" but putting in multiple values to search for and passing them to the function.The instring should then match when it is the:
- 2nd Sunday of each month
- 1st Thursday of each month
- 4th Sunday of each month

Script works as long as each variable contains a single value, but now when adding an extra dimension it got really hard. Maybe someone could show me how to do this?

Code: Select all

Dayz := 1,5,1 ; Weekdays 1=Sunday, 2=Monday, 3=Tuesday etc. 
Num := 2,1,4  ; 1st, 2nd, 3rd or 4th occurence of each month 
FormatTime, Year,, yyyy ; Which year is it now
FormatTime, DayOfMonth,, MMMM dd ; Which day of month is it now
Result := FindXnumWeekdayOfEachMonth(Num, Dayz, Year)
;msgbox % Result
;DayOfMonth := "maj 12"
IfInString, Result, %DayOfMonth% 
 {
    MsgBox, The string was found.
    return
 }

FindXnumWeekdayOfEachMonth(ByRef Num, Dayz, Year) {
  aa :=
  Date := Year . "0101"
  Last := SubStr(Date, 5, 2)
  while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz)
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Num)
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
  }
  Result :=
  Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    ;Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index% ;tabs included
	Res := Month " " Day%A_Index% ;no tabs
    Result = %Result%`n%Res%
  }
  return Result
}
kon
Posts: 1756
Joined: 29 Sep 2013, 17:11

Re: Find second monday of each month

27 Jan 2014, 17:45

Maybe something like this:

Code: Select all

Dayz := {2:1,1:2,4:3} ;Dayz := {occurance: Weekday}		Key is occurance (1st, 2nd,etc) val is day (Weekdays 1=Sunday, 2=Monday, 3=Tuesday etc.)
FormatTime, Year,, yyyy ; Which year is it now
FormatTime, DayOfMonth,, MMMM dd ; Which day of month is it now
WD := {1: "Sun", 2: "Mon", 3: "Tue", 4: "Wed", 5: "Thu", 6: "Fri", 7: "Sat"}

for Num, WeekDay in Dayz {
	Result .= Num (Num = 1 ? "st" : Num = 2 ? "nd" : Num = 3 ? "rd" : "th") A_Space WD[WeekDay]
	Result .= FindXnumWeekdayOfEachMonth(Num, WeekDay, Year) "`n`n"
}
MsgBox, % Result
return


FindXnumWeekdayOfEachMonth(ByRef Num, Dayz, Year) {
  aa :=
  Date := Year . "0101"
  Last := SubStr(Date, 5, 2)
  while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz)
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Num)
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
  }
  Result :=
  Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    ;Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index% ;tabs included
    Res := Month " " Day%A_Index% ;no tabs
    Result = %Result%`n%Res%
  }
  return Result
}
(glad to see my Rosetta Code submission is getting some practical use and nice modifications by tomoe_uehara) :)
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

28 Jan 2014, 11:38

kon wrote:(glad to see my Rosetta Code submission is getting some practical use and nice modifications by tomoe_uehara) :)
Hi kon! Haha...yes indeed! This script is going to save me lots of money for unnecessary parkingtickets. I keep forgetting when those damned dates are and it's beginning to be expensive ;)
Thanks for your help! I usually have my car parked on four different streets in the neighbourhood almost all with different dates when parking is forbidden during a timespan of 8hrs each (maintenance day). My plan is to have this script remind me 1 day before the forbidden parking date, so I have a chance to move the vehicle in time and avoid the ticket. In order to do that I must come up with a way the script can separate which day is which. As is now everything returning from function gets concatenated into a single variable "Results" and when checking for instring match, there is no way knowing which msgbox to fire up informing about which day the parking prohibition is concerned (and which street for my own memory). See the code and you'll get in broad strokes what i'm after. Perhaps this is impossible without getting the function to return different variables for each dayz?

Code: Select all

Dayz := {2:1,1:2,4:3} ;Dayz := {occurance: Weekday} Key is occurance (1st, 2nd,etc) val is day (Weekdays 1=Sunday, 2=Monday, 3=Tuesday etc.)
FormatTime, Year,, yyyy ; Which year is it now
FormatTime, DayOfMonth,, MMMM dd ; Which day of month is it now
WD := {1: "Sun", 2: "Mon", 3: "Tue", 4: "Wed", 5: "Thu", 6: "Fri", 7: "Sat"}

for Num, WeekDay in Dayz {
    Result .= Num (Num = 1 ? "st" : Num = 2 ? "nd" : Num = 3 ? "rd" : "th") A_Space WD[WeekDay]
    Result .= FindXnumWeekdayOfEachMonth(Num, WeekDay, Year) "`n`n"
	;MsgBox, % Result
}
;MsgBox, % Result
;return
IfInString, Result, %DayOfMonth% 
 {
    ;MsgBox, The string was found.
    MsgBox, It's the second Monday of the month tomorrow. You must move your car if it's parked on Broadstreet or Victoriastreet. 
    Msgbox, It's the first Friday of the month tomorrow. You must move your car if it's parked on Easystreet. 
    Msgbox, It's the fourth Monday of the month tomorrow. You must move your car if it's parked on Starstreet. 	
    return
 }

FindXnumWeekdayOfEachMonth(ByRef Num, Dayz, Year) {
  aa :=
  Date := Year . "0101"
  Last := SubStr(Date, 5, 2)
  while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz)
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Num)
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
  }
  Result :=
  Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    ;Res := Month (StrLen(Month) > 7 ? "" : "`t") "`t" Day%A_Index% ;tabs included
    Res := Month " " Day%A_Index% ;no tabs
    Result = %Result%`n%Res%
  }
  return Result
}
Regards
zcooler
kon
Posts: 1756
Joined: 29 Sep 2013, 17:11

Re: Find second monday of each month

28 Jan 2014, 12:35

How about something like this:

Code: Select all

Dayz := {"SecondMonday": [2, 2, "Broadstreet or Victoriastreet", "second Monday"]
	 ,   "FirstFriday": [1, 6, "Easystreet", "first Friday"]
	 ,   "FourthMonday": [4, 2, "Starstreet", "fourth Monday"]
	 ,   "FifthWednesday": [5, 4, "Mainstreet", "fifth Wednesday"] }

Tomorrow := A_Now
Tomorrow += 1, Days
FormatTime, Year, % Tomorrow, yyyy ; Which year is it tomorrow
FormatTime, DayOfMonth, % Tomorrow, MMMM dd ; Which day of the month is it tomorrow

for Key, WeekDay in Dayz {
    Result := Dayz[key, 4] ":`n" FindXnumWeekdayOfEachMonth(WeekDay, Year) "`n`n"
    IfInString, Result, %DayOfMonth%
		MsgBox, % "It's the " Dayz[Key, 4] " of the month tomorrow. You must move your car if it's parked on " Dayz[Key, 3] "."
}
return

FindXnumWeekdayOfEachMonth(Dayz, Year) {
  Date := Year . "0101"
  Last := SubStr(Date, 5, 2)
  while SubStr(Date, 1, 4) = Year {
    FormatTime, WD, % Date, WDay
    if (WD = Dayz[2])
    {
        aa++
        if (SubStr(Date, 5, 2) != Last)
        {
            Last := SubStr(Date, 5, 2)
            aa := 1
        }
        if (aa = Dayz[1])
        MM := LTrim(SubStr(Date, 5, 2), "0"), Day%MM% := SubStr(Date, 7, 2)
    }
    Date += 1, Days
  }
  Loop, 12 {
    FormatTime, Month, % Year (A_Index > 9 ? "" : "0") A_Index, MMMM
    Result .= Month " " Day%A_Index% "`n"
  }
  return Result
}
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

28 Jan 2014, 14:15

H*ell YES, that's it! Genius stuff!! Now that was a lesson in the higher school and it first felt like you were pulling rabbits out of the hat. I assume the Dayz variable contains an array and at first I have difficulties to follow it. The array seem to be divided into 4 keys, numbered from left (1) to right (4) at each row. Left of ":" is only the row label and it has no part in the actual array. Yes, I think I do understand it now.

Man, this is great :D Can't wait to throw some voice synthesis on the message and have the script executed every day. I can say bye bye to any more parking tickets :D You should sell this script as an app, the market for it is probably huge. Kon, I couldn't thank you enough! Great work! Many thanks from

Zcooler
kon
Posts: 1756
Joined: 29 Sep 2013, 17:11

Re: Find second monday of each month

28 Jan 2014, 14:57

I assume the Dayz variable contains an array and at first I have difficulties to follow it. The array seem to be divided into 4 keys, numbered from left to right at each row. Left of ":" is only the row label and it has no part in the actual array.
Close... Dayz is an array, and it contains 4 arrays. It is an array of arrays, or a "two dimensional array".

Dayz is an associative array. It has named keys (SecondMonday, FirstFriday...) that each correspond to values. (the values in this case are arrays also.)
SecondMonday is the key that corresponds to the array [2, 2, "Broadstreet or Victoriastreet", "second Monday"].
You can access different values stored in the array like this:

Code: Select all

Dayz := {"SecondMonday": [2, 2, "Broadstreet or Victoriastreet", "second Monday"]
     ,   "FirstFriday": [1, 6, "Easystreet", "first Friday"]
     ,   "FourthMonday": [4, 2, "Starstreet", "fourth Monday"]
     ,   "FifthWednesday": [5, 4, "Mainstreet", "fifth Wednesday"] }

MsgBox, % Dayz.SecondMonday[3]

; or same result, different syntax
MsgBox, % Dayz["FirstFriday", 3]
Later when we use the for-loop for Key, WeekDay in Dayz, we are looping once for each key/value pair in Dayz.
So the first iteration of the loop Key contains SecondMonday and WeekDay contains the array [2, 2, "Broadstreet or Victoriastreet", "second Monday"].
The second iteration of the loop Key contains FirstFriday and WeekDay contains the array [1, 6, "Easystreet", "first Friday"]. etc.

Edit
: Actually the keys will be looped through in alphabetical order, so the first loop iteration will be FifthWednesday, and the second will be FirstFriday etc.
zcooler
Posts: 455
Joined: 11 Jan 2014, 04:59

Re: Find second monday of each month

28 Jan 2014, 15:17

Wow, what a lesson...i am actually understanding this and my learning curve is very steep atm, thanks to this great example and your good teaching ability. This will come in handy in my other scripts. I can already think of several where I could use 2-dimensional arrays. You and tomoe_uehara are the best. Thanks to you both :D
kon
Posts: 1756
Joined: 29 Sep 2013, 17:11

Re: Find second monday of each month

28 Jan 2014, 15:54

Glad I could help Image

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Aqualest, Bing [Bot], jdfnnl and 354 guests