|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, eccomi con un'altra bella gatta da pelare (modo di dire che non mi piace assolutamente, ma che purtroppo esiste e rende l'idea...) che riguarda le mie tabelle... ormai potrei essere definito "l'uomo delle tabelle" ahahahah... Devo confrontare due tabelle procedenti dal basso verso l'alto (dai dati più recenti, in alto, ai dati più vecchi, in basso, che riguardano una situazione storica di un magazzino per ottimizzare le forniture di componenti) e nomino tabella1 di 5 colonne da col.C a col.G e tabella2 di 12 colonne da col.H a col.S, con i seguenti criteri e modalità di paragone tra le due tabelle: confrontare i dati di una riga di tabella2 con i dati di tabella 1 che vanno dalla stessa riga fino alle 10 righe immediatamente superiori a quella in esame (totale 11 righe, per intenderci...), segnalando in tabella2 la compresenza in tabella1, in una o più delle 10 righe "precedenti" (in realtà sono cronologicamente successive, ma le tabelle procedono a mo' di gambero), di 2, 3 o più componenti. Ecco un piccolo esempio pratico: -riga 5 : in tabella2 abbiamo il componente cod.89 segnalato in carico in tabella1 in riga 3 -riga 6 : in tabella2 abbiamo il componente cod.69 segnalato in carico in tabella1 in riga 5 -riga 7 : in tabella2 abbiamo i componenti 5 e 79 segnalati in carico in tabella1 rispettivamente in riga 2-6 e i componenti cod.1-69 compresenti in riga 5 di tabella1 -riga 8 : in tabella2 abbiamo i componenti cod.32-79 compresenti in riga 6 di tabella1 -riga 9 : in tabella2 abbiamo i componenti cod.20 e 75 segnalati in carico in tabella1 rispettivamente in riga 8-4 -riga 10: in tabella2 abbiamo il componente cod.35 segnalato in carico in tabella1 in riga 9 e i componenti cod.59-176 compresenti in riga 4 di tabella1 -riga 11: in tabella2 abbiamo i componenti cod.14-190 compresenti in riga 7 di tabella1 -riga 12: in tabella2 abbiamo i componenti cod.39 e 73 segnalati in carico in tabella1 rispettivamente in riga 2-11- e i componenti cod.20-58 e 34-79 compresenti rispettivamente in riga 8 e 6 di tabella1 -riga 13: in tabella2 abbiamo il componente cod.88 segnalato in carico in tabella1 in riga 4 e i componenti cod.61-183 compresenti in riga 8 di tabella1 -riga 14: in tabella2 abbiamo i componenti cod.32 e 51 e 183 e 190 segnalati in carico in tabella1 rispettivamente in riga 6-11-8-7 e i componenti cod.35-163 e 54-167 compresenti rispettivamente in riga 9 e 12 di tabella1 -riga 15: in tabella2 abbiamo i componenti cod.9 e 32 e 54 segnalati in carico in magazzino (vedi tabella1) rispettivamente in riga 13-6-12 e i componenti cod.114-163 compresenti in riga 9 di tabella1 Il lavoro può essere svolto da una macro che, posizionando il cursore ad esempio in B15, mi confronti i dati di tabella2, riga 15, con in dati di tabella1 range C15:G5 trovando i componenti presenti singolarmente nel range di tabella1 bordandone le relative celle in riga 15 di tabella2; i componenti compresenti in ogni singola riga del range di tabella1 colorando in modo appropriato, come dall'esempio, le relative celle di riga 15 in tabella2. Io sono sicuramente ancora mo-o-o-o-o-o-lto acerbo per riuscire a dare un'istruzione di così altissimo livello... :)) Grazie infinite e buona giornata eZio Nota: l'operazione svolta in modo "manuale" è abbastanza laboriosa e le probabilità di errore sono piuttosto elevate... Benedette siano le macro, ma sopra tutto benedetti siano coloro che le sanno scrivere... Ogni riferimento "ad personam" è puramente caUsale :))) EDIT:Premetto che sono solo uno di buona volontà... e quindi mi mancano tutte le nozioni che invece mi piacerebbe tanto conoscere...... :(( ho risolto il mio problema mo-o-o-o-o-lto empiricamente, il tutto con questa serie di "pasticci"-"posticci"... che nulla hanno a che vedere con l'eccellente pulizia del linguaggio e della sintassi del VBA: - La macro risolutiva Sub processa_TUTTO() Application.Run "confronta1" Application.Run "confronta2" Application.Run "confronta3" Application.Run "confronta4" Application.Run "confronta5" Application.Run "confronta6" Application.Run "confronta7" Application.Run "confronta8" Application.Run "confronta9" Application.Run "confronta10" Columns("T:BQ").ClearContents ActiveCell.Offset(-1, 0).Range("A1").Select End Sub - La 1^ macro che gira: Sub confronta1() Application.ScreenUpdating = False Dim colonna As Integer N = ActiveCell.Row colonna = 20 Set area2 = Range(Cells(N, 8), Cells(N, 19)) Set area1 = Range(Cells(N - 1, 3), Cells(N - 1, 7)) For Each cl In area1 For Each cl2 In area2 If cl = cl2 Then With cl2 .Interior.ColorIndex = 39 End With Cells(N, colonna).Value = cl.Value colonna = colonna + 1 End If Next cl2 Next cl Set area = Nothing Set area2 = Nothing Application.ScreenUpdating = True End Sub - Adattando i parametri di individuazione dell'area di lavoro ci sono in tutto 10 macro e l'ultima macro che gira è: Sub confronta10() Application.ScreenUpdating = False Dim colonna As Integer N = ActiveCell.Row colonna = 65 Set area2 = Range(Cells(N, 8), Cells(N, 19)) Set area1 = Range(Cells(N - 10, 3), Cells(N - 10, 7)) For Each cl In area1 For Each cl2 In area2 If cl = cl2 Then With cl2 .Interior.ColorIndex = 48 End With Cells(N, colonna).Value = cl.Value colonna = colonna + 1 End If Next cl2 Next cl Set area = Nothing Set area2 = Nothing Application.ScreenUpdating = True End Sub Il problema è risolto, ma mi piacerebbe moltissimo conoscere la sintassi "accademica" per questa macro...... :)))))))) Grazie infinite
|
|
|
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve concettualmente ottieni il risultato voluto, ma devi cercare di concentrare l'esecuzione del codice. a che ti serve eseguire 10 macro quando puoi definire con certezza l'area di lavoro? vedi come semplificare: Sub confronta11() Dim cl, cl2 As Variant riga = ActiveCell.Row If riga <= 11 Then MsgBox ("Numero Riga selezionata errata") Exit Sub End If Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 11, 3), Cells(riga, 7)) For Each cl In area For Each cl2 In area2 If cl.Value = cl2.Value Then cl2.Interior.ColorIndex = 3 End If Next Next Set area = Nothing Set area2 = Nothing End Sub Con questa istruzione: Set area2 = Range(Cells(riga - 11, 3), Cells(riga, 7)) le tue 10 macro non servono più. saluti Giap PS. a che ti serve questa istruzione: Cells(N, colonna).Value = cl.Value ??
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto: concettualmente ottieni il risultato voluto, ma devi cercare di concentrare l'esecuzione del codice. a che ti serve eseguire 10 macro quando puoi definire con certezza l'area di lavoro?
Hai ragione, ed è proprio la consapevolezza di questo mio immenso limite di conoscenza dell'esatta sintassi dei codici che mi fa dispiacere... Perché so per certo che esiste una serie di codici, scritta in modo molto sintetico e preciso, che fa svolgere il lavoro molto meglio di tutto quel poema prolisso e patetico che ho scritto sopra... Un pò come se un amante anziché dire alll'amata in modo appassionato ed inequivocabile "ti amo" iniziasse la sua dichiarazione d'Amore con "Adamo ed Eva, Caino e Abele...etc." ahahahaha... :))) La mia immensa fortuna, in quest'avventura fatta di tabelle, tabelle e ancora tabelle, è che so per certo di avere al mio fianco un eccellente Mentore che, con altrettanta passione, mi guida ... a10n11 ha scritto:PS. a che ti serve questa istruzione: Cells(N, colonna).Value = cl.Value ?? ...non l'ho cancellata durante le operazioni di "pasticci-posticci" !! :))))) Ma... tecnicamente... quell'istruzione esattamente che ordine impartisce? Grazie infinite e buona giornata, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve Commenta: ...non l'ho cancellata durante le operazioni di "pasticci-posticci" !! :))))) Ma... tecnicamente... quell'istruzione esattamente che ordine impartisce?
l'istruzione, non fa altro che riscriverti la riga di tabella 1 a partire da colonna 65 saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto:l'istruzione, non fa altro che riscriverti la riga di tabella 1 a partire da colonna 65 Quindi anche le istruzioni che ho evidenziato in rosso, legate a quell'istruzione, andrebbero eliminate...? Scusami... ma sto imparando passo-passo e la materia è "esatta" e non ammette lavori a spanne :))) Sub confronta() Dim colonna As Integer N = ActiveCell.Row colonna = 20Set area2 = Range(Cells(N, 8), Cells(N, 19)) Set area1 = Range(Cells(N - 1, 3), Cells(N - 1, 7)) For Each cl In area1 For Each cl2 In area2 If cl = cl2 Then With cl2 .Interior.ColorIndex = 39 End With Cells(N, colonna).Value = cl.Value colonna = colonna + 1End If Next cl2 Next cl Set area = Nothing Set area2 = Nothing End Sub Grazie e buona serata, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve tutte le istruzioni che hai segnato in rosso sono tra loro dipendenti, quindi vanno tolte tutte. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, Come già sai, questa Materia mi piace tantissimo, ma purtroppo- e qui il detto "chi ha il pane non ha denti" mi calza a pennello :)))- non ho nozioni sufficienti che mi permettano di godermela appieno... per cui ti prego di scusarmi per la mia particolare pedanza e vedimi come un bambino curioso e affascinato ... d'altronde se il cervello, anche se piccolo, gira.......... gira!! ahahahahahahahahahahahaha Nelle istruzioni viste sopra qual'è l'esatto significato di: - Dim colonna As Integer- in Cells(N, colonna).Value = cl.Value (che abbiamo visto riscrive la riga di tabella 1 a partire da colonna 65) colonna = colonna + 1 cosa significa 'colonna = colonna + 1' ?? ... - Dim cl, cl2 As Variant- End If Next Next ("finisci se"... poi subito 2 volte di seguito "Next"...??) Set area = Nothing Set area2 = Nothing (... ma... nelle righe della macro, appena sopra, avevi settato le aree... perché poi glielo fai ignorare??) ... Nella breve macro confronta 11 vista sopra hai risolto alla grande in un colpo solo il problema delle 10 macro ( Gulp!!)... sto cercando di adattare la tua splendida creatura affiché colori in cl nella sola riga della cella attiva, anziché in cl2 in tutte le righe dell'area2, i codici presenti e compresenti per ciascuna delle righe di cl2 da -1 a -10 con colori diversi da riga a riga (anziché colorare tutto con un solo colore... nella macro è il ColorIndex = 3, Rosso)... ma molto goffamente e con grande impaccio (incarnando in tal modo "IL" personaggio nato dalla penna del geniale Paolo Villaggio) non riesco proprio a farlo.... :))) Quali istruzioni corrette vanno inserite nella macro oltre ovviamente alla sostituzione, nell'istruzione cl2.Interior.ColorIndex = 3, di cl al posto di cl2 ? Grazie assai e buona giornata, eZiop.s. Hai un testo da consigliarmi per imparare a navigare in questo oceano? Ho un libro di Gianni Ciaccaglini, Excel e Office VBA, della "Ulrico (Editore di cui ometto il cognome ché tanto sicuramente sai di chi si tratta... non vorrei fare pubblicità indebita...) ma ti confesso che sto imparando assai più dalle tue brevi, ma dettagliate, spiegazioni che da quel tomo, sì teorico... sicuramente ben scritto e molto interessante, ma ...ehm!!... per me poco "concreto" e pratico....... .
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve Partendo da questa macro: Sub confronta11() Dim cl as Variant, cl2 As Variant riga = ActiveCell.Row If riga <= 11 Then MsgBox ("Numero Riga selezionata errata") Exit Sub End If Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 11, 3), Cells(riga, 7)) For Each cl In area For Each cl2 In area2 If cl.Value = cl2.Value Then cl2.Interior.ColorIndex = 3 End If Next Next Set area = Nothing Set area2 = Nothing End Sub
L'istruzione "Dim" dichiara il nome della variabile utilizzata nella macro e ne identifica le sue caratteristiche. nel nostro caso CL e CL2 sono definite come "Variant" e possono quindi essere di tipo ,numerico,stringa,data ecc. Nel caso di "Dim Colonna as Integer" viene definita la variabile come numero intero fino a 32767 quindi sarebbe meglio definirlo come"Dim Colonna as Long" che assume un valore numerico intero fino a 2.147.483.647. Veniamo ai cicli For Abbiamo definito due aree "area" - "area2" si vuole processare ogni record di "area" per tutti gli elementi di "area2" quindi con" For Each cl In area" si inizia a ciclare la tabella "Area" partendo dal primo valore che viene confrontato con il primo valore di tabella "area2" con "For Each cl2 In area2" La prima istruzione "Next" che sarebbe meglio scriverla "Next cl2" serve per scorrere tutti gli elementi di "Area2" Passati tutti gli elementi di "Area2", la seconda istruzione "Next" (meglio definirla "Next cl") analizza il record successivo di tabella "area" che viene a sua volta confrontato con tutti gli elementi di " Area2" così fino alla fine della tabella. Alla fine della macro, è buona cosa scaricare dalla memoria i riferimenti assegnati alle variabili che non sono più necessarie. quindi non essendo più necessarie le due variabili, vengono scaricate .Set area = Nothing Set area2 = Nothing. per quanto riguarda il colore delle righe della tabella Area (sperando di aver capito la domanda), qui sotto la modifica della macro(per quanto riguarda i colori se non ti piacciono, devi intervenire nell'assegnazione del valore di partenza della variabile "colore") Sub confronta11() Dim cl As Variant, cl2 As Variant riga = ActiveCell.Row Uprow = riga - 11 If riga <= 11 Then MsgBox ("Numero Riga selezionata errata") Exit Sub End If colore = 3 Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 11, 3), Cells(riga, 7)) For Each cl In area Range(Cells(Uprow, 8), Cells(Uprow, 19)).Interior.ColorIndex = colore For Each cl2 In area2 If cl.Value = cl2.Value Then cl2.Interior.ColorIndex = 3 End If Next cl2 colore = colore + 1 Uprow = Uprow + 1 Next cl Set area = Nothing Set area2 = Nothing End Sub Commenta: p.s. Hai un testo da consigliarmi per imparare a navigare in questo oceano? Ho un libro di Gianni Ciaccaglini, Excel e Office VBA, della "Ulrico
Il testo della Hoepli (non credo che ci possano accusare di pratiche scorrette indicando l'editore) che non conosco ma conoscendo l'autore (una visita al suo blog non fa male), presumo sia una buona base di apprendimento. Il consiglio che posso darti, è quello di leggere i manuali non saltando da un capitolo all'altro ma con buona pazienza iniziare dalla prima pagina e continuare fino all'ultima anche se certi argomenti si presume di conoscerli. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, l'ultima macro, con cella attiva B61, fa questo, A me servirebbe una macro che, per cella attiva B59, faccia questo Le celle colorate di riga 60 e 61 non'entrano, erano già state colorate dai processi precedenti... In poche parole, con cella attiva B59 (che cambierà di volta in volta a seconda della riga della tabella che devo processare, rimarrà però sempre in co.B) lanciando la macro... nel range H59:S59 (tabella2... riga che devo processare) vengono evidenziati con colori diversi, a seconda delle righe di appartenenza, i rispettivi codici presenti o compresenti nel range C49:G58 (tabella1... righe da -1 a -10 rispetto alla riga che devo processare) Nella mia immensa ignoranza della Materia, ho preparato una macro come questa: Sub confronta_10() Application.Run "confronta10" Dim cl, cl2 As Variant riga = ActiveCell.Row If riga <= 10 Then MsgBox ("Numero Riga selezionata errata") Exit Sub End If Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area1 = Range(Cells(riga - 1, 3), Cells(riga - 1, 7)) Set area2 = Range(Cells(riga - 2, 3), Cells(riga - 2, 7)) Set area3 = Range(Cells(riga - 3, 3), Cells(riga - 3, 7)) Set area4 = Range(Cells(riga - 4, 3), Cells(riga - 4, 7)) Set area5 = Range(Cells(riga - 5, 3), Cells(riga - 5, 7)) Set area6 = Range(Cells(riga - 6, 3), Cells(riga - 6, 7)) Set area7 = Range(Cells(riga - 7, 3), Cells(riga - 7, 7)) Set area8 = Range(Cells(riga - 8, 3), Cells(riga - 8, 7)) Set area9 = Range(Cells(riga - 9, 3), Cells(riga - 9, 7)) Set area10 = Range(Cells(riga - 10, 3), Cells(riga - 10, 7)) For Each cl In area For Each cl2 In area1 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 3 End If Next Next For Each cl In area For Each cl2 In area2 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 4 End If Next Next For Each cl In area For Each cl2 In area3 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 5 End If Next Next For Each cl In area For Each cl2 In area4 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 6 End If Next Next For Each cl In area For Each cl2 In area5 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 7 End If Next Next For Each cl In area For Each cl2 In area6 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 8 End If Next Next For Each cl In area For Each cl2 In area7 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 9 End If Next Next For Each cl In area For Each cl2 In area8 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 10 End If Next Next For Each cl In area For Each cl2 In area9 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 11 End If Next Next For Each cl In area For Each cl2 In area10 If cl.Value = cl2.Value Then cl.Interior.ColorIndex = 12 End If Next Next Set area = Nothing Set area1 = Nothing Set area2 = Nothing Set area3 = Nothing Set area4 = Nothing Set area5 = Nothing Set area6 = Nothing Set area7 = Nothing Set area8 = Nothing Set area9 = Nothing Set area10 = Nothing ActiveCell.Offset(-1, 0).Range("A1").Select End Sub ove la menzionata "confronta10" è la prima macro che hai scritto nel thread (di cui, tra l'altro, ho usato lo scheletro per scrivere quella sopra...), vale a dire, a scanso di equivoci: Sub confronta10() Dim cl, cl2 As Variant riga = ActiveCell.Row If riga <= 10 Then MsgBox ("Numero Riga selezionata errata") Exit Sub End If Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 10, 3), Cells(riga - 1, 7)) For Each cl In area For Each cl2 In area2 If cl.Value = cl2.Value Then cl2.Interior.ColorIndex = 3 End If Next Next Set area = Nothing Set area2 = Nothing End Sub Esegue tutto correttamente, ma è chiaro che rimango nel campo dell' "Adamo ed Eva, Caino e Abele...etc." ben lontano dall'estrema pulizia ed eleganza delle tue creature.... :)))) Vale a dire: ci sarà pure un'istruzione che in un colpo solo ordina di esaminare tutte le aree di tabella1 (da area1 ad area10) applicando via via un ColorIndex diverso man mano che avanza il processo delle righe senza dovere scrivere tutto quel poema dantesco, come invece ho fatto io villano!!?? :)))) Grazie infinite e buona giornata eZiop.s. Commenta:Il testo della Hoepli (non credo che ci possano accusare di pratiche scorrette indicando l'editore) che non conosco ma conoscendo l'autore (una visita al suo blog non fa male), presumo sia una buona base di apprendimento. Il consiglio che posso darti, è quello di leggere i manuali non saltando da un capitolo all'altro ma con buona pazienza iniziare dalla prima pagina e continuare fino all'ultima anche se certi argomenti si presume di conoscerli. condivido. Ma sottolineo che io, mannaggia, gli argomenti non li conosco affatto... Il testo summenzionato è molto intereressante però purtoppo sovente l'Autore si dilunga troppo, spesso romanzando, sull'argomento che invece è strettamente tecnico e "stringato", mentre tu riesci a far capire molto bene in due parole ciò di cui si parla... Basta leggere sopra: tutto chiarissimo in una manciata di righe!!... Grazie :)
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve la tua macro esegue un numero esagerato di cicli che appesantisce l'esecuzione del codice. Va da sè che i risultati che vuoi ottenere sono decisamente "Lambiccosi" Una soluzione buttata li può essere quella rappresentata dal codice qui sotto che utilizza l'istruzione Select Case per individuare il colore da assegnare ad ogni riga. Tra parentesi, ho corretto all'interno della macro il range della tabella1 perchè in base a quanto richiesto nel primo post le righe da selezionare in alto dovevano essere 10 + quella selezionata e la macro ne selezionava 12 controlla questa riga del codice: Set area2 = Range(Cells(riga - 11, 3), Cells(riga, 7)) diventata ora Set area2 = Range(Cells(riga - 10, 3), Cells(riga, 7)). Code: Sub confronta11() Dim cl As Variant, cl2 As Variant riga = ActiveCell.Row If riga <= 11 Then MsgBox ("Numero Riga selezionata errata") Exit Sub End If n = 1 Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 10, 3), Cells(riga, 7)) For Each cl In area RRiga = riga - 10 For Each cl2 In area2 Select Case RRiga Case riga - 10 colore = 3 Case riga - 11 colore = 4 Case riga - 12 colore = 40 Case riga - 13 colore = 6 Case riga - 14 colore = 7 Case riga - 15 colore = 8 Case riga - 16 colore = 34 Case riga - 17 colore = 10 Case riga - 18 colore = 35 Case riga - 19 colore = 12 Case riga - 20 colore = 13 Case riga - 21 colore = 14 End Select If cl.Value = cl2.Value Then cl.Interior.ColorIndex = colore cl2.Interior.ColorIndex = 3 End If If n = 5 Then RRiga = RRiga - 1 n = 1 Else n = n + 1 End If Next cl2 Next cl Set area = Nothing Set area2 = Nothing End Sub
Spero di averci preso.! Se mi permetti una piccola annotazione.. Normalmente quando si mette mano a un progetto complesso come il tuo, sarebbe buona cosa fare una analisi di quello che si vuole ottenere sviscerando a fondo tutte le problematiche per evitare di fare rattoppi e aggiunte con macro su macro che appesantiscono inutilmente il lavoro. Non è una critica ma un suggerimento per i tuoi prossimi lavori. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto:Una soluzione buttata li può essere quella rappresentata dal codice qui sotto che utilizza l'istruzione Select Case per individuare il colore da assegnare ad ogni riga. Spero di averci preso.! Innanzi tutto... Ci hai preso in pieno!! ... Grande. Alla faccia della soluzione buttata lì......... Commenta:Normalmente quando si mette mano a un progetto complesso come il tuo, sarebbe buona cosa fare una analisi di quello che si vuole ottenere sviscerando a fondo tutte le problematiche per evitare di fare rattoppi e aggiunte con macro su macro che appesantiscono inutilmente il lavoro. Non è una critica ma un suggerimento per i tuoi prossimi lavori. Certo è che hai ragione, e ne sono pienamente consapevole... Credimi: di solito non lavoro a "spanne", ma in questo caso specifico devo raggiungere uno scopo ben preciso (molto ambizioso, ma sono testardo e tenace e "DEVO" riuscire a farcela...) entro un limite di tempo molto, molto ristretto... quindi devo innanzi tutto dare priorità al risultato (l'esame analitico delle tabelle, anche se raffazzonato alla "arrotino" ahahahaha). E' chiaro che poi quei miei raffazzoni saranno sistemati, è un obiettivo "sine qua non" dato che oltre tutto la Materia mi affascina molto e di conseguenza lo farò con molto piacere e dedizione. Condivido appieno il tuo suggerimento, che è anche il mio solito modo di operare, ma purtroppo in questa circostanza non ho praticamente avuto alternative: o fare un full immersion del VBA, cosa pressoché impossibile da praticare per il sottoscritto, o pazientare e nel frattempo lavorare in modo empirico e lambiccoso, cosa che sto facendo con grande repulsione... ma purtroppo o mangio questo minestrone riscaldato o "salto dalla finestra". In tutto quest'affare ho però avuto un'immensa dose di fortuna: ho avuto il piacere e l'onore di conoscere un caro e fidato Amico (il mio "Mentore" nel VBA, concedimi l'appellativo) che sicuramente non è secondo a nessuno... Se ne hai voglia e tempo, mi puoi per favore spiegare passo-passo le istruzioni che hai dato per fare girare quest'altra splendida macro? - Dim cl As Variant, cl2 As Variant me l'hai già spiegato mi è chiaro - riga = ActiveCell.Row è la riga della cella attiva - If riga <= 11 Then MsgBox ("Numero Riga selezionata errata") se la riga è < o = a 11 compare l'avviso dell'istruzione e - Exit Sub esce dalla sub - End If n = 1 Termina se n=1... ma n a cos'è riferito? - Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 10, 3), Cells(riga, 7)) è l'istruzione che individua le aree in cui la macro lavorerà - For Each cl In area per ciascun valore di cl in area (quella descritta appena sopra) - RRiga = riga - 10 qui si definisce RRiga la riga attiva -10 - For Each cl2 In area2per ciascun valore di cl2 in area2 (quella descritta appena sopra) - Select Case RRiga seleziona il "Case" di RRiga - Case riga - 10 colore = 3 fino a - Case riga - 21 colore = 14 ... istruzioni che non riesco a definire... -10... -21... che riferimenti sono? - End Selecttermina la selezione If cl.Value = cl2.Value Then qui mi perdo... Non so definire l'esatta istruzione ... ( "se il valore di cl=cl2 poi"... è giusto ??) :)) - cl.Interior.ColorIndex = colore cl2.Interior.ColorIndex = 3 End If If n = 5 Then RRiga = RRiga - 1 n = 1 Else n = n + 1 End If ... in questa landa mi perdo propio :)) Next cl2 Next cl Set area = Nothing Set area2 = Nothing me l'hai già spiegato sopra... Una curiosità... ma esiste un testo che spiega bene questo linguaggio in modo sintetico, essenziale, passo-passo? Lo sto cercando da tempo, ma non sono ancora riuscito a trovarlo... Grazie infinite per l'immensa pazienza che hai, buona serata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao,
Se ne hai voglia e tempo, mi puoi per favore spiegare passo-passo le istruzioni che hai dato per fare girare quest'altra splendida macro?
n = 1[/color] Termina se n=1... ma n a cos'è riferito? - Set area = Range(Cells(riga, 8), Cells(riga, 19)) Set area2 = Range(Cells(riga - 10, 3), Cells(riga, 7)) è l'istruzione che individua le aree in cui la macro lavorerà - For Each cl In area per ciascun valore di cl in area (quella descritta appena sopra) - RRiga = riga - 10 qui si definisce RRiga la riga attiva -10 - For Each cl2 In area2per ciascun valore di cl2 in area2 (quella descritta appena sopra) - Select Case RRiga seleziona il "Case" di RRiga - Case riga - 10 colore = 3 fino a - Case riga - 21 colore = 14 ... istruzioni che non riesco a definire... -10... -21... che riferimenti sono? - End Selecttermina la selezione If cl.Value = cl2.Value Then qui mi perdo... Non so definire l'esatta istruzione ... ("se il valore di cl=cl2 poi"... è giusto ??) :)) - [color=red]cl.Interior.ColorIndex = colore cl2.Interior.ColorIndex = 3 End If If n = 5 Then RRiga = RRiga - 1 n = 1 Else n = n + 1 End If
-Variabile "N" serve per intercettare la riga della Tabella 1 ed è legata a questa istruzione: If n = 5 Then RRiga = RRiga - 1 n = 1 Else n = n + 1 End If Siccome la tabella 1 è formata da 5 colonne, la variabile N mi serve per cambiare il valore di RRiga al raggiungimento dell'elaborazione del 5° record. quando N raggiunge il valore di 5 riparte da 1 per la prossima riga (funge in definitiva da contatore) Nel caso il valore di N sia inferiore a 5 il contatore viene incrementato di una unità. Per quanto riguarda il Select Case, si prende come base di partenza la variabile RRiga che è pari alla Riga selezionata -10 Come abbiamo visto, la variabile RRiga viene ridimensiona ad ogni completamento di riga (RRiga = RRiga - 1) Nella macro, RRiga iniziale sarà uguale a 12 al secondo passaggio RRiga sarà = 11 e via discorrendo quindi nelle istruzioni di Select Case si imposta il controllo della riga in scansione Case=riga-10 colore=3 Case= riga-11 Colore=4 ecc. ecc. in base alla corrispondenza della riga viene assegnato un colore specifico. Sarebbe bastato scrive (sicuramente più facile da comprendere) anche Case =12 colore = 3 Case=11 colore = 4 Case=10 colore = 5 Case=9 colore =6 eccc. ecc. spero solo di essere stato almeno un pochino chiaro. Per quanto riguarda manuali o corsi di VBA puoi vedere nella collana di Mondadori informatica dovresti trovare manuali a vari livelli di conoscenza. Utili se poi un domani vorresti affrontare anche l'argomento relativo a maschere e relativi controlli. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto:...spero solo di essere stato almeno un pochino chiaro. Non sei stato "almeno un pochino chiaro"... sei stato chiarissimo!! Grazie assaiBuona notte, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
a10n11 ha scritto:[
in base alla corrispondenza della riga viene assegnato un colore specifico. Sarebbe bastato scrive (sicuramente più facile da comprendere) anche Case =12 colore = 3 Case=11 colore = 4 Case=10 colore = 5 Case=9 colore =6 eccc. ecc.
salve rileggendo, noto che la spiegazione di cui sopra, potrebbe essere male interpretata. La semplificazione mostrata vale per l'esempio descritto (Riga 22 selezionata) non può essere applicata alla macro in generale. Resta valido il codice Select Case RRiga Case riga - 10 colore = 3 Case riga - 11 colore = 4 Case riga - 12 colore = 40 Case riga - 13 colore = 6 Case riga - 14 colore = 7 Case riga - 15 colore = 8 Case riga - 16 colore = 34 Case riga - 17 colore = 10 Case riga - 18 colore = 35 Case riga - 19 colore = 12 Case riga - 20 colore = 13 Case riga - 21 colore = 14 End Select che prende come riferimento una qualsiasi riga selezionata nella tabella. L'esempio tendeva a mostrare il meccanismo adottato. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, sto cercando di comprendere le istruzioni di questa bella macro che mi hai preparato in un altro Topic, per processare i dati di ben 4 tabelle... a10n11 ha scritto:Code: Sub confrontaColora() Dim riga As Long Dim Cl1, cl2, cl3, cl4 As Variant Dim X As String riga = ActiveCell.Row X = "" Set col1 = Range(Cells(riga, 4), Cells(riga, 8)) Set col2 = Range(Cells(riga, 9), Cells(riga, 63)) Set col3 = Range(Cells(riga, 65), Cells(riga, 69)) Set col4 = Range(Cells(riga, 70), Cells(riga, 95)) col1.Interior.ColorIndex = xlNone col1.Borders.LineStyle = xlNone For Each Cl1 In col1 For Each cl4 In col4 If Cl1 = cl4 Then X = 4 Exit For End If Next cl4 For Each cl3 In col3 If Cl1 = cl3 Then X = X & 3 Exit For End If Next cl3 For Each cl2 In col2 If Cl1 = cl2 Then X = X & 2 Exit For End If Next cl2 Select Case X Case 432 Cl1.Interior.ColorIndex = 39 Case 2 Cl1.Interior.ColorIndex = 7 Case 32 With Cl1.Borders .LineStyle = xlContinuous .Weight = xlMedium End With Case 42 Cl1.Interior.ColorIndex = 3 Case 4 Cl1.Interior.ColorIndex = 6 End Select
X = "" Next Cl1 Set col1 = Nothing Set col2 = Nothing Set col3 = Nothing Set col4 = Nothing End Sub
- Dim X As String ?? - X = "" cinese per me... :))) - For Each cl4 In col4 If Cl1 = cl4 Then X = 4 Exit For End If Next cl4 per ciascun valore di cl4 presente in col4 se un valore di Cl1 è in col4... X=4 ?? Exit For ??... End If ... Next cl4 Finisci se prossima cl4... ?? - For Each cl3 In col3 If Cl1 = cl3 Then X = X & 3 Exit For End If Next cl3 qui una volta capita l'istruzione di cui sopra (relativa a cl4 e col4) rimane da capire solo X = X & 3 - End Select
X = "" Next Cl1 Fine selezione... Non capisco il significato di X = "" ... forse "se non c'è nessun valore" ??... passa al prossimo valore di Cl1 ?? La Materia è molto bella, la mia curiosità è però parimenti molto forte... è difficilissimo trovare le fonti, per capire bene i passaggi... e Tu sei fantastico nello spiegare in modo molto chiaro... Mi ricordi molto il mio grandissimo Prof. di Diritto Civile, uno stimato Avvocato che durante le sue lezioni aveva il potere di fare stare attentissimi anche i più "scalmanati" (erano i tempi della contestazione giovanile extraparlamentare....)... incredibile: erano loro che facevano fare silenzio in aula da tanto il Prof. catalizzava l'attenzione dell'intera classe!! :)))))) Un Grazie infinito per le tue grandi pazienza, disponibilità a "darmi corda" e gentilezza, Buona giornata eZioEDIT: Grazie per la precisazione, avevo comunque capito il meccanismo... perché applico le istruzioni a casi reali che modifico di volta in volta proprio per ragionarci sopra.... :)))
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve La macro a cui ti riferisci, serve per confrontare la tabella 1 (colonne 4:8) con altre 3 tabelle Tabella2 (colonne 9:63) Tabella 3 (colonne(65:69) Tabella 4 (colonne 70:95) - Siccome si doveva applicare un colore diverso in base alla tabella in cui si trovava la corrispondenza del valore cercato, ho giocato un po' con i numeri per identificare le tabelle. La variabile "X" inizializzata come vuota, (X="") serve per registrare in quali tabelle è presente il valore scansionato della Tabella 1 La prima tabella scansionata e la tabella 4 se il record di tabella1 è presente in tabella 4 - X assume il valore 4 e lo memorizza nella variabile. la seconda Tabella scansionata è la Tabella 3 se anche qui trova il valore di tabella 1 la Variabile X accorpa il numero 3 e diventa 43 ecc Es. se in tabella 1 controllo il valore 10 e viene trovato sia in tabella2-Tabella3-Tabella4 la variabile X assume il valore di 432. Finito di scansionare il primo numero in tutte le 3 Tabelle con il Select Case analizzo il valore di X per applicare il colore al record di Tabella 1. Alla fine, per passare all'analisi del secondo record di tabella 1 ho la necessità di resettare il valore di X ecco perchè trovi di nuovo l'istruzione( X="") saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto:salve La macro a cui ti riferisci, serve per confrontare la tabella 1 (colonne 4:8) con altre 3 tabelle Tabella2 (colonne 9:63) Tabella 3 (colonne(65:69) Tabella 4 (colonne 70:95) - Siccome si doveva applicare un colore diverso in base alla tabella in cui si trovava la corrispondenza del valore cercato, ho giocato un po' con i numeri per identificare le tabelle.
La variabile "X" inizializzata come vuota, (X="") serve per registrare in quali tabelle è presente il valore scansionato della Tabella 1 La prima tabella scansionata e la tabella 4 se il record di tabella1 è presente in tabella 4 - X assume il valore 4 e lo memorizza nella variabile. la seconda Tabella scansionata è la Tabella 3 se anche qui trova il valore di tabella 1 la Variabile X accorpa il numero 3 e diventa 43 ecc
Es. se in tabella 1 controllo il valore 10 e viene trovato sia in tabella2-Tabella3-Tabella4 la variabile X assume il valore di 432. Finito di scansionare il primo numero in tutte le 3 Tabelle con il Select Case analizzo il valore di X per applicare il colore al record di Tabella 1. Alla fine, per passare all'analisi del secondo record di tabella 1 ho la necessità di resettare il valore di X ecco perchè trovi di nuovo l'istruzione( X="") saluti Giap Tutto chiaro e limpido.... Mi viene spontanea una domanda: qual'è il giusto modus operandi con cui preparare una macro? - ovviamente per prima cosa si stabilisce "cosa" "perché"si deve processare una serie di dati... - poi si individuano le aree e i campi di ricerca in cui fare lavorare la macro A questo punto un grosso punto interrogativo: dove e come s'impara la corretta sintassi che si deve di volta in volta usare per scrivere le istruzioni?? Ho provato a cercare, ma non sono riuscito a trovare nessun testo specifico che spieghi nel dettaglio come stai facendo tu con me, con grande competenza e pazienza, in modo "essenziale" ma forse per questo immediatamente comprensibile ... Posso darti io questa volta un suggerimento? Perché non scrivi un manuale, che sicuramente andrà "a ruba"??... Grazie assai e buona giornata, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve un sito che ti posso consigliare utile per entrare nell'ordine di idee del linguaggio vb è quello oramai storico di Ennius http://ennius.interfree.it/index.htmlci trovi un mare di esempi organizzati per temi con spiegazioni chiare e semplici. prova a darci una occhiata. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, Grazie della segnalazione... in effetti il sito web è molto interessante e ricordo di averlo cliccato, ma mi era pressoché completamente sfuggito dalla vista e dalla memoria poiché avevo letto nell'indice riferimenti a Lotto e Superenalotto (che di per sé sono 2 giochi molto rispettabili, basti solo pensare alla Storia del Lotto, personalmente gli auguro vita eterna...)... pensavo alle solite pagliacciate fatte per spillare quattrini... Ma come al solito MAI essere superficiali, ma purtroppo una delle nostre più acerrime nemiche, nei nostri giorni è Signora "Fretta"... Insomma: non s'ha mai finito di imparare! Buona giornata, eZio
|
|
Guest |