Condividi:        

Aiuto su esame intervallo

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Aiuto su esame intervallo

Postdi Belvel » 09/02/18 12:08

Buongiorno a tutti

allego un file dove dato il budget in E2, excel, prendendo come riferimento il mese solare (le cui date sono presenti in colonna A e B), somma i valori in colonna C e mi evidenzia in colonna D quando tale somma è uguale o maggiore del budget in E2.

Il problema che non riesco a risolvere è nel caso di date uguali. Infatti quando viene raggiunto o superato il budget, l'analisi si ferma alla prima data uguale, mentre invece, solo nel caso in cui le date siano uguali, vorrei che si fermasse in corrispondenza dell'ultima data uguale.

Mi spiego meglio: se guardiamo l'allegato, vorrei che excel, in caso di date uguali, terminasse l'analisi in corrispondenza della cella "D6" ossia in corrispondenza dell'ultima delle date uguali e mi evidenziasse lì la somma raggiunta (nell'esempio il budget di 300 eur viene raggiunto e superato il 13.12.2013 ma in D6 e non in D5).

http://www.filedropper.com/test1_28

Grazie in anticipo
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Sponsor
 

Re: Aiuto su esame intervallo

Postdi wallace&gromit » 09/02/18 15:39

Forse non ho capito del tutto le tue esigenze, ma ho provato a riscrivere la formula da inserire in D6 come la vedo io ed il risultato è questo:
Codice: Seleziona tutto
=SE(MESE(B6)=MESE(B7);"";SE(SOMMA(SE(MESE($B$2:B6)=MESE(B6);$C$2:C6))>$E$2;SOMMA(SE(MESE($B$2:B6)=MESE(B6);$C$2:C6));""))
sempre matriciale come le tue. A me sembra funzionare.
Office2016 + 2019 su win11
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: Aiuto su esame intervallo

Postdi Belvel » 09/02/18 16:35

Ciao
grazie per l'aiuto ma non era quello che intendevo.

forse mi sono espresso male. Quello che scrivi tu va bene se io sapessi a priori dove è che ci sono giorni uguali. Io però ho una serie di date che di volta in volta copio in A e B e quindi avrei bisogno di una formula dinamica.

Cerco di riassumere la mia esigenza allegando un nuovo file:

http://www.filedropper.com/test2_11

Dato il budget in E2 vorrei che excel, prendendo come riferimento il mese solare (le cui date sono presenti in colonna A e B), sommasse i valori in colonna C e mi evidenziasse in colonna D quando tale somma è uguale o maggiore del budget E2.

Nell'esempio che allego, IL BUDGET viene raggiunto e superato sommando i valori da C2 a C16 e quindi vorrei che in cella D16 venisse scritto a quanto ammonta tale valore.

Con la formula che uso io, Excel si ferma in D15 e non in D16 perchè non riesco a dirgli che "quando viene raggiunto o superato il budget verifica che la data di raggiungimento non si uguale a quelle nelle celle successive. Se lo è, allora devi sommare anche i valori in "C" di tali date successive e uguali e scrivermi il totale in "D" in corrispondenza dell'ultima di tali date uguali"
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 09/02/18 16:37

Ciao Belvel, benvenuto nel forum.

Io userei in D2 la seguente formula:
Codice: Seleziona tutto
=SE(E(SOMMA(SE(A$2:A$100<=A2;C$2:C$100;""))>$E$2;SOMMA(D$1:D1)=0;A2<>A3);SOMMA(SE(A$2:A$100<=A2;C$2:C$100;""));"")

Va confermata con Contr-Maiusc-Enter, non il solo Enter; poi va copiata verso il basso

Vedi se il comportamento e' come lo aspetti, perche' dalla tua formula non ho capito bene che calcoli fai tu.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 09/02/18 17:24

Grazie Anthony, sono contento di essere su questo forum.

Venendo a noi, la tua formula va bene ma poi dopo D16 non si comporta come invece vorrei. In pratica, io ho bisogno di analizzare mese per mese in quale giorno di ogni mese viene raggiunto o superato il budget E2.

