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

[Excel 2007]- Ricostruzione, partendo da tabella Pivot, dei dati filtrati II Opzioni
aetio
Inviato: Monday, December 06, 2010 12:17:06 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
sto cercando di imparare a leggere nei dettagli le magnifiche istruzioni dell'ultima macro di a10n11 del Topic al LINK
ma mi sono letteralmente ingolfato nel cercare di applicare la macro ad una variante del problema appena risolto ovvero, guardando la foto




come modificare le istruzioni in modo da fare effettuare alla macro il confronto tra la TABELLA2 (da col.H a col.AG) e la col.AH anziché tra le TABELLA1 e TABELLA2?
So con molto sconforto che come al solito sto annegando in un bicchiere d'acqua (con l'aggravante di quanto già discusso e RISOLTO in questo LINK!!), ma la mia sete di sapere è molto più forte di me... :)
Provo a fare qualche riflessione:
-Queste istruzioni in questo caso non servono, poiché il case è uno solo (diviso in due tabelle, una a sin. e una a des.)
Case 4 To 999
Tab1 = 5
Case 1000 To 1999
Tab1 = 1001
Case 2000 To 2999
Tab1 = 2001
Case 3000 To 3999
Tab1 = 3001
Case 4000 To 4999
Tab1 = 4001


- L'istruzione
Select Case col
Case 5 To 17
Y = 2
z = 4
Case 22 To 34
Y = 19
z = 21

diventa
Select Case col
Case 5 To 17
X = 5
Y = 2
z = 4
Case 22 To 34
X = 22
Y = 19
z = 21


- L'istruzione
End Select
Nrtab1 = Cells(Tab1, 5).Value
Nrtab2 = .Cells(6, col).Value
Nr = .Cells(Riga, Y).Value
Comp = .Cells(Riga, z).Value

diventa
End Select
NrTab1 = .Cells(X, 5).Value
NrTab2 = .Cells(6, col).Value
Nr = .Cells(Riga, y).Value
Comp = .Cells(Riga, z).Value


- L'istruzione
End With
With Sheets("Foglio2")
Set area = .Range("C2", .Range("G2").End(xlDown))

diventa
With Sheets("Foglio2")
Set area = .Range("AH2", .Range("AH2").End(xlDown))


Il mio problema nasce quando cerco di dare riferimenti all'istruzione
Selection.AutoFilter
Selection.AutoFilter Field:=Nrtab1, Criteria1:=Nr
Selection.AutoFilter Field:=Nrtab2 - 2, Criteria1:=Comp

Qui mi perdo, poiché non riesco a capire dove le istruzioni s'impastano e generano un messagio di Errore di Run-time 1004
Errore nel metodo AutoFilter per la classe Range
Per facilitare la comprensione posto l'intera macro:
Commenta:
Sub CercaSorgente3()
With Sheets("TabPivot")
Riga = ActiveCell.Row
col = ActiveCell.Column
Select Case col
Case 5 To 17
X = 5
Y = 2
Z = 4
Case 22 To 34
X = 22
Y = 19
Z = 21
End Select
Nrtab1 = Cells(X, 5).Value
Nrtab2 = .Cells(6, col).Value
Nr = .Cells(Riga, Y).Value
Comp = .Cells(Riga, Z).Value
End With
With Sheets("Foglio2")
Set area = .Range("AH2", .Range("AH2").End(xlDown))
For Each cl In area
If cl.Value = Nr And Comp = .Cells(cl.Row, Nrtab2).Value Then
CellRif = .Cells(cl.Row, Nrtab2).Address
MsgBox ("Il Valore selezionato è riferito" & vbCrLf _
& "alla Cella " & CellRif & " del Foglio2 ")
Exit For
End If
Next
End With
Sheets("foglio2").Select
If ActiveSheet.FilterMode = True Then
Selection.AutoFilter
End If
Range("C1:AH1").Select
Selection.AutoFilter
Selection.AutoFilter Field:=Nrtab1, Criteria1:=Nr
Selection.AutoFilter Field:=Nrtab2 - 2, Criteria1:=Comp
End Sub


Grazie assai, saluti
eZio
Sponsor
Inviato: Monday, December 06, 2010 12:17:06 PM

 
a10n11
Inviato: Monday, December 06, 2010 2:47:12 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
qui si rende necessario riepilogare tutta la questione altrimenti si perde il filo logico.

Generazione Tabelle Pivot da confronto di tutta la tabella1 con tutta la Tabella2

Il lavoro viene eseguito dalla Macro: Sub confronta_Tabelle2() che richiama a sua volta la macro:Sub CreaPivot2()
e viene completata con la macro Sub Per_filtro()
La macro per risalire dalle Tabelle Pivot alla Tabella del Foglio 2 si chiama - Sub CercaSorgente()




Generazione Tabella Pivot che confronta solo la colonna AH con tutta la tabella2

Il lavoro viene eseguito dalla macro: Sub confronta_Tabelle3() che dopo la modifica alla struttura delle Tabelle Pivot per inserirle in aree del foglio ben definite, necessita in questo caso che sia modificata quindi la chiameremo
Sub CreaPivot3() che avrà questo codice:
Code:

