Ciao Luciano,
Da settimane, ormai, sto impazzendo nel cercare un modo per risolvere il problema che sto per presentarvi.
Nella colonna "ORA" c'è un modo per avere gli orari automaticamente in base a dei criteri che voglio dare (ad esempio: tutte le domeniche mi deve inserire gli orari 8:00; 10:30; 12:00; 18:30)?
Io ho pensato di inserire le condizioni degli orari creando degli sportelli come quelli a destra dello screenshot; però, ovviamente, se ci fossero metodi migliori li accetterei molto volentieri.
Ad esempio, come nello screenshot, tutte le domeniche devono avere:
- durante l'ora solare, gli orari 8:00; 10:30; 12:00; 18:30
- durante l'ora legale, gli orari 8:00; 10:30; 12:00; 19:00
- durante luglio e agosto, gli orari 8:00 e 19:30
Quindi ciò significa che, ad esempio, quest'anno, l'8 gennaio, cadendo di domenica, deve avere quattro righe (come nello screenshot). Però l'anno prossimo, 2024, l'8 gennaio cadrà di lunedì, perciò dovrà avere solo una riga.
Mi auguro che sia stato chiaro nello spiegare questo mio problema e spero che qualcuno mi possa aiutare nel trovare una soluzione.

Prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice:
'========>>
Option Explicit
'-------->>
Public Sub Tester()
Dim WB As Workbook
Dim SH As Worksheet
Dim destRng As Range
Dim arrOraSolare As Variant, arrOraLegale As Variant, arrLuglioAgosto
Dim arrOut As Variant
Dim dDate As Date, dStart As Date
Dim iDays As Long, iMax As Long
Dim i As Long, j As Long, iCtr As Long
Const iYear As Long = 2023
Const oraLegale\_Start As Date = **#3/26/2023# '<<=== Modifica**
Const oraLegale\_End As Date = **#10/29/2023# '<<=== Modifica**
Const oreLegali As String = **"08:00,10:30,12:00,18:30"**
Const oreSolari As String = **"08:00,10:30,12:00,19:00"**
Const oreLuglioAgosto As String = **"08:00,19:30"**
Const sFoglio As String = **"Foglio1" '<<=== Modifica**
Const sPrimaCellaOutput As String = **"B6" '<<=== Modifica**
Set WB = ThisWorkbook
Set SH = WB.Sheets(sFoglio)
dStart = DateSerial(iYear, 1, 1)
iDays = DaysInYear(iYear)
ReDim arrOut(1 To iDays + 52 \* 4, 1 To 3)
arrOraLegale = Split(oreLegali, ",")
arrOraSolare = Split(oreSolari, ",")
arrLuglioAgosto = Split(oreLuglioAgosto, ",")
For i = 1 To iDays
dDate = dStart + i - 1
If Weekday(dDate) = vbSunday Then
If Month(dDate) = 7 Or Month(dDate) = 8 Then
For j = 1 To 2
iCtr = iCtr + 1
arrOut(iCtr, 1) = Format(dDate, "ddd")
arrOut(iCtr, 2) = Format(dDate, "d mmm")
arrOut(iCtr, 3) = arrLuglioAgosto(j - 1)
Next j
ElseIf dDate >= oraLegale\_Start And dDate <= oraLegale\_End Then
For j = 1 To 4
iCtr = iCtr + 1
arrOut(iCtr, 1) = Format(dDate, "ddd")
arrOut(iCtr, 2) = Format(dDate, "d mmm")
arrOut(iCtr, 3) = arrOraLegale(j - 1)
Next j
Else
For j = 1 To 4
iCtr = iCtr + 1
arrOut(iCtr, 1) = Format(dDate, "ddd")
arrOut(iCtr, 2) = Format(dDate, "d mmm")
arrOut(iCtr, 3) = arrOraSolare(j - 1)
Next j
End If
Else
iCtr = iCtr + 1
For j = 1 To 2
arrOut(iCtr, 1) = Format(dDate, "ddd")
arrOut(iCtr, 2) = Format(dDate, "d mmm")
Next j
End If
Next i
Set destRng = SH.Range(sPrimaCellaOutput).Resize(iCtr, 3)
With destRng
.Value = arrOut
.Columns(2).NumberFormat = "d mmm"
.Columns(36).NumberFormat = "hh:mm"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
End Sub
'-------->>
Public Function DaysInYear(iYear As Long) As Long
DaysInYear = DateDiff("d", DateSerial(iYear, 1, 1), DateSerial(iYear + 1, 1, 1))
End Function
'<<========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel.
- Salva il file con l'estensione xlsm
- Alt+F8 per aprire la finestra di gestione delle macro
- Seleziona Tester
- Esegui
Potresti scaricare il mio file di prova Luciano20230215.xlsm
A causa di un problema con l'attuale editor del forum, che inserisce righe vuote indesiderate nel codice copiato dal forum, suggerirei di copiare il mio codice direttamente dal mio file di prova.
===
Regards,
Norman