Se viene raggiunto o superato, allora Excel mi deve dire in quale giorno di quel mese ciò avviene scrivendomi nella cella D il totale raggiunto e poi deve ricominciare l'analisi il mese successivo.

Se non viene raggiunto in quel mese, allora Excel mi deve dire cosa ha totalizzato in quel mese, e quel totale me lo deve riportare in corrispondenza dell'ultimo giorno di quel mese sempre in cella D.

Il tutto gestendo il fatto che posso avere più date identiche dove ho altrettante spese che vanno sommate tra loro al fine del raggiungimento o superamento del budget.

Spero si capisca, altrimenti se vuoi posso allegare un file più esplicativo.
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 10/02/18 18:17

Ma in E2 c'e' il budget mensile o quello annuale?
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Anthony47 » 11/02/18 01:06

Se si tratta di budget mensile, allora in D2 inserisci la formula
Codice: Seleziona tutto
=SE(C2>E2;C2;0)

In D3 inserisci invece
Codice: Seleziona tutto
=SE(O(MESE(A3)<>MESE(A4);E(SOMMA(SE(MESE($A$2:$A3)=MESE(A3);$C$2:$C3;""))>$E$2;A3<A4;SOMMA(($D$2:D2)*(MESE(A$2:A2)=MESE(A3)))=0));SOMMA(SE(MESE($A$2:$A3)=MESE(A3);$C$2:$C3;""));0)

Va confermata con Contr-Maiusc-Enter, non il solo Enter; poi la copi verso il basso.

Questa ti mettera' un valore diverso da 0 quando superi il budget e /o quando arrivi a fine mese. Eventualmente formatta in "stile separatore" (l'icona nel gruppo Numeri che e' visualizzata come 000), in modo da non vedere gli 0; eventualmente formatta in modo che il riepilogo di fine mese abbia una sua chiara evidenza.

Fai sapere...
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 11/02/18 10:19

Ciao Anthony

ci siamo quasi :-) Solo due cose:

1) se il budget è raggiunto in un giorno diverso dall'ultimo giorno del mese allora vorrei che l'analisi riprendesse dal 1° giorno del mese successivo senza darmi il totale dell'ultimo giorno del mese (Es. se il 14 aprile è raggiunto il budget allora il 30 aprile non deve esserci nessun totale perché l'analisi deve ripartire dal 1° Maggio).

2) Si possono esaminare sullo stesso foglio più anni assieme? Ho notato che la formula si ferma al 365° giorno per cui se io ad es in A e B oltre al 2017 ci metto anche il 2018 e copio le formule anche nel 2018, l'analisi non viene fatta.

Grazia ancora
Belvel
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 11/02/18 23:14

1) se il budget è raggiunto in un giorno diverso dall'ultimo giorno del mese allora vorrei che l'analisi riprendesse dal 1° giorno del mese successivo senza darmi il totale dell'ultimo giorno del mese (Es. se il 14 aprile è raggiunto il budget allora il 30 aprile non deve esserci nessun totale perché l'analisi deve ripartire dal 1° Maggio)

Secondo me lo stato a fine mese ha una sua rilevanza; ad esempio ci sono mesi in cui mettiamo al gg 10 hai sforato ma poi a fine mese sei ampiamente in budget per non dire in attivo.
Formattando (con formattazione condizionale) i dati di fine mese avresti la chiara evidenza dell'eventuale sforo e del dato finale.

2) Si possono esaminare sullo stesso foglio più anni assieme? Ho notato che la formula si ferma al 365° giorno per cui se io ad es in A e B oltre al 2017 ci metto anche il 2018 e copio le formule anche nel 2018, l'analisi non viene fatta.
Finora ho immaginato un riepilogo annuale; quanto proposto funziona se non ci sono Mesi appartenenti a due anni diversi.