Sub CreaPivot3()
Select Case Tab2
Case 1
colp = 3
rtab = Sheets("TabPivot").Range("C65536").End(xlUp).Row + 3
Case 2
colp = 20
rtab = Sheets("TabPivot").Cells(65536, colp).End(xlUp).Row + 3
End Select
Set rng = Cells(1, col).CurrentRegion
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
       rng.Address).CreatePivotTable TableDestination:=Sheets("TabPivot").Cells( _
        rtab, colp), TableName:="Tabella_pivot" & Pr
        Sheets("TabPivot").Select
    ActiveSheet.PivotTables("Tabella_pivot" & Pr).SmallGrid = False
    With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Numero")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Compon.")
        .Orientation = xlRowField
        .Position = 2
    End With
    With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Numero")
        .Orientation = xlDataField
        .Position = 1
    End With
    ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Somma di Numero"). _
        Function = xlCount
    With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Tab2")
        .Orientation = xlColumnField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Tab1")
        .Orientation = xlColumnField
        .Position = 1
    End With
     ActiveSheet.PivotTables("Tabella_pivot" & Pr).ColumnGrand = False
     ActiveSheet.PivotTables("Tabella_pivot" & Pr).RowGrand = False
   
          Set rng = Nothing
End Sub

Quindi nella macro Sub confronta_Tabelle3() modificheremo la riga "Call CreaPivot2" con
"Call CreaPivot3"
e sa sua volta completata con la macro Sub Per_filtro()

La macro per risalire dalle Tabelle Pivot alla Tabella del Foglio2 si chiamerà per questa seconda ipotesi:
Sub CercaSorgente_AH() che avrà il seguente codice:

Code:

Sub CercaSorgente_AH()
With Sheets("TabPivot")
Riga = ActiveCell.Row
col = ActiveCell.Column
Select Case col
Case 5 To 17
Y = 2
z = 4
Case 22 To 34
Y = 19
z = 21
End Select
NrTab1 = 34
Nrtab2 = .Cells(6, col).Value
Nr = .Cells(Riga, Y).Value
Comp = .Cells(Riga, z).Value
End With
With Sheets("Foglio2")
Set area = .Range("AH2", .Range("AH2").End(xlDown))
For Each cl In area
If cl.Value = Nr And Comp = .Cells(cl.Row, Nrtab2).Value Then
CellRif = .Cells(cl.Row, Nrtab2).Address
MsgBox ("Il Valore selezionato è riferito" & vbCrLf _
& "alla Cella   " & CellRif & " del Foglio2 ")
Exit For
End If
Next
End With
Sheets("foglio2").Select
If ActiveSheet.FilterMode = True Then
Selection.AutoFilter
End If
Range("A1:AH1").Select
Selection.AutoFilter
    Selection.AutoFilter Field:=NrTab1, Criteria1:=Nr
    Selection.AutoFilter Field:=Nrtab2, Criteria1:=Comp
End Sub


speriamo di non esserci persi.
saluti
Giap



aetio
Inviato: Monday, December 06, 2010 3:20:25 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
il tuo riepilogo è assai eloquente...
e del resto anche la Mitologia ce l'ha sottolineato senza mezzi termini: per uscire dal Labirinto è stato determinante il filo di Arianna :)))
Come si può ben vedere dai miei commenti e dalla successiva tua chiarissima spiegazione, il bicchiere d'acqua in cui annegavo era molto piccolo:
Premesso di avere a priori ben svolto il lavoro da te sopra ricordato bastava, anziché dare l'istruzione
NrTab1 = .Cells(X, 5).Value

dare molto semplicemente il n. di colonna della NrTab1, vale a dire 34 (la col.AH di Foglio2)...
e la macro avrebbe funzionato alla perfezione. Non capisco perché nonostante le coordinate fossero giuste (conducevano 'comunque' a quel codice) veniva evidenziato un errore di Run-time... Probabilmente la più che giusta rigidità del linguaggio VBA non consente vie alternative, anche se coincidenti nel risultato.
Sembra una stupidata, ma la riflessione è assai più profonda...............
e noi, riflessione dopo riflessione, passo dopo passo, cercheremo di non perderci mai. Passo dopo passo.
Con l'immensa Fortuna di avere dalla nostra parte l'estrema disponibilità (e intelligenza) di un grande Maestro :)))
Grazie infinite, saluti
eZio.
a10n11
Inviato: Monday, December 06, 2010 6:04:05 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve

Code:

Premesso di avere a priori ben svolto il lavoro da te sopra ricordato bastava, anziché dare l'istruzione
NrTab1 = .Cells(X, 5).Value

dare molto semplicemente il n. di colonna della NrTab1, vale a dire 34 (la col.AH di Foglio2)...
e la macro avrebbe funzionato alla perfezione. Non capisco perché nonostante le coordinate fossero giuste (conducevano 'comunque' a quel codice) veniva evidenziato un errore di Run-time...


Non è quello il problema del tuo errore entrambe le assegnazioni del valore della variabile restituiscono lo stesso risultato. L'errore ti veniva provocato da questa riga:

Range("C1:AH1").Select
alla quale seguiva
Selection.AutoFilter Field:=NrTab1, Criteria1:=Nr
dove NrTab1 (34) definisce il campo da filtrare che va oltre il numero di campi nel range C1:AH1

Modificando come segue la macro "Sub CercaSorgente_AH()"
Range("A1:AH1").Select
La lunghezza del range diventa 34 come la variabile NrTab1 e non ottieni più l'errore.

saluti
Giap





aetio
Inviato: Monday, December 06, 2010 8:01:38 PM

Rank: AiutAmico

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

Non è quello il problema del tuo errore entrambe le assegnazioni del valore della variabile restituiscono lo stesso risultato. L'errore ti veniva provocato da questa riga:

Range("C1:AH1").Select
alla quale seguiva
Selection.AutoFilter Field:=NrTab1, Criteria1:=Nr
dove NrTab1 (34) definisce il campo da filtrare che va oltre il numero di campi nel range C1:AH1

Modificando come segue la macro "Sub CercaSorgente_AH()"
Range("A1:AH1").Select
La lunghezza del range diventa 34 come la variabile NrTab1 e non ottieni più l'errore.


Non ci sarei MAI arrivato...!! Ho imparato una cosa nuova.
Grazie assai, saluti
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.