Benvenuto Ospite Cerca | Topic Attivi | Utenti | | Log In | Registra

[Excel 2007]- confronto dei dati di due tabelle Opzioni
aetio
Inviato: Saturday, October 16, 2010 10:40:20 AM

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
Sponsor
Inviato: Saturday, October 16, 2010 10:40:20 AM

 
a10n11
Inviato: Saturday, October 16, 2010 5:31:45 PM

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 ??

aetio
Inviato: Sunday, October 17, 2010 8:02:09 AM

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
a10n11
Inviato: Sunday, October 17, 2010 4:53:33 PM

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

aetio
Inviato: Monday, October 18, 2010 6:55:57 PM

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 = 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
End Sub

Grazie e buona serata,
eZio
a10n11
Inviato: Monday, October 18, 2010 7:54:26 PM

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

aetio
Inviato: Tuesday, October 19, 2010 7:11:09 AM

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,
eZio

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 (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.......

.
a10n11
Inviato: Tuesday, October 19, 2010 11:24:17 AM

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



aetio
Inviato: Tuesday, October 19, 2010 2:21:24 PM

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
eZio

p.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 :)
a10n11
Inviato: Tuesday, October 19, 2010 6:19:17 PM

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


aetio
Inviato: Tuesday, October 19, 2010 8:45:29 PM

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
a10n11
Inviato: Tuesday, October 19, 2010 9:38:51 PM

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


aetio
Inviato: Tuesday, October 19, 2010 10:33:18 PM

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 assai
Buona notte,
eZio

a10n11
Inviato: Wednesday, October 20, 2010 10:45:31 AM

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




aetio
Inviato: Wednesday, October 20, 2010 10:56:11 AM

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
eZio

EDIT:
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.... :)))
a10n11
Inviato: Wednesday, October 20, 2010 11:41:14 AM

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

aetio
Inviato: Wednesday, October 20, 2010 1:33:01 PM

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
a10n11
Inviato: Wednesday, October 20, 2010 3:25:06 PM

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.html
ci trovi un mare di esempi organizzati per temi con spiegazioni chiare e semplici.
prova a darci una occhiata.
saluti
Giap

aetio
Inviato: Wednesday, October 20, 2010 3:34:48 PM

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
Utenti presenti in questo topic
Guest


Salta al Forum
Aggiunta nuovi Topic disabilitata in questo forum.
Risposte disabilitate in questo forum.
Eliminazione tuoi Post disabilitata in questo forum.
Modifica dei tuoi post disabilitata in questo forum.
Creazione Sondaggi disabilitata in questo forum.
Voto ai sondaggi disabilitato in questo forum.

Main Forum RSS : RSS

Aiutamici Theme
Powered by Yet Another Forum.net versione 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.