Leggendo questo post mi era venuto in mente questo semplice codice ma stranamente a me funziona solo fino al 12 di ogni mese, e oltre no :rolleyes:
Public Sub DateChooser1_Change()
Dim d As Date, s As Integer, valore As String
d = Date(DateChooser1.Value)
valore = CString(d)
s = Week(d)
TextBox1.Text = s & " - " & CString(Val(valore))
End
:mad: :mad: :mad:
:ciao:
Bisogna proprio che non legga più lo spagnolo.
Io non ho mai usato il DateChooser ma incuriosito dalla domanda che mi pareva banale ho provato a scriverne il risultato così:
Print DateChooser1.Value ottenendo 11/12/2015 00:00:00 come risultato.
Ho dato per scontato che bisognasse ottenere la sola data e da li il codice postato e il qui pro quo che ha coinvolto anche la ML e lo stesso Benoit Minisini & Co.
Mi sarebbe bastato provare il codice in una TextBox e avrei visto che il DateChooser restituiva la sola data già localizzata.
Pertanto se vogliamo visualizzare in una textbox il numero della settimana e la data localizzata basta fare:
TextBox1.Text = Week(DateChooser1.Value) & " - " & DateChooser1.Value
Lo so se mi dicono furbo mi stanno prendendo in giro...
Conoscere il numero di una settimana (ossia se è la 1a oppure la 2a, etc) nell'arco dell'anno prescelto, è semplice; più complesso è individuare i gorni che appartengono ad una settimana individuata con il suo numero... per esempio quali giorni appartengono alla 20a settimana del 2015 ?
Intendi qualcosa del genere?
Public Sub Form_Open()
SpinBox2.Value = Year(Now)
End
Public Sub Button1_Click()
Dim i, iSettimana, primo, ultimo, anno As Integer
Dim primoGiornoAnno, sd1, sd2 As String
Dim d, d1, d2 As Date
iSettimana = SpinBox1.Value
anno = SpinBox2.Value
primoGiornoAnno = "1/1/" & anno
d = CDate(primoGiornoAnno)
i = WeekDay(d)
If i >= 0 And i <= 4 Then
ultimo = (iSettimana * 7) - i + 1
Else If i = 5
ultimo = (iSettimana * 7) + 3
Else If i = 6
ultimo = (iSettimana * 7) + 2
Endif
primo = ultimo - 6
d1 = d + (primo - 1)
d2 = d + (ultimo - 1)
sd1 = Format$(d1, "dddd dd/mm/yyyy")
sd2 = Format$(d2, "dddd dd/mm/yyyy")
If iSettimana = 53 Then
If Day(d1) > 28 Then
Label1.Text = "La settimana n. 53 non esiste da " & sd1 & " a\n" & sd2 & " è la prima dell'anno nuovo"
Else If Day(d1) > 0 And Day(d1) < 7 Then
Label1.Text = "La settimana n. 53 non esiste da " & sd1 & " a\n" & sd2 & " è la prima dell'anno nuovo"
Else
Label1.Text = "La settimana n. " & iSettimana & " va da " & sd1 & " a " & sd2
Endif
Else
Label1.Text = "La settimana n. " & iSettimana & " va da " & sd1 & " a " & sd2
Endif
End
.....
Meno male che mi sono ricordato, ti allego il progetto originale di allora, sperando che sia quello giusto e che funzioni.
.....
Grazie, funziona perfettamente :ok:
Quello che ti avevo chiesto era se potevi spiegami questo passaggio in particolare
If i >= 0 And i <= 4 Then
ultimo = (iSettimana * 7) - i
Else If i = 5
ultimo = (iSettimana * 7) + 2
Else If i = 6
ultimo = (iSettimana * 7) + 1
Endif
Quindi neanche tu avevi scoperto lo scherzetto :'(
Tieni presente l'articolo di Wikipedia indicato a Vuott qualche post sopra nella parte in cui si parla delle settimane di 7 giorni e anni di 52 o 53 settimane.
Ecco il codice commentato:
' Nota: Devi tenere a mente che la settimana è di sette giorni ma '
' parte da 0 e arriva a 6 e ho ottenuto con weekday il numero del '
' primo giorno dell''anno, secondo questa numerazione domenica 0 lunedì 1 ecc. '
If i >= 0 And i <= 4 Then
' Se il primo di gennaio appartiene all''anno nuovo '
' (vale a dire se è fra domenica e giovedì) a ultimo '
' assegno il numero dei giorni a partire dal primo gennaio. '
ultimo = (iSettimana * 7) - i
Else If i = 5
' Altrimenti se il primo gennaio è nell''ultima settimana '
' dell''anno prima, ottengo i giorni aggiungendo 2 o 1 '
' secondo che sia venerdì o sabato, domenica niente '
' perchè occorre come detto valutare che si inizia da 0. '
ultimo = (iSettimana * 7) + 2
Else If i = 6
ultimo = (iSettimana * 7) + 1
Endif
Ti è sufficiente? :ciao:
Ciao Tornu,
mentre davo un'occhiata al programma mi sono accorto di un bug che credo sia di Gambas (Trunk) anzi se non hai la trunk potresti fare una prova col codice postato più avanti e riferirmi.
Ne approfitto anche per meglio chiarire il codice che avevo scritto.
Prendiamo in considerazione l'immagine allegata che rappresenta due settimane contenenti l’inizio dell’anno, una (l’arancione) che ha il primo gennaio che cade di mercoledì, l’altra col primo di venerdì.
La settimana arancione è la prima settimana dell’anno e pertanto conterrà 3 giorni che appartengono all’anno precedente. Se io la devo conteggiare per calcolare il numero dei giorni fino ad una data settimana dell’anno, dovrò sottrarre 3.
Di contro se il primo dell’anno cade di venerdì come nel caso della settimana bianca allora sarà l’ultima settimana dell’anno precedente a contenere 2 giorni che appartengono all’anno nuovo e che andranno sommati nel calcolo dei giorni.
Così come avevo concepito il progetto; quando indico il numero delle settimane, per esempio la ventesima, per ottenere l’ultimo giorno della settimana indicata non basta moltiplicare 20 settimane per 7 giorni occorre anche aggiungere o sottrarre come spiegato prima.
Malgrado le tante informazioni ottenute sulle date continuo a non capirci molto, ma credo proprio che questo sia un bug (l’ho segnalato):
Public Sub Main()
Print CDate("1/1/2017"); Date(2017, 1, 1) ' > 31/12/2016 23:00:0001/01/2017 00:00:00
End
Quindi per non sapere ne leggere ne scrivere ti consiglio di usare questo progetto allegato che usa Date al posto di CDate.