Inserimento automatico degli orari in base a delle condizioni

Anonimo
2023-02-15T14:41:30+00:00

Salve a tutti.

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.

Grazie,

Luciano

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

9 risposte

Ordina per: Più utili
  1. Anonimo
    2023-02-16T13:12:18+00:00

    Ciao Luciano,

    Ciao, grazie per tutto per questo.

    Purtroppo non mi funziona.

    Siccome non sono molto pratico di Macro, si potrebbe fare tutto questo mediante il solo uso di formule?

    Non è necessario avere familiarità con VBA!

    Per illustrare questo, ho aggiunto un pulsante che esegue il codice e ho aggiunto le tue intestazioni nella riga 3.

    Prima di premere il pulsante, il foglio di interesse si presenta così:

         [![Immagine](https://learn-attachment.microsoft.com/api/attachments/45014a27-1106-4f35-bff1-f4c7283f8549?platform=QnA
    

    Premendo il pulsante lo schermo cambia, quasi istantaneamente, aggiungendo 506 righe di dati nelle colonne B:D

       [![Immagine](https://learn-attachment.microsoft.com/api/attachments/bf6011f4-7d9d-436c-9eb7-10548045231e?platform=QnA
    

    L'unica modifica che ho apportato al mio codice è sostituire la dichiarazione

        Const sPrimaCellaOutput As String = **"B6"             '<<=== Modifica**
    

    con:

          Const sPrimaCellaOutput As String = "B**4**"               '<<=== Modifica
    

    Ho fatto questo per assicurarmi che i dati richiesti inizieranno nella riga 4 anziché nella riga 6.

    Puoi scaricare il mio file prova aggiornato Luciano20230215.xlsm

    Per ottenere i dati richiesti, basta premere il pulsante!

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2023-02-16T12:29:19+00:00

    Ciao, grazie per tutto per questo.

    Purtroppo non mi funziona.

    Siccome non sono molto pratico di Macro, si potrebbe fare tutto questo mediante il solo uso di formule?

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2023-02-15T18:16:03+00:00

    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.

    Immagine

    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

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2023-02-15T15:39:29+00:00

    Ciao, grazie mille.

    Potresti provare a inserire le formule nel mio foglio e, una volta finito, allegarlo?

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2023-02-15T15:24:25+00:00

    Ciao, sono Leonielhou, un consulente indipendente e un utente come te, sono felice di aiutarti a chiarire qualsiasi domanda tu possa avere.

    utilizzando la funzione SE di Excel e la funzione DATA in combinazione con la funzione ORA. Ecco un esempio di come è possibile utilizzare questo metodo per popolare gli orari di ogni domenica:

    Nella prima riga della colonna "ORA" immettere la formula =SE(GIORNO SETTIMANALE(A2;2)=7;ORA(8;0;0);"") dove A2 è la data della prima domenica per la quale si desidera popolare gli orari. Copiare questa formula nella colonna per tutte le righe necessarie. Nella seconda riga, sostituire "8,0,0" nella formula con "10,30,0" e nella terza riga, sostituirlo con "12,0,0". Nella quarta riga usare la formula =SE(GIORNO.SETTIMANA(A2;2)=7;ORA(18;30;0);""). Per tenere conto delle diverse ore durante l'ora legale e di luglio e agosto, è possibile modificare le formule per tali date specifiche utilizzando una funzione SE simile. Ad esempio, per l'ora legale, è possibile utilizzare la formula =SE(E(MESE(A2)>=3;MESE(A2)<=10,WEEKDAY(A2,2)=7),TIME(19,0,0),IF(WEEKDAY(A2,2)=7,TIME(18,30,0),"")) which="" checks="" if="" the="" date="" is="" within="" the="" daylight="" saving="" time="" period="" (between="" march="" and="" october)="" and="" if="" it's="" a="" sunday,="" and="" if="" so,="" populates="" the="" time="" accordingly.="" otherwise,="" it="" populates="" the="" time="" for="" the="" regular="" sunday="" schedule.="" for="" july="" and="" august,="" you="" can="" use="" the="" formula="IF(AND(MONTH(A2)">=7;MESE(A2)<=8,WEEKDAY(A2,2)=7),IF(ROW()-ROW($A$1)=0,TIME(8,0,0),IF(ROW()-ROW($A$1)=1,TIME(19,30,0),"")),IF(WEEKDAY(A2,2)=7,TIME(18,30,0),"")). This formula checks if the date is within July or August and if it's a Sunday, and if so, populates the times for the specific schedule. If it's not a Sunday or it's not in July or August, it populates the regular Sunday schedule. Note that in all of these formulas, A2 is the date for the first Sunday you want to populate the times for, and you can copy the formulas down the column as far as you need. Also, the formulas assume that the dates are in chronological order, so make sure your dates are sorted correctly.</=10,WEEKDAY(A2,2)=7),TIME(19,0,0),IF(WEEKDAY(A2,2)=7,TIME(18,30,0),""))>

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento