› Excel e gli applicativi Microsoft Office › Macro per aggiungere più righe alla volta per più fogli (Excel)
-
AutoreArticoli
-
Buongiorno,
avrei bisogno di capire come posso fare ad aggiungere più righe alla volta e allo stesso momento per 2 fogli contemporaneamente. In entrambi i fogli ogni riga è composta da 3 righe. Nel senso che io per "aggiungere una riga" lo intendo come "aggiungere 3 righe". In allegato metto il file Excel che spiega bene (o almeno spero) cosa bisognerebbe fare.
Il file illustra la situazione iniziale e il risultato, che vorrei avere, di entrambi i fogli.
Di seguito inserisco anche il codice VBA che illustra quello che vorrei fare ed è proprio il risultato che vorrei avere, ma il fatto sta che, tenendo questo codice, dopo un tot. di attivazioni, il processo della macro rallenterà e a me serve che il processo resti costante. (In allegato anche il file con la macro sottostante)
Sub Inserire_riga() ' ' Inserire_riga Macro ' ' Scelta rapida da tastiera: CTRL+MAIUSC+I ' ActiveCell.Offset(-4, -1).Range("A1:I5").Select Selection.Copy ActiveCell.Offset(3, 0).Range("A1").Select ActiveSheet.Paste ActiveCell.Offset(2, 2).Range("A1:F1").Select Selection.ClearContents ActiveCell.Offset(1, -1).Range("A1").Select Sheets("Situazione iniziale Foglio2").Select ActiveCell.Offset(-3, -1).Range("A1:M3").Select Selection.Copy ActiveCell.Offset(3, 0).Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveCell.Offset(3, 0).Range("A1").Select Sheets("Situazione iniziale Foglio1").Select ActiveCell.Offset(1, 0).Range("A1").Select End SubGrazie in anticipo
Allegati:
You must be logged in to view attached files.Buongiorno a te!
A prescindere che questo quesito andrebbe posto nella sezione VBA e non Applicativi Office...
Detto questo, sicuramente la macro rallenterà a forza di aggiungere righe (fra l'altro quante realmente?)
Poi la tua macro la capisco poco...
Quali sono le condizioni di selezione e copia?
Anche guardando i files non è che si capisca molto!
Ti chiederei di essere più chiaro / esplicito
Ciao
Paolo
Scusa, non c'avevo fatto caso che c'era la sezione "VBA".
Questo file bisognerà utilizzarlo in un anno, di conseguenza il massimo di righe che si aggiungeranno saranno 1.500 (ognuna composta da 3 righe, quindi effettivamente vengono aggiunte 4.500 righe).
La selezione è riferita a tutta la "tabella" delle 3 righe, ogni 3 righe fanno una tabella (per dire) e quindi ogni tabella viene aggiunta sotto la terza riga di quest'ultima. Il codice dà la possibilità di copiare la tabella sopra la cella con scritto "MOUSE QUI" (mettere il mouse su quella cella), incollarla sotto quest'ultima tabella e poi "svuotare" le celle senza formule (che sono sempre le stesse, non hanno criteri e quindi non vanno in base alla tabella). Allo stesso momento vengono aggiunte anche le tre righe del foglio 2 che anch'esse possono essere definite tabella (ogni 3 righe), ma in questo caso viene applicato solo "incolla" (dopo aver copiato la tabella) dato che tutte le celle hanno una formula e non devono essere compilate manualmente
Come posso avere il consenso di postare la domanda su un altro forum?
Dipende da quello che c'è scritto nel regolamento dell'altro Forum.
Prova a contattare un moderatore e illustra la tua richiesta.
Non so se la richiesta è ancora in attesa di sviluppo...comunque ti giro una mia proposta e allego anche il file di esempio.
Tieni presente che non ho capito bene la tua richiesta infatti mi sono limitato a creare in modo diverso quello che fa la tua macro.
Ho notato che ci sono delle formule in alcune celle ma, ripeto, mi sono soffermato solo al tuo scopo finale. Per far ciò ho dovuto modificare un po' la struttura dei tuoi fogli. Ad esempio nel secondo foglio le colonne A e B non erano utilizzate. Per rendere il ciclo For Each funzionante ho fatto combaciare le tabelle create nei due fogli. Adesso entrambi iniziano dalla colonna B in poi.
Ho sfruttato la colonna A per verificare la presenza del nr. 1 messo di fianco al nome dell'operatore. Quel numero è importantissimo (non tanto il numero ma quanto la presenza di un valore in quella cella della colonna A perché in questo modo mi ricavo l'ultimo rigo compilato....da lì in poi vengono effettuati i dovuti calcoli per raggiungere il tuo obiettivo).
Prova a vedere se così va bene. Premi sul pulsante modulo "Copia e inserisci righe copiate" posto sul primo foglio
Option Explicit Sub CopiaIncollaRighe() Dim ws As Worksheet Dim iUltimaRiga As Long Dim rRigheCopiate As Range On Error Resume Next Application.ScreenUpdating = False For Each ws In ThisWorkbook.Worksheets ws.Activate iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 2), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 4, 1).Select Next ws Application.ScreenUpdating = True End SubAllegati:
You must be logged in to view attached files.On Error Resume Next
Il codice fa il suo lavoro ma la riga evidenziata, che impone di ignorare qualsiasi errore si verifichi, è potenzialmente pericolosa e mi sento di sconsigliarla a priori
Il codice funziona perfettamente, anche togliendo quello che evidenziava @vecchio frac. Grazie mille @alexps81. L'unica cosa è che non svuota le celle. Dovrebbe svuotare alcune celle del foglio1, del foglio2 invece bisogna lasciarlo così com'è. E se è possibile che, dopo il processo, rimanga sul primo foglio (questo codice fa si che dopo il processo rimanga sul secondo foglio). Per ogni terza riga bisogna cancellare il contenuto delle celle C, D, F, e H. Quindi, le prime 2 righe bisogna lasciarle così come sono, la terza invece bisognerebbe togliere le celle che ho elencato.
Adesso non sono davanti al pc e non posso verificare con esattezza. Ma il linea di massima per selezionare il foglio1 alla fine del ciclo basta che metti ws(1).Select dopo il Next ws.
Quello che ha detto Vecchio_Frac è giusto. Togli On Error Resume Next
Per la cancellazione delle celle, prova a dare uno sguardo al metodo ClearContents
In pratica dopo i due cicli che copiano le righe, ritorna nel foglio1 con ws(1).Select e da lì lanci il metodo ClearContents alle celle che ti interessano.
Prova a leggere il codice e capire come sfruttare le variabili rRigheCopiate e iUltimaRiga
Dunque ti giro un nuovo esempio. Se devi modificare le celle da cancellare basta che agisci nel codice in fondo. Dovresti arrivarci da solo.
Ti giro una nuova versione che più o meno è simile alla precedente ma il codice è leggermente diverso anche se poi il risultato è uguale
Allegati:
You must be logged in to view attached files.Scusate se rispondo adesso, ma ho avuto molto da fare al lavoro. @alexps81 grazie mille. Funziona benissimo. Avrei solo 3 domande:
1 - Io modificato il codice mettendo le celle che dovevo effettivamente cancellare e vorrei essere sicuro di aver scritto bene (ci sono 25 celle, per quello. E' giusto?
2 - C'è un problema, cioè che il secondo foglio, nel file originale, è l'ultimo foglio (il n. 7 per l'esattezza). Avrei dovuto specificarlo, ma non c'ho fatto caso. Me ne sono reso conto solo provando il codice. Come posso fare?
3 - Se le righe fossero 4 e non 3? (Scusate il cambio)
di seguito il codice:
Sub CopiaIncollaRighe() Dim ws As Worksheet Dim iUltimaRiga As Long Dim rRigheCopiate As Range Application.ScreenUpdating = False For Each ws In ThisWorkbook.Worksheets ws.Activate iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 2), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 4, 1).Select Next ws Application.ScreenUpdating = True Sheets(1).Select Range("C" & iUltimaRiga + 3 & ", D" & iUltimaRiga + 3 & _ ", E" & iUltimaRiga + 3 & ", F" & iUltimaRiga + 3 & ", G" & iUltimaRiga + 3 & _ ", H" & iUltimaRiga + 3 & ", I" & iUltimaRiga + 3 & ", J" & iUltimaRiga + 3 & _ ", K" & iUltimaRiga + 3 & ", L" & iUltimaRiga + 3 & ", M" & iUltimaRiga + 3 & _ ", N" & iUltimaRiga + 3 & ", O" & iUltimaRiga + 3 & ", P" & iUltimaRiga + 3 & _ ", R" & iUltimaRiga + 3 & ", S" & iUltimaRiga + 3 & ", T" & iUltimaRiga + 3 & _ ", U" & iUltimaRiga + 3 & ", V" & iUltimaRiga + 3 & ", W" & iUltimaRiga + 3 & _ ", X" & iUltimaRiga + 3 & ", Z" & iUltimaRiga + 3 & ", AA" & iUltimaRiga + 3 & _ ", AB" & iUltimaRiga + 3 & ", AC" & iUltimaRiga + 3).ClearContents End SubGrazie mille per l'aiuto
Buona serata
Spero di aver inteso bene tutto quello che hai richiesto
Leggi bene il commentato nel codice che devi fare delle piccole modifiche per adattarlo al tuo.
Ciao.
`Option Explicit Sub CopiaIncollaRighe() Dim iUltimaRiga As Long '-----a patto che i 2 fogli rispettano le stesse righe di partenza, altrimenti bisogna aggiungere un'altra variabile per il secondo foglio Dim rRigheCopiate As Range Dim iClear As Integer Dim i As Integer, x As Integer, y As Integer Application.ScreenUpdating = False '-----CopiaIncolla righe nel foglio7 Sheets("Situazione iniziale Foglio1").Activate '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 5, 1).Select '-----CopaiIncolla righe nel foglio7 Sheets("Situazione iniziale Foglio2").Activate '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 5, 1).Select '-----Seleziona il primo foglio (quello principale) Sheets("Situazione iniziale Foglio1").Select '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iClear = iUltimaRiga + 4 '---inizio cicli per la cancellazione nelle celle da C-P; R-X; Z-AC '---da C a P For i = 3 To 16 Cells(iClear, i).ClearContents Next i '---da R a X For x = 18 To 24 Cells(iClear, x).ClearContents Next x '---da Z a AC For y = 26 To 29 Cells(iClear, y).ClearContents Next y Application.ScreenUpdating = True End Sub `Buongiorno, ho provato, ma mi evidenzia questo debug: " Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga)) "
Option Explicit Sub CopiaIncollaRighe() Dim iUltimaRiga As Long '-----a patto che i 2 fogli rispettano le stesse righe di partenza, altrimenti bisogna aggiungere un'altra variabile per il secondo foglio Dim rRigheCopiate As Range Dim iClear As Integer Dim i As Integer, x As Integer, y As Integer Application.ScreenUpdating = False '-----CopiaIncolla righe nel foglio7 Sheets("Operatore").Activate '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 5, 1).Select '-----CopaiIncolla righe nel foglio7 Sheets("A.F._2").Activate '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga)) 'QUESTO E' il DEBUG CHE MI DA With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 5, 1).Select '-----Seleziona il primo foglio (quello principale) Sheets("Operatore").Select '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iClear = iUltimaRiga + 4 '---inizio cicli per la cancellazione nelle celle da C-P; R-X; Z-AC '---da C a P For i = 3 To 16 Cells(iClear, i).ClearContents Next i '---da R a X For x = 18 To 24 Cells(iClear, x).ClearContents Next x '---da Z a AC For y = 26 To 29 Cells(iClear, y).ClearContents Next y Application.ScreenUpdating = True End SubPer rispondere a quello che hai scritto nel codice " a patto che i 2 fogli rispettano le stesse righe di partenza, altrimenti bisogna aggiungere un'altra variabile per il secondo foglio " :
- Al dire il vero entrambi i fogli hanno 3 righe ed entrambi iniziano dalla stessa riga, ma volevo capire se era possibile far sì che il primo foglio avesse 4 righe e il secondo 3. In questo caso però forse è meglio lasciare 3 righe ad entrambi per non complicare le cose. Troverò una soluzione per non dover utilizzare la quarta riga.
ma mi evidenzia questo debug: " Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga)) "
Riporta anche l'errore che ricevi.
Probabilmente in colonna A non ci sono dati dopo la riga 3 e quindi fallisce in quanto iUltimaRiga meno 3 diventa zero o negativo e questo non piace a Excel 🙂In effetti la quarta riga ha la presenza di un valore solo nella colonna "P". In questo caso è meglio lasciare 3 righe. In questo caso come faccio? Al posto del "+5" devo mettere "+4"?
E' necessario che ci sia almeno un valore in colonna A dopo la terza riga.
Ho messo un valore nella colonna "A" e non mi da più errore, ma mi aggiunge solo le righe del foglio "A.F._2" (settimo foglio). Il primo foglio "Operatore" restano solo le tre righe originali, anche se sia la terza che la quarta riga hanno nella colonna "A" un valore
Vi allego la copia dell'originale (i fogli sono "Operatore" e "A.F._2") così è molto più chiaro come sono fatti i 2 fogli
Allegati:
You must be logged in to view attached files.4521
Allora ti rigiro una nuova versione.
Buongiorno, ho provato, ma mi evidenzia questo debug: " Set rRigheCopiate = Range(Rows(iUltimaRiga - 3), Rows(iUltimaRiga))
perché la colonna A dell'ultimo foglio (il settimo) è vuota (come dice infatti @Vecchio_Frac).
Ho messo un valore nella colonna "A" e non mi da più errore, ma mi aggiunge solo le righe del foglio "A.F._2" (settimo foglio). Il primo foglio "Operatore" restano solo le tre righe originali, anche se sia la terza che la quarta riga hanno nella colonna "A" un valore
nel primo foglio, al contrario del settimo, sono presenti delle Formule in colonna A dal rigo 4521 in poi. Perciò non copia e incolla nulla. Perché la variabile
iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Rowserve proprio a cercare la prima riga non vuota a partire dal basso verso l'alto del foglio elettronico. Se parte dalla fine e tornando su trova che nella cella A45xx c'è un valore o una formula, considera come ultima riga quella.
Comunque per far funzionare questo codice devi lasciare libera la colonna A di entrambi i fogli. Inserisci solo un valore a tuo piacere nella cella A6 per il primo foglio e nella cella A5 nel secondo foglio. Io per comodità gli ho messo il numero 1, ma tu puoi mettere quello che vuoi. Puoi anche nasconderla quella colonna o colorare i valori che metti di bianco così da non vederli...ma almeno in quelle due celle devi mettere qualcosa. Poi la Sub fa il resto anche per le righe inserire in seguito.
Per la cancellazione delle celle da C:P; R:X; Z:AC ho modificato il codice rispetto all'ultimo allegato. Ho avuto un suggerimento da @VF che non conoscevo ed ho utilizzato quello.
- Al dire il vero entrambi i fogli hanno 3 righe ed entrambi iniziano dalla stessa riga, ma volevo capire se era possibile far sì che il primo foglio avesse 4 righe e il secondo 3. In questo caso però forse è meglio lasciare 3 righe ad entrambi per non complicare le cose. Troverò una soluzione per non dover utilizzare la quarta riga.
se ho capito bene la richiesta...vedi se così funziona come vorresti.
Allegati:
You must be logged in to view attached files.Intanto vi ringrazio davvero tanto perchè mi avete aiutato tantissimo. Alla fine ho deciso di lasciare per entrambi 3 righe perchè mi sono accorto che, altrimenti, dovrei cambiare un po' di formule. Sono riuscito a metterci del mio, anche se poco, e cambiare il "+ 5 " con " + 4", il " + 4 " con il " + 3 " e in fine il " - 3 " con il " - 2 ". (Almeno a questo ci sono arrivato
(mi ci è voluto un po' per capirlo però)).PS: funziona alla perfezione. Grazie mille ancora e buona serata.
Option Explicit Sub CopiaIncollaRighe() Dim iUltimaRiga As Long '-----a patto che i 2 fogli rispettano le stesse righe di partenza, altrimenti bisogna aggiungere un'altra variabile per il secondo foglio Dim rRigheCopiate As Range Dim iClear As Integer Dim i As Integer, x As Integer, y As Integer Application.ScreenUpdating = False '-----CopiaIncolla righe nel foglio7 Sheets("Operatore").Activate '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 2), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 4, 1).Select '-----CopaiIncolla righe nel foglio7 Sheets("A.F._2").Activate '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iUltimaRiga = Range("A" & Rows.Count).End(xlUp).Row Set rRigheCopiate = Range(Rows(iUltimaRiga - 2), Rows(iUltimaRiga)) With rRigheCopiate.Select Selection.Copy Range("A" & iUltimaRiga + 1).PasteSpecial Application.CutCopyMode = False End With Cells(iUltimaRiga + 4, 1).Select '-----Seleziona il primo foglio (quello principale) Sheets("Operatore").Select '<<<<<-----inserisci il nome esatto del foglio tra le virgolette (e poi non cambiarlo più!) iClear = iUltimaRiga + 3 '---inizio cicli per la cancellazione nelle celle da C-P; R-X; Z-AC '---da C a P For i = 3 To 16 Cells(iClear, i).ClearContents Next i '---da R a X For x = 18 To 24 Cells(iClear, x).ClearContents Next x '---da Z a AC For y = 26 To 29 Cells(iClear, y).ClearContents Next y Application.ScreenUpdating = True End SubÈ un peccato se ti devi adeguate e non sfruttare le potenzialità del codice. Se ti interessa avere 4 righe su un foglio e 3 su un altro, perché non lavorarci su? Se nom è una cosa complessa gira pure le richieste che vorresti ottenere nelle varie celle e vediamo cosa si può fare.
Grazie mille, non volevo chiedere più del necessario dato che vi ho già fatto tribullare tanto 😅, ma accetto l'aiuto. Grazie mille.
Provo a spiegare esattamente cosa vorrei che succedesse.
- Per il settimo foglio (A.F._2) le righe rimangono tre, ma per il primo foglio (Operatore) le righe sono quattro, ma non esattamente quattro, nel senso che la quarta riga ha solo una cella compilata (la cella della colonna "P" se non sbaglio).
- Io non voglio che ogni volta che si copia e si incolla io abbia 4 righe alla volta, ma:
- Copio le 4 righe, ma quando vado ad incollare queste 4 righe, non le incollo partendo dalla riga sotto (la quinta), ma sempre dalla quarta. Questo perché la quarta riga serve solamente per la riga soprastante e non per ogni riga.
- Di conseguenza quando si attiva la macro, si copiano le ultime quattro righe e se ne incollano, sempre 4, ma utilizzando la quarta riga.
Provo a fare l'esempio:
A. B. C. D. E. F.
1 GH. HD. DJ. DJ. HD. JE
2 YT. YU. UEI. HSJ. JDU. JDI
3 HD. DJ. JD. JDJ. JE. HD
4 JD
5
6
7
8
Come vedete, in questo caso, solamente la cella della colonna "C" ha un valore per la quarta riga. Di seguito quello che dovrebbe succedere dopo che si aggiunge la riga:
1 GH. HD. DJ. DJ. HD. JE
2 YT. YU. UEI. HSJ. JDU. JDI
3 HD. DJ. JD. JDJ. JE. HD
4 GH. HD. DJ. DJ. HD. JE
5 YT. YU. UEI. HSJ. JDU. JDI
6 HD. DJ. JD. JDJ. JE. HD
7 JD
8
Come vedete le righe vengono incollate partendo dalla quarta riga, sovrapponendo il valore della cella "C" che poi verrà messo, in questo caso, nella settima riga essendo che l'opzione "incolla" viene applicata dalla quarta riga.
Spero di essermi spiegato (sono dal telefono in questo momento e non sono riuscito a dare un esempio migliore di questo.
Grazie mille
Sto cercando di capirci qualcosa ma faccio fatica. Ma per caso tu vuoi che nel foglio Operatore il quarto rigo iniziale scende sempre ogni volta che si copiano e incollano nuove righe? Cioè Copiamo le prime tre righe e le incolliamo inserendole dalla quarta in poi facendo scalare quella che era la quarta in settima posizione? E così via per i prossimi CopiaIncolla?
Prova questa nuova versione e vedi se fa quello che vuoi.
Allegati:
You must be logged in to view attached files.Buongiorno @alexps81
E' giusto con una sola eccezione: la cella della quarta riga, come formula, tiene conto ancora della prima riga e non dell'ultima (tiene conto della prima selezione di 3 righe e non dell'ultima selezione di 3 righe), ma a me serve che tenga conto dell'ultima riga aggiunta.
Spero di essermi spiegato, nel caso provo a fare un esempio
la cella della quarta riga, come formula, tiene conto ancora della prima riga e non dell'ultima
Si si quello lo immaginavo già. Il mio esempio era solo per capire se il risultato del CopiaIncolla doveva essere così. Può essere che basti cambiare il riferimento delle celle da Assoluto a Relativo (togliere il simbolo $ prima del numero del rigo per interni). Cmq appena posso gli do uno sguardo.
Se per caso riesci a caricare un nuovo allegato originale (ma senza dati sensibili) come esempio è meglio, così abbiamo uno scenario reale con tutte le formule funzionanti. Quello che ho io ha perso tutti i riferimenti avendo effettuato tutti i CopiaIncolla di prova.
Magari si può ragionare a far lavorare solo il codice senza usare le formule.
-
AutoreArticoli