Possiamo risolvere sia il discorso del dato di fine mese che l'elenco multi-anno usando in D3 la seguente formula:
Codice: Seleziona tutto
=SE(E(SOMMA(SE(TESTO($A$2:$A3;"aaaamm")=TESTO(A3;"aaaamm");$C$2:$C3;""))>$E$2;A3<A4;SOMMA(($D$2:D2)*(TESTO(A$2:A2;"aaaamm")=TESTO(A3;"aaaamm")))=0);SOMMA(SE(TESTO($A$2:$A3;"aaaamm")=TESTO(A3;"aaaamm");$C$2:$C3;""));SE(E(MESE(A3)<>MESE(A4);SOMMA((D$2:D2)*(TESTO(A$2:A2;"aaaamm")=TESTO(A3;"aaaamm")))=0);SOMMA(SE(TESTO($A$2:$A3;"aaaamm")=TESTO(A3;"aaaamm");$C$2:$C3;""));0))

Sempre da confermare con Contr-Maiusc-Enter, e poi da copiare verso il basso.

Tuttavia in questo modo la velocita' di calcolo si riduce sensibilmente man mano che l'elenco si allunga.

Pertanto il mio suggerimento e' di sostituire le formule con una macro, da avviare quando serve e che si occupa di inserire i marker di overbudget o di fine mese dove serve.
Il codice della macro:
Codice: Seleziona tutto
Sub CkBdg()
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
'
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("E2").Value   '<<< La cella col budget da verificare
'
LastA = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, bFlag).Resize(LastA + 10, 1).ClearContents
LY = Year(Application.WorksheetFunction.Min(Range("A:A")))
HY = Year(Application.WorksheetFunction.Max(Range("A:A")))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = 2 To LastA
    If IsDate(Cells(I, 1)) Then
    curD = Cells(I, 1)
        If Month(curD) <> cM And cM <> 0 Then
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If
        End If
        cM = Month(curD)
        cY = Year(curD)
        RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, 3).Value
        If RArr(cY, cM, 1) > BuMen And Cells(I, 1) <> Cells(I + 1, 1) Then
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I, bFlag).Value = RArr(cY, cM, 1)
                RArr(cY, cM, 2) = 1
            End If
        End If
    End If
Next I
Beep
End Sub

Il codice va messo in un "modulo standard" del vba; per questo, partendo da Excel:
-premi Alt-F11 per aprire l'editor delle macro
-Menu /Inserisci /Modulo
-Copia il codice e incollalo nel frame dx del modulo appena creato
Personalizza le righe marcate <<< come da commenti; il particolare la colonna in cui si vuol marcare l'OverBudget (io ho usato F per poter confrontare i risultati con le formule di colonna D)

Poi torna su Excel e, una volta che il contenuto del foglio e' pronto, lancia la macro CkBdg:
-premi Alt-F8
-seleziona CkBdg dall'elenco di macro disponibili
-premi Esegui

Eventualmente posizioni un "Pulsante" sul foglio e gli associ la Sub CkBdg, in modo che all'occorrenza bastera' premere il pulsante per eseguire il controllo.

La macro impiega max 1-2 decimi di secondo a eseguirsi; quindi si potrebbe anche eseguire automaticamente (senza che questo crei disturbo) tutte le volte che viene modificato il contenuto di colonna A oppure colonna C.
Se vuoi questo automatismo:
-tasto dx sul tab col nome del foglio su cui lavori; scegli Visualizza codice
-copia questo codice e incollalo nel frame vuoto del vba che viene cosi' aperto:
Private Sub Worksheet_Change(ByVal Target As Range)
Codice: Seleziona tutto
If Target.Count = 1 Then
    If Target.Column = 1 Or Target.Column = 3 Then
        Application.EnableEvents = False
        Call CkBdg
        Application.EnableEvents = False
    End If
End If
End Sub

A questo punto tutte le volte che modifiche un (1 solo) valore in colonna A (data di inizio) o colonna C (valore) la macro si esegue e inserisce i marker nella colonna prescelta.
Nota che la macro non si esegue se modifiche piu' celle contemporaneamente (es cancelli "alcune" celle) o se modifichi il valore del budget mensile. In questo caso devi procedere con l'esecuzione della CkBdg come detto prima (pulsante o Alt-F8).
Dopo l'eventuale inserimento delle macro il file va salvato con l'estensione .xlsm (macro enabled)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 12/02/18 00:35

