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

[Excel 2007] - Tabelle Pivot e filtri Opzioni
a10n11
Inviato: Monday, May 09, 2011 11:58:46 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
senza riscrivere tutta la macro, guarda se intanto il risultato va bene:

Option Base 1
Public Cl As Variant
Public sequenza As Long
Public myrow As Long
Public crit As Variant
Sub TabellaTabelle()
Dim ctr As Boolean, ctr2 As Boolean
With Sheets("foglio2")
.Cells.Interior.ColorIndex = xlNone
.Cells.Borders.LineStyle = xlNone
End With
sequenza = CLng(InputBox("SEQUENZA", "Dichiara limite sequenza"))
conta = 0
uriga = Range("A" & Rows.Count).End(xlUp).Row
For I = 8 To 33
Set Area = Range(Cells(3, I), Cells(uriga, I)).SpecialCells(xlCellTypeVisible)
If Area.Cells.Count > sequenza Then
If Sheets("foglio1").AutoFilterMode Then
With Sheets("Foglio1").AutoFilter.Filters(I)
If .On Then
crit = Area.Cells(1).Row
Colfil = Area.Cells(1).Column
End If
End With
Else: Exit Sub
End If
For Each Cl In Area
If Cl.Interior.ColorIndex = xlNone Then
conta = conta + 1
If Not ctr2 Then
myrow = Cl.Row
End If
ctr2 = True
Else
If conta = sequenza Then
Call copiaDati
ctr = True
conta = 0
End If
conta = 0
End If
Next
End If
conta = 0
ctr2 = False
Next
If ctr Then
With Sheets("foglio2").Cells(crit, Colfil).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = 3
End With
End If
End Sub

Sub copiaDati()
colonna = Cl.Column
With Sheets("foglio2")
With .Cells(myrow, colonna).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = 3
End With
End With
End Sub


Ora per l'applicazione dei filtri mi devi dire dove andare a pescare i criteri per ogni colonna della tabella 2

saluti
Giap

aetio
Inviato: Monday, May 09, 2011 12:40:35 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
il risultato è esatto.
Per quanto riguarda i criteri, come ho spiegato (male...) sopra, la macro dovrebbe scansionare la tabella colonna per colonna e codice per codice, restituendo in foglio2 tutte le ricorrenze che hanno soddifatto il criterio di ricerca: in questo caso il 10.
Grazie assai, buon pomeriggio,
eZio
a10n11
Inviato: Monday, May 09, 2011 1:09:30 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
premesso che nelle macro che ti ho inviato, c'è un errore nell'indicazione di un interruttore che ti correggerò,
il filtro applicato a tutte le colonne della tabella 2 per ogni valore presente in ciascuna colonna rappresenterà un peso enorme di elaborazione.
Scrivere la macro non è un problema non saprei quanto tempo impiegherà per l'elaborazione visto che tu hai tabelle macroscopiche.
saluti
Giap

aetio
Inviato: Monday, May 09, 2011 2:37:27 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
nessun problema di tempo... quando hai tempo e voglia, ci mancherebbe pure che ti metto fretta!! ;)
Non riesco ad inquadrare perché questa ricerca delle macro sarà più "pesante" delle altre... così, da ignorante che molto probabilmente spara una barzelletta, più o meno siamo ai livelli delle altre, solo che invece di avere due filtri numerici ne abbiamo 1 numerico (quello del cod. da filtrare) e uno per colore che cerca le ricorrenze in cui le celle delle altre colonne della tabella, interessate dal filtro (nelle stesse righe del cod. filtrato), non si sono colorate per un numero di volte pari a quello inserito nella InputBox.
Grazie per tutto, buon pomeriggio
eZio

EDIT:
Ma se ragioniamo sul numero di colonne in cui andranno a lavorare e il numero di codici da scansionare... ecco spiegato il motivo :)))
Ci metto un pò a carburare... l'importante è che questa "carburazione" avvenga...
a10n11
Inviato: Monday, May 09, 2011 6:28:44 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
aetio ha scritto:

... (nelle stesse righe del cod. filtrato)



salve
questa precisazione tra parentesi, potrebbe essere quello che vanifica tutto il lavoro.

guarda l'immagine qui sotto.
La tabella è filtrata per il codice 57 in colonna AC per cataste lunghe 6
le mie macro prelevano il valore 61 di colonna Z
è corretta l'interpetazione o è miservolmente sbagliata??



PS.
perchè la strada non è semplice come quella che ipotizzi?? considera che la sola colonna H contiene 92 record univoci, quindi per la sola colonna H bisogna applicare 92 filtri ipotizzando che tutte le altre colonne abbiano altrettanti records univoci moltiplica 92 x 26 colonne e ti portano ad un totale di 2496 filtri su ciascun filtro
vengono eseguti almeno 3 cicli

saluti
Giap

aetio
Inviato: Monday, May 09, 2011 8:12:26 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
a10n11 ha scritto:

La tabella è filtrata per il codice 57 in colonna AC per cataste lunghe 6
le mie macro prelevano il valore 61 di colonna Z
è corretta l'interpetazione o è miservolmente sbagliata??
...E' esatta. In foglio2, se la cosa è fattibile, dovrebbero esserci le 2 celle responsabili (che sono sulla stessa riga, e mi forniscono- in col.C- il Sett. a cui appartengono) della catasta lunga 6: il cod.61 di col.Z e il cod.57 di col.AC, insieme a tutte le loro simili... (quelle che hanno cataste lunghe 6...)
Grazie infinite, buona serata
eZio

a10n11
Inviato: Tuesday, May 10, 2011 11:03:18 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
quelle che seguono, sono le macro applicate sul file Aetio-prova-iv.xls
La macro principale alla quale sono legate tutte le altre è: filtrasequenza()

Option Base 1
Public Cl As Variant
Public sequenza As Long
Public myrow As Long
Public crit As Variant
Public urig As Long
Public colore As Long


Sub filtrasequenza()
Sheets("foglio1").Select
Application.ScreenUpdating = False
urig = Range("A" & Rows.Count).End(xlUp).Row
With Sheets("foglio2")
.Cells.Interior.ColorIndex = xlNone
.Cells.Borders.LineStyle = xlNone
End With
sequenza = CLng(InputBox("SEQUENZA", "Dichiara limite sequenza"))
If Sheets("foglio1").AutoFilterMode Then
Selection.AutoFilter
End If
Range("A1").AutoFilter
colore = 6
For n = 8 To 33
Set miaColl = New Collection
Set AreaCol = Range(Cells(3, n), Cells(urig, n))
For Each Clx In AreaCol
On Error Resume Next
miaColl.Add Clx, CStr(Clx)
On Error GoTo 0
Next
For y = 1 To miaColl.Count
Selection.AutoFilter Field:=n, Criteria1:=miaColl(y)
Call TabellaTabelle
Next y
Selection.AutoFilter Field:=n
Set miaColl = Nothing
Set AreaCol = Nothing
Next n
Application.ScreenUpdating = True
End Sub

Sub TabellaTabelle()
Dim ctr As Boolean, ctr2 As Boolean
Dim miaColl As Collection
conta = 0
For i = 8 To 33
Set Area = Range(Cells(3, i), Cells(urig, i)).SpecialCells(xlCellTypeVisible)
If Area.Cells.Count > sequenza Then
If Sheets("foglio1").AutoFilterMode Then
With Sheets("Foglio1").AutoFilter.Filters(i)
If .On Then
crit = Area.Cells(1).Row
Colfil = Area.Cells(1).Column
End If
End With
Else: Exit Sub
End If
For Each Cl In Area
If Cl.Interior.ColorIndex = xlNone Then
conta = conta + 1
If Not ctr2 Then
myrow = Cl.Row
End If
ctr2 = True
Else
If conta = sequenza Then
Call copiaDati
ctr = True
ctr2 = False
conta = 0
End If
conta = 0
ctr2 = False
End If
Next
End If
conta = 0
ctr2 = False
Next
If ctr Then
With Sheets("foglio2").Cells(crit, Colfil).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = colore
colore = colore + 1
End With
End If
End Sub

Sub copiaDati()
colonna = Cl.Column
With Sheets("foglio2")
With .Cells(myrow, colonna).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = colore
End With
End With
End Sub



prova e fa sapere.
saluti
Giap

aetio
Inviato: Tuesday, May 10, 2011 12:20:28 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
innanzi tutto un più che stra-doveroso Grazie (credimi: è sincero e di cuore...) per tutto il lavorone che stai facendo per risolvere i miei problemi...
Allora: ho provato le macro nel file di prova:
sequenza 12 --> rileva correttamente il cod.6 in col.P e il cod.40 in col.Z
sequenza 10 --> rileva correttamente il cod.6 in col.P e il cod.89 in col.I
sequenza 10 --> rileva correttamente il cod.12 in col.K e il cod.66 in col.R
sequenza 16 --> rileva correttamente il cod.6 in col.P e il cod.12 in col.AE
sequenza 6 --> rileva correttamente il cod.12 in col.K e il cod.84 in col.AA, ma restituisce anche altre celle singole (nelle righe) e di colore differente



Provando le macro su un mio sim.file le macro si piantano quasi alla fine dell'ultima macro restituendomi 'errore' nell'istruzione

Sub copiaDati()
colonna = Cl.Column
With Sheets("foglio2")
With .Cells(myrow, colonna).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = colore
End With
End With
End Sub

Ecco il foglio2 dopo la "piantata motore" (termine aeronautico che non si vorrebbe mai pronunciare...)




Di nuovo un Grazie immenso, buon pomeriggio
eZio
lui49
Inviato: Tuesday, May 10, 2011 1:18:52 PM
Rank: AiutAmico

Iscritto dal : 5/4/2003
Posts: 2,845
In volo

Lascia lente le briglie del tuo ippogrifo, o a10n11, e sfrena il tuo volo dove più ferve l'opera dell'uomo.
Però non ingannarmi con false immagini ma lascia che io veda la verità e possa poi toccare il giusto.
Da qui, aetio, si domina la valle; ciò che si vede, è.
Ma se l'imago è scarna al nostro occhio scendiamo a rimirarla da più in basso e planeremo in un galoppo alato
entro il cratere ove gorgoglia il tempo.



...già nel 1972 il "Banco del Mutuo Soccorso" aveva presagio dei futuri accadimenti. Drool
aetio
Inviato: Tuesday, May 10, 2011 2:47:07 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
lui49 ha scritto:

...già nel 1972 il "Banco del Mutuo Soccorso" aveva presagio dei futuri accadimenti. Drool


