› Sviluppare funzionalita su Microsoft Office con VBA › Confronto fra data inizio di due celle e loop con data fine.
-
AutoreArticoli
-
Buon giorno
Ho un problema che non riesco a risolvere e ci stò ragionando parecchio su come aggirare il problema ma attualmente non mi viene nulla in mente.
Ho un foglio che fà da scheda dipendente, questo foglio si compone da A8 a A38 in formato data di un mese.
La colonna che và da D8 a D38 potrebbe avere un valore "TT".
Sullo stesso foglio, vi sono anche le colonne AA(id utente), AB(data inizio dove solitamente si trova TT), AC (data fine).
In pratica stò cercando una macro che prende la cella su AB1, la confronta con quelle su A8 e A38 e trovando la data faccia un Loop di TT dalla data di inizio fino alla data di fine.
Una volta finito il ciclo, passa a AB2 se non è vuoto.
Non sò se mi sono spiegato bene e mi scuso in anticipo se non lo fosse, allego pure un foglio excel di esempio dove su foglio "1" trovate un foglio già compilato per come voglio che questi sia, e su foglio 2 e tre ci sono le pagine per provare la macro.
Vi ringrazio in anticipo, se potete aiutarmi anche solo con delle indicazioni.
e trovando la data faccia un Loop di TT dalla data di inizio fino alla data di fine.
Io capisco questo: a partire dalla data indicata in AB e fino alla data indicata in AC (stessa riga ovviamente, per esempio la 1 e poi a seguire le successive), inserire nello specchietto mensile la voce "TT" nella colonna D della causale.
Secondo me non serve nemmeno inventare chissa' che per cercare la data iniziale, dal momento che il mensile parte sempre a riga 8 e quindi la data indicata in AB si trova nella riga di A data da 8+(giorno - 1). La data finale si trova alla riga data da 8+(giorno-1) + (< differenza in giorni tra data iniziale e data finale >).
Cosi' per esempio se la data cercata e' il 9 maggio (esempio in AB del foglio 1), la riga in cui si trova il 9 maggio e' la numero 16, e la riga della data finale (indicata in AC cioe' 12 maggio) e' 16 + 3 = 19.
Quindi una semplice istruzione come
Range(Cells(rigainiziale, "D"), Cells(rigafinale, "D")).Value = "TT"risolve il problema.Prova quindi a stendere il ciclo For che scandisce il range in AA (ricordati che esiste il comodo range definito da CurrentRegion senza impazzire a calcolare la profondita' del range da scandire) e che preleva i due valori di data iniziale e data finale per costruire riga iniziale e riga finale.
che versione hai per favore
oppure tutte le date con la TT
Io ho inteso che lui vuole riempire l'intervallo tra le due date con la sigla TT.
ciao
vecchio
ho capito vuole le sequenze di TT
inizio e fine
Grazie vecchio frac, quindi tu mi parli di fare la differenza fra data iniziale e data finale ed effettuare un conta con il ciclo for ?
Ciao gianfranco55 e grazie anche a te, io voglio che sulla colonna D8:D38 venga effettuato un ciclo che restituisce un valore chiamato TT fra data inizio e data fine che si trovano indicate rispettivamente sulla cella AB e AC.
Io attualmente riesco a trovare solo la data inizio, come puoi vedere dal foglio N.2, ma mi manca il ciclo fino alla fata fine.
La mia versione è office 2016.
Dal tuo post vedo che non ho capito bene cosa vuoi fare. Il mio "fare la differenza tra le due date" era semplicemente per ottenere le righe del foglio dove si trovano le date (iniziale e finale) dello specchietto in AB e AC.
Tu stai dicendo che inserisci manualmente il codice TT e vuoi ricavare le date in cui questi codici compaiono. Aveva ragione Gianfranco quindi, che purtroppo ha modificato il suo post 🙂
ciao
vecchio
con il 2016 meglio una macro comunque poi vedo con le formule
In pratica stò cercando una macro che prende la cella su AB1, la confronta con quelle su A8 e A38 e trovando la data faccia un Loop di TT dalla data di inizio fino alla data di fine.
E' qui che non si capisce bene. Trovare la data indicata da AB1 e' facile (si trova alla riga 8 + giorno della data). Ma poi cosa vuol dire "fare un Loop di TT" ?
voglio che sulla colonna D8:D38 venga effettuato un ciclo che restituisce un valore chiamato TT fra data inizio e data fine che si trovano indicate rispettivamente sulla cella AB e AC
Cosa significa "restituire un valore chiamato TT" fra due date ?
con il 2016 meglio una macro comunque poi vedo con le formule
E' meglio una macro sempre
il problema e' che io non ho capito proprio niente, temo
ciao
hai un inizio e una fine TT in data 2
poi hai un inizio in data 9 e una fine in data 12
ecco le date
02/01/1900-------02/01/1900
09/01/1900-------12/01/1900
in pratica inizio e fine delle frequenze
Ragazzi mi spiego malissimo io, a volte cerco di spiegare meglio mettendo più dettagli di quanto servono
.C'è la data sulla riga AB1 e AC1 che sono data inizio e data fine. Queste devono essere data inizio e data fine di un ciclo che mi scrive il valore TT sulla colonna D8:D38.
Esempio...se data inizio (AB1) e il 09/05/24 e data fine (AC1) 13/05/2024.
Allora il ciclo scrive su D16,D17,D18,D19,D20 il valore "TT".
Finito il ciclo si passa a vedere se la cella AB2 è compilata, se è vuota il ciclo termina.
Ti ho portato io fuori strada vecchio frac con la questione che avevo già il valore TT, in effetti me lo sono calcolato con una formula INDICE/CONFRONTA ma se una macro può fare tutto quello scritto sopra, tolgo la formula e faccio fare tutto alla macro.
ecco le date
02/01/1900-------02/01/1900
09/01/1900-------12/01/1900
in pratica inizio e fine delle frequenze
Precisamente Gianfranco55
ciao
ho usato formule vintage e una colonna d'appoggio
in N8 da trascinare in basso
=SE(E(D7<>"TT";D8="TT");MAX($N$7:N7)+1;SE(O(E(D8="TT";D9="TT");E(D8="TT";D9<>"TT"));N7;""))
in P8
=SE(Q8<>"";$F$5;"")
In Q8 matriciale ctrl maiuscolo invio
=SE.ERRORE(PICCOLO(SE(BRMGFR70S28G273Q[Colonna7]=RIF.RIGA(A1);BRMGFR70S28G273Q[GIORNO];"");1);"")
in R8 sempre matriciale
=SE.ERRORE(GRANDE(SE(BRMGFR70S28G273Q[Colonna7]=RIF.RIGA(A1);BRMGFR70S28G273Q[GIORNO];"");1);"")
Allegati:
You must be logged in to view attached files.Julius ha scritto:
Queste devono essere data inizio e data fine di un ciclo che mi scrive il valore TT sulla colonna D8:D38.
e anche
ma se una macro può fare tutto quello scritto sopra, tolgo la formula e faccio fare tutto alla macro.
Allora avevo capito bene io all'inizio.
La macro puo' farlo e in modo semplice.
Se accetti le formule vintage di Gianfranco ok, ma se ti interessa una soluzione VBA ecco qui la mia proposta:
Option Explicit Sub causaleTT() Dim ce As Range Dim i As Integer Dim j As Integer Dim rng As Range Set rng = ActiveSheet.Range("AA1").CurrentRegion For Each ce In rng.Rows i = Day(ce.Cells(2)) + 8 - 1 'riga della data iniziale j = i + (ce.Cells(3) - ce.Cells(2)) 'riga della data finale Range(Cells(i, "D"), Cells(j, "D")).Value = "TT" Next End SubDa richiamare come vuoi sul foglio attivo (come vuoi = da pulsante, o lancio diretto, o da associare a un Change ecectera)
ciao vecchio
meglio la macro
io ho capito il contrario cioè estrapolare le date o sbaglio?
le formule spero ti siano servite a capire il meccanismo
Non proprio completamente. Ma io sono io che sono negato fin dai tempi del Fred di Framework III.
A cosa serve il tuo codice fiscale nelle formule matriciali in Q e R? A parte ovviamente farci sapere la tua data di nascita?
ciao
il codice fiscale non è mio è il nome della tabella
ma alla fine bisogna mettere le T in colonna D o estrapolare le date
mi sono perso
=SE(O(A8=MEDIANA(A8;$AA$1;$AB$1);A8=MEDIANA(A8;$AA$2;$AB$2));"TT";0)
ma alla fine bisogna mettere le T in colonna D o estrapolare le date
mi sono perso
Anch'io credo. Mi sembra di aver capito che bisogna mettere le TT tra la data iniziale e quella finale specificata in AB-AC.
Ragazzi siete miracolosi, ho provato entrambe le tecniche, sia le macro che le formule, entrambe danno il risultato sperato.
La formula è perfetta fà quello che viene chiesto, la macro anche questa elabora benissimo, però nella scheda dipendente dove NON c'è niente, la N.3 ad esempio (quindi niente su AB e AC), mi scrive il 28 TT.
Provo a mettere
if range("AB1")<>"" then 'MACRO DI VECCHIO FRAC else exit Sub end ifRagazzi perfetto funziona benissimo, siete stati immensi, grazie grazie grazie, ora posso integrare la macro al mio progetto!!!
Grazie Vecchio e Grazie Giò
Riporto di nuovo tutta la formula per aiutare gli altri utenti che incapperanno nel problema
Sub causaleTT() Dim ce As Range Dim i As Integer Dim j As Integer Dim rng As Range If Range("AB1") <> "" Then Set rng = ActiveSheet.Range("AA1").CurrentRegion For Each ce In rng.Rows i = Day(ce.Cells(2)) + 8 - 1 'riga della data iniziale j = i + (ce.Cells(3) - ce.Cells(2)) 'riga della data finale Range(Cells(i, "D"), Cells(j, "D")).Value = "TT" Next Else Exit Sub End If End Sub -
AutoreArticoli