Ciao Anthony

grandioso!!!!!!!! eccezionale!!!!!!

veramente non ho parole per ringraziarti. Sei stato così minuzioso e dettagliato che è un piacere leggere tutto. Ho imparato molto da questo thread e sono veramente onorato di essermi iscritto su questo forum.

Concordo appieno con te sul fatto che un'analisi del budget a fine mese sia comunque utile a prescindere. Pertanto modificherò il tutto in modo tale da avere entrambe i risultati: eventuale budget raggiunto prima e comunque budget totalizzato a fine mese.

La macro è spettacolare, è di una fluidità e velocità impercettibile.

Solo una cosa non mi riesce: l'automatismo della macro in caso di cambio del valore in colonna A o C. Pur avendo seguito tutti i passaggi, purtroppo la macro non si aggiorna (allego file):

http://www.filedropper.com/test3def

Premetto che va benissimo anche così, ci mancherebbe !!!! Era solo per capire dove ho sbagliato.

Grazie veramente
Belvel
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 13/02/18 00:32

Sono io che ti ho dato il codice bacato da mettere con la procedura di "Tasto dx"; ripeti la procedura e modifica la riga che ho marcato con !!!
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column = 1 Or Target.Column = 3 Then
        Application.EnableEvents = False
        Call CkBdg
        Application.EnableEvents = True        '     !!!
    End If
End If
End Sub

Poi salva il file, chiudi e riapri Excel, e riprova

Se vuoi mettere anche il riepilogo mensile, allora devi modificare, nel codice della Sub CkBdg, l'istruzione marcata !!!:
Codice: Seleziona tutto
For I = 2 To LastA
    If IsDate(Cells(I, 1)) Then
    curD = Cells(I, 1)
        If Month(curD) <> cM And cM <> 0 Then
            If RArr(cY, cM, 2) <> 2 Then                       '     !!!
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 14/02/18 16:38

spettacolare Anthony, va tutto alla grande !!!!!!!!

Grazie davvero :-)

Ne approfitto della tua cortesia per l'ultimissima cosa, la ciliegina sulla torta: come si fa a fare in modo che solo il riepilogo mensile sia messo dalla macro su una colonna diversa da quella dove invece viene analizzato il resto?

Ho provato a giocare con la macro modificando la variabile bFlag ma non riesco a far uscire il totale fine mese di ogni mese in una colonna diversa :-(

Grazie ancora
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 15/02/18 02:12

Con le modifiche nelle righe marcate +++ si scrivera' l'overbudget nella colonna dichiatata (F, nell'esempio) e il saldo di fine mese nella colonna adiacente (G, nell'esempio).
Nota che F:G vengono azzerate per un'altezza di 10 righe superiore alla lista dei dati.
Il codice:
Codice: Seleziona tutto
Sub CkBdg()
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
'
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("E2").Value   '<<< La cella col budget da verificare
'
Debug.Print Timer
LastA = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, bFlag).Resize(LastA + 10, 2).ClearContents             '+++ AZZERA 2 COLONNE
LY = Year(Application.WorksheetFunction.Min(Range("A:A")))
HY = Year(Application.WorksheetFunction.Max(Range("A:A")))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = 2 To LastA
    If IsDate(Cells(I, 1)) Then
    curD = Cells(I, 1)
        If Month(curD) <> cM And cM <> 0 Then
''            If RArr(cY, cM, 2) <> 1 Then                      '++++
                Cells(I - 1, bFlag).Offset(0, 1).Value = RArr(cY, cM, 1)    '+++
''            End If                                            '+++
        End If
        cM = Month(curD)
        cY = Year(curD)
        RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, 3).Value
        If RArr(cY, cM, 1) > BuMen And Cells(I, 1) <> Cells(I + 1, 1) Then
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I, bFlag).Value = RArr(cY, cM, 1)
                RArr(cY, cM, 2) = 1
            End If
        End If
    End If