:<>
a10n11
Inviato: Tuesday, May 10, 2011 7:55:57 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
ho potuto solo ora verificare la macro.
Ho individuato un errore che si verifica in una particolare circostanza (catasta che finisce nell'ultima cella della tabella) domani con calma faccio la correzione.
saluti
Giap

a10n11
Inviato: Tuesday, May 10, 2011 8:02:07 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
lui49 ha scritto:
In volo

Lascia lente le briglie del tuo ippogrifo, o a10n11, e sfrena il tuo volo dove più ferve l'opera dell'uomo.
Però non ingannarmi con false immagini ma lascia che io veda la verità e possa poi toccare il giusto.
Da qui, aetio, si domina la valle; ciò che si vede, è.
Ma se l'imago è scarna al nostro occhio scendiamo a rimirarla da più in basso e planeremo in un galoppo alato
entro il cratere ove gorgoglia il tempo.



...già nel 1972 il "Banco del Mutuo Soccorso" aveva presagio dei futuri accadimenti. Drool



salve
si deve interpetare la figura dell'Ippogrifo, seguendo Ariosto o BMS ?

saluti
Giap

aetio
Inviato: Tuesday, May 10, 2011 8:02:49 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
a10n11 ha scritto:
salve
ho potuto solo ora verificare la macro.
Ho individuato un errore che si verifica in una particolare circostanza (catasta che finisce nell'ultima cella della tabella) domani con calma faccio la correzione.
saluti
Giap

Caro Amico mio, nessunissima fretta... Grazie infinite per tutto quello che stai facendo per me.
Buona serata
eZio
lui49
Inviato: Tuesday, May 10, 2011 8:47:45 PM
Rank: AiutAmico

Iscritto dal : 5/4/2003
Posts: 2,845
a10n11 ha scritto:


salve
si deve interpetare la figura dell'Ippogrifo, seguendo Ariosto o BMS ?

saluti
Giap



Il mio ippogrifo non è certo la bestiaccia Ariostana. Il mio ippogrifo è spirito, è conoscenza, è vento del nord, è folle magia.




a10n11
Inviato: Wednesday, May 11, 2011 6:59:23 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
con un po' di ritardo ti posto le modifiche effettuate nelle macro.
ad un sommario controllo pare che vada prova tu in maniera più approfondita.
saluti
Giap

Public Cl As Variant
Public sequenza As Long
Public myrow As Long
Public crit As Variant
Public urig As Long
Public colore As Long
Public colfil As Long


Sub filtrasequenza()
Sheets("foglio1").Select
Application.ScreenUpdating = False
If Sheets("foglio1").AutoFilterMode Then
Selection.AutoFilter
End If
Range("A1").AutoFilter
urig = Range("A" & Rows.Count).End(xlUp).Row
With Sheets("foglio2")
.Cells.Interior.ColorIndex = xlNone
.Cells.Borders.LineStyle = xlNone
End With
sequenza = CLng(InputBox("SEQUENZA", "Dichiara limite sequenza"))
colore = 7
For n = 8 To 33
Set miaColl = New Collection
Set AreaCol = Range(Cells(3, n), Cells(urig, n))
For Each Clx In AreaCol
On Error Resume Next
miaColl.Add Clx, CStr(Clx)
On Error GoTo 0
Next
For y = 1 To miaColl.Count
Selection.AutoFilter Field:=n, Criteria1:=miaColl(y)
With Sheets("Foglio1").AutoFilter.Filters(n)
If .On Then
crit = Range(Cells(3, n), Cells(urig, n)).SpecialCells(xlCellTypeVisible).Cells(1).Row
colfil = n
End If
End With
Call TabellaTabelle
Next y
Selection.AutoFilter Field:=n
Set miaColl = Nothing
Set AreaCol = Nothing
Next n
Application.ScreenUpdating = True
End Sub

Sub TabellaTabelle()
Dim ctr As Boolean, ctr2 As Boolean, CtrlCol As Boolean
Dim miaColl As Collection
conta = 0
For i = 8 To 33
Set area = Range(Cells(3, i), Cells(urig, i)).SpecialCells(xlCellTypeVisible)
Lastfilt = Cells(Cells.Rows.Count, i).End(xlUp).Row
If area.Cells.Count < sequenza Then Exit For
For Each Cl In area
If Cl.Interior.ColorIndex = xlNone Then
conta = conta + 1
If Not ctr2 Then
myrow = Cl.Row
End If
ctr2 = True
If Cl.Row = Lastfilt Then GoTo dopo
Else
dopo:
If conta = sequenza Then
CtrCol = True
Call copiaDati
With Sheets("foglio2").Cells(crit, colfil).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = colore
End With
Else
End If
conta = 0
ctr2 = False
End If
Next
conta = 0
ctr2 = False
Set area = Nothing
Next
If CtrCol Then
colore = colore + 1
End If
CtrCol = False
End Sub

Sub copiaDati()
colonna = Cl.Column
With Sheets("foglio2")
With .Cells(myrow, colonna).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = colore
End With
End With
End Sub

aetio
Inviato: Wednesday, May 11, 2011 10:50:50 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
Grazie per il tuo preziosissimo aiuto...
purtroppo dà lo stesso errore... nello stesso punto delle istruzioni... ecco in foglio2 cosa appare





Buona notte,
eZio

Code:
con un po' di ritardo ti posto....... (etc.)...

nessun ritardo, ci mancherebbe altro!! ;))) Grazie assai...
a10n11
Inviato: Wednesday, May 11, 2011 11:07:07 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
l'errore che indichi presume che ti dica che hai superato il limite dei colori disponibili (in Excel sono 56) almeno fino alla mia versione.
ho solo paura di pensare quanto è corposa la tua tabella.
l'unica soluzione che mi viene in mente è quella di reinizializzare la variabile colore quando arriva a 56, oppure mettere un colore fisso.
L'immagine qui sotto è il risultato (parziale) dell'elaborazione del file di prova con "catasta" 6



saluti
Giap