Next I
End Sub


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 15/02/18 15:10

grazie Anthony, però così facendo non mi scrive più in colonna F il totale raggiunto a fine mese in caso di mancato raggiungimento del budget in quel mese.

Mi spiego: con la macro che per comodità riporto in calce, io ho che Excel mi dice in colonna F quando è che il budget viene raggiunto o superato senza scrivermi anche il totale di fine mese (e questo va bene perché era ciò che mi serviva).

Poi se invece il budget non viene raggiunto allora Excel mi scrive sempre in colonna F e in corrispondenza dell'ultimo giorno del mese in cui il budget non è stato raggiunto, cosa è stato totalizzato a fine di quel mese (e anche questo va bene).

In aggiunta a tali due analisi, io vorrei che in colonna G venisse poi riportato solo il totale di ogni fine mese in modo tale che però venga mantenuto anche in colonna F solo nel caso in cui in quel mese il budget non sia stato raggiunto.

Allego esempio:

http://www.filedropper.com/testfinale

dato un budget di spesa in E2 di 1400 Eur ho che in F17 il budget viene raggiunto e superato in data 14 Gennaio e poi in G32, come giusto che sia, io vorrei avere il totale di spesa di fine Gennaio.

Il mese dopo, Febbraio, siccome il budget non è raggiunto, allora io ho in F60 ciò che è stato raggiunto e vorrei avere anche in G60 il totale di fine mese di Febbraio.

Grazie ancora per la tua pazienza.


Codice: Seleziona tutto
Sub CkBdg()
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
'
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("E2").Value   '<<< La cella col budget da verificare
'
LastA = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, bFlag).Resize(LastA + 10, 1).ClearContents
LY = Year(Application.WorksheetFunction.Min(Range("A:A")))
HY = Year(Application.WorksheetFunction.Max(Range("A:A")))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = 2 To LastA
    If IsDate(Cells(I, 1)) Then
    curD = Cells(I, 1)
        If Month(curD) <> cM And cM <> 0 Then
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If
        End If
        cM = Month(curD)
        cY = Year(curD)
        RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, 3).Value
        If RArr(cY, cM, 1) > BuMen And Cells(I, 1) <> Cells(I + 1, 1) Then
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I, bFlag).Value = RArr(cY, cM, 1)
                RArr(cY, cM, 2) = 1
            End If
        End If
    End If
Next I
Beep
End Sub
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 15/02/18 23:46

Il comportamento che vedi era stata la mia scelta in assenza di chiare indicazioni.
Questa penultima versione della Sub CkBdg22 dovrebbe fare quello che chiedi:
Codice: Seleziona tutto
Sub CkBdg22()
'Overbudget in Col 1, mensile in colonna 2
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
'
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("E2").Value   '<<< La cella col budget da verificare
'
LastA = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, bFlag).Resize(LastA + 10, 2).ClearContents
LY = Year(Application.WorksheetFunction.Min(Range("A:A")))
HY = Year(Application.WorksheetFunction.Max(Range("A:A")))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = 2 To LastA
    If IsDate(Cells(I, 1)) Then
    curD = Cells(I, 1)
        If Month(curD) <> cM And cM <> 0 Then
            Cells(I - 1, bFlag).Offset(0, 1).Value = RArr(cY, cM, 1)
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If
        End If
        cM = Month(curD)
        cY = Year(curD)
        RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, 3).Value
        If RArr(cY, cM, 1) > BuMen And Cells(I, 1) <> Cells(I + 1, 1) Then
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I, bFlag).Value = RArr(cY, cM, 1)
                RArr(cY, cM, 2) = 1
            End If
        End If
    End If
Next I
Beep
End Sub

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 16/02/18 08:09

favoloso!!!!! è perfetta

Solo un ultimo ritocco e poi levo il disturbo, giuro :-).

Scusa se ti dico le cose in pillole, ma me ne rendo conto man mano che andiamo avanti.

Ho notato che se l'intervallo di date che io analizzo (colonna A) termina con una data che non sia l'ultimo giorno del mese, sia in colonna F (qualora ovviamente il budget non sia raggiunto, perchè se raggiunto il totale viene riportato correttamente) che in G non viene riportato il totale.