aetio
Inviato: Thursday, May 12, 2011 5:25:21 AM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
in cuor mio ho pensato che la causa fosse quella... infatti vedevo che venivano usati più colori, con un errore sulla variabile .ColorIndex, ma in questa stupenda Materia di castronerie te ne dico già fin troppe e avevo paura di scriverlo... se non è un problema, se non ti dà particolare lavoro aggiunto, si potrebbe usare un colore fisso.... a me importa che mi vengano segnalate in modo esatto queste circostanze; l'uso di diversi colori è una raffinatezza in più che certo non guasta, ma non è di vitale importanza dato che il resoconto di foglio2 è riferito solo ad una delle altezze delle cataste e quindi non v'è pericolo di confusione...
Grazie assai, e buona giornata (visto che sono le 05:20 è ancora lunga, e quindi ha un "Range" piuttosto esteso ahahahahah)
eZio

p.s. le tabelle sono sì corpose... eccome!! :)))
Quesito:
nell'immagine che hai postato vedo in col.P il cod.6, in col.U cod.87, in col.AB cod.33, in col.AC cod.57 ---> perché sono soli? in una riga ci dovrebbero essere almeno 2 celle bordate: 1 del cod. filtrato, l'altra del cod. che, con quel codice filtrato, genera la catasta di altezza ricercata...
a10n11
Inviato: Thursday, May 12, 2011 9:43:40 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
per impostare un solo colore (es. rosso) modifica la macro TabellaTabelle() come segue

Sub TabellaTabelle()
Dim ctr As Boolean, ctr2 As Boolean
Dim miaColl As Collection
conta = 0
For i = 8 To 33
Set area = Range(Cells(3, i), Cells(urig, i)).SpecialCells(xlCellTypeVisible)
Lastfilt = Cells(Cells.Rows.Count, i).End(xlUp).Row
If area.Cells.Count < sequenza Then Exit For
For Each Cl In area
If Cl.Interior.ColorIndex = xlNone Then
conta = conta + 1
If Not ctr2 Then
myrow = Cl.Row
End If
ctr2 = True
If Cl.Row = Lastfilt Then GoTo dopo
Else
dopo:
If conta = sequenza Then
Call copiaDati
With Sheets("foglio2").Cells(crit, colfil).Borders
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = colore
End With
Else
End If
conta = 0
ctr2 = False
End If
Next
conta = 0
ctr2 = False
Set area = Nothing
Next
End Sub

Commenta:

Quesito:
nell'immagine che hai postato vedo in col.P il cod.6, in col.U cod.87, in col.AB cod.33, in col.AC cod.57 ---> perché sono soli? in una riga ci dovrebbero essere almeno 2 celle bordate: 1 del cod. filtrato, l'altra del cod. che, con quel codice filtrato, genera la catasta di altezza ricercata...


non lo vedi perchè l'immagine è parziale. (Con filtro 6 in colonna P criterio di filtro 6), la "catasta" inizia in cella U48 con il codice 45 quindi al di fuori dell'immagine.
saluti
Giap




aetio
Inviato: Thursday, May 12, 2011 10:47:40 AM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
ora le macro non si piantano più... [ v'era forse qualche dubbio?? :)) ]
tempo di lavoro delle macro: totale 3min. pensavo molto di più...!!
Ma quanto sono belle!! Ma quanto son belle!!!! Poi più avanti, con calma ti chiederò alcune spiegazioni per capire il significato di alcune istruzioni...
a10n11 ha scritto:

non lo vedi perchè l'immagine è parziale. (Con filtro 6 in colonna P criterio di filtro 6), la "catasta" inizia in cella U48 con il codice 45 quindi al di fuori dell'immagine.
Ho un problema ehm... "contingente"... molto importante poiché le tabelle, come hai sottolineato, sono parecchio corpose: vi sarebbe la necessità di marcare in riga 48 anche la cella p48 del cod. 6 che ha generato la "catasta" di altezza 6.
*** A questo punto penso che veramente mi mandi ehm... "in Papuasia"...e hai ragione!!***
Sei un Santo, oltre che un sommo conoscitore di questa meravigliosa Materia, che tanto mi affascina... Spesso mi sorge il dubbio- più che fondato- che dietro il tuo nick si nasconda in realtà uno degli inventori del VBA... ;)
Grazie infinite, e 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.