Il motivo è che la macro non trovando l'ultimo giorno del mese non scrive nulla.

Allego esempio:

http://www.filedropper.com/copiaditestfinale

Se guardi la riga A394, vediamo che termina con il 28 gen 2018. In tale mese il budget non è stato raggiunto, per cui la macro dovrebbe scrivere in F394 e in G394 il totale.

Se invece il budget viene raggiunto allora dovrebbe scrivere solo il G394.

Grazie
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 17/02/18 01:24

L'errore era piu' subdolo, legato al concetto di fine mese /fine lista.
La penultimissima versione:
Codice: Seleziona tutto
Sub CkBdg22B()
'Overbudget in Col 1, mensile in colonna 2
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
'
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("E2").Value   '<<< La cella col budget da verificare
'
LastA = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, bFlag).Resize(LastA + 10, 2).ClearContents
LY = Year(Application.WorksheetFunction.Min(Range("A:A")))
HY = Year(Application.WorksheetFunction.Max(Range("A:A")))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = 2 To LastA + 1
    If IsDate(Cells(I, 1)) Or I >= LastA Then
    curD = Cells(I, 1)
        If (Month(curD) & Year(curD)) <> (cM & cY) And cM <> 0 Then
'        Debug.Print I, cM, cY
            Cells(I - 1, bFlag).Offset(0, 1).Value = RArr(cY, cM, 1)
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If
        End If
        If I <= LastA Then
            cM = Month(curD)
            cY = Year(curD)
            RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, 3).Value
            If RArr(cY, cM, 1) > BuMen And Cells(I, 1) <> Cells(I + 1, 1) Then
                If RArr(cY, cM, 2) <> 1 Then
                    Cells(I, bFlag).Value = RArr(cY, cM, 1)
                    RArr(cY, cM, 2) = 1
                End If
            End If
        End If
    End If
Next I
Beep
End Sub

Le modifiche sono poche, ma sparse il diversi punti del listato.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aiuto su esame intervallo

Postdi Belvel » 17/02/18 17:23

grazie infinite Anthony ;) ora è perfetta.
Ne faccio tesoro per future applicazioni.
Continuo a seguirti e a seguire le discussioni del forum.
Saluti
Belvel
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Belvel » 29/09/18 16:09

Ciao Anthony

riprendo questa discussione per chiederti come va modificata la macro qui di seguito qualora io volessi spostare il tutto verso destra di una colonna.

Codice: Seleziona tutto
Sub CkBdg22B()
'Overbudget in Col 1, mensile in colonna 2
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
'
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("E2").Value   '<<< La cella col budget da verificare
'
LastA = Cells(Rows.Count, 1).End(xlUp).Row
Cells(2, bFlag).Resize(LastA + 10, 2).ClearContents
LY = Year(Application.WorksheetFunction.Min(Range("A:A")))
HY = Year(Application.WorksheetFunction.Max(Range("A:A")))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = 2 To LastA + 1
    If IsDate(Cells(I, 1)) Or I >= LastA Then
    curD = Cells(I, 1)
        If (Month(curD) & Year(curD)) <> (cM & cY) And cM <> 0 Then
'        Debug.Print I, cM, cY
            Cells(I - 1, bFlag).Offset(0, 1).Value = RArr(cY, cM, 1)
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If
        End If
        If I <= LastA Then
            cM = Month(curD)
            cY = Year(curD)
            RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, 3).Value
            If RArr(cY, cM, 1) > BuMen And Cells(I, 1) <> Cells(I + 1, 1) Then
                If RArr(cY, cM, 2) <> 1 Then
                    Cells(I, bFlag).Value = RArr(cY, cM, 1)
                    RArr(cY, cM, 2) = 1
                End If
            End If
        End If
    End If
Next I
Beep
End Sub


In pratica la macro, dato il budget in E2 e le spese in C analizza, facendo riferimento alle date presenti in A e B, quand'è che il budget E2 viene raggiunto scrivendolo in F. Mentre in G riporta quanto raggiunto comunque a fine mese.

Volendo quindi io aggiungere una colonna in A, sposterei tutto di una colonna per cui le date passerebbero in B e C, la spesa in D, il budget in F2 e infine la colonna dove scrive il budget dieventerebbe la G mentre la colonna di quello che viene raggiunto a fine mese diventerebbe la H.

Riallego il file originale con la macro funzionante:

http://www.filedropper.com/nuovotest

Grazie come sempre per la tua disponibilità.

Saluti
Belvel
Belvel
Utente Junior
 
Post: 53
Iscritto il: 08/02/18 18:47

Re: Aiuto su esame intervallo

Postdi Anthony47 » 01/10/18 21:52

Questa versione accetta (vedi righe marcate <<<) anche l'impostazione di quale sia la colonna delle date
Codice: Seleziona tutto
Sub CkBdg33B()
'Overbudget in Col 1, mensile in colonna 2
Dim WArr, RArr(), I As Long, cM As Integer, cY As Integer
Dim LY As Long, HY As Long, BuMen As Single, curD As Date
Dim bFlag As String, LastA As Long
Dim dFlag As String, dCol As Long, dRow As Long
'
dFlag = "A2"                '<<< La prima cella con le date; Modificare anche la Sub Worksheet_Change
bFlag = "F"                 '<<< La colonna in cui si marchera' l'OverBudg
BuMen = Range("G2").Value   '<<< La cella col budget da verificare
'
dCol = Range(dFlag).Column
dRow = Range(dFlag).Row
LastA = Cells(Rows.Count, dCol).End(xlUp).Row
Cells(dRow, bFlag).Resize(LastA + 10, 2).ClearContents
LY = Year(Application.WorksheetFunction.Min(Range(dFlag).Resize(LastA, 1)))
HY = Year(Application.WorksheetFunction.Max(Range(dFlag).Resize(LastA, 1)))
ReDim RArr(LY To HY, 1 To 12, 1 To 2)
'
For I = dRow To LastA + 1
    If IsDate(Cells(I, dCol)) Or I >= LastA Then
    curD = Cells(I, dCol)
        If (Month(curD) & Year(curD)) <> (cM & cY) And cM <> 0 Then
'        Debug.Print I, cM, cY
            Cells(I - 1, bFlag).Offset(0, 1).Value = RArr(cY, cM, 1)
            If RArr(cY, cM, 2) <> 1 Then
                Cells(I - 1, bFlag).Value = RArr(cY, cM, 1)
            End If
        End If
        If I <= LastA Then
            cM = Month(curD)
            cY = Year(curD)
            RArr(cY, cM, 1) = RArr(cY, cM, 1) + Cells(I, dCol + 2).Value
            If RArr(cY, cM, 1) > BuMen And Cells(I, dCol) <> Cells(I + 1, dCol) Then
                If RArr(cY, cM, 2) <> 1 Then
                    Cells(I, bFlag).Value = RArr(cY, cM, 1)
                    RArr(cY, cM, 2) = 1
                End If
            End If
        End If
    End If
Next I
Beep
End Sub

Volendo attivare la Sub CkBdg33B automaticamente al cambio dei dati, allora bisogna anche modificare la Sub Worksheet_Change
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
'Colonna con la data iniziale:
dCol = 1        '<<< 1=A; 2=B; 3=C; etc
If Target.Count = 1 Then
    If Target.Column = dCol Or Target.Column = dCol + 2 Or Target.Column = dCol + 4 Then
        Application.EnableEvents = False
        Call CkBdg33B
        Application.EnableEvents = True
    End If
End If
End Sub
Ovviamente le informazioni devono essere coerenti tra la Sub CkBdg33B e la Sub Worksheet_Change

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Aiuto su esame intervallo":

aiuto windows 10
Autore: mod360
Forum: Software Windows
Risposte: 1
aiuto installazione
Autore: mod360
Forum: Software Windows
Risposte: 3

Chi c’è in linea

Visitano il forum: Nessuno e 29 ospiti