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

[Excel 2007]- Risalire alle fonti di tabellaPivot (RISOLTO) Opzioni
aetio
Inviato: Tuesday, November 23, 2010 2:53:00 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
chiedo scusa in anticipo, con molta probabilità (frase di rito...) ma devo risolvere un problema "logistico" ed avrei bisogno, quando col puntatore punto su una cella di una tabella Pivot, di risalire alla sua fonte, scritta nella pagina che ha generato la tabella in una data cella, nella riga di competenza... Forse ho visto troppi telefilm di fantascienza... (ve li ricordate Spazio 1999 o UFO?!?) :))))
Per a10n11: mi riferisco alla tabella Pivot di questo TOPIC... Se ti serve risalire alla macro dimmelo che la riscrivo qui...
Grazie assai e buona giornata,
eZio

EDIT:
ho trovato una strada alternativa che ha risolto il problema ;))
Sponsor
Inviato: Tuesday, November 23, 2010 2:53:00 PM

 
a10n11
Inviato: Wednesday, November 24, 2010 4:31:31 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
che soluzione hai trovato?

oramai l'ho fatta e ti posto la mia di soluzione via macro:

Se i dati nel foglio TabPivot sono rimasti disposti come nell'originale, selezionando una cella del campo dati della Tabella Pivot e lanciando la macro che segue, ti apparirà una Msgbox con il riferimento di cella del foglio2 da cui è partitorita la tabella Pivot.



Sub CercaSorgente()
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
NrTab2 = .Cells(6, col).Value
NrTab1 = .Cells(5, x).Value
Nr = .Cells(Riga, y).Value
Comp = .Cells(Riga, z).Value
End With
With Sheets("Foglio2")
Set area = .Range("C2", .Range("c2").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
End Sub

saluti
Giap

aetio
Inviato: Thursday, November 25, 2010 6:04:28 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
ho provato a lanciare la macro, ma non succede nulla... forse dovrei adattarla alle tabelle del file in cui l'ho inserita.
Ho all'uopo alcune domande per capire un pò quali sono i parametri chiave a cui si aggancia per lavorare:
x = 5
y = 2
z = 4

e
x = 22
y = 19
z = 21

e
NrTab2 = .Cells(6, col).Value
NrTab1 = .Cells(5, x).Value
Nr = .Cells(Riga, y).Value
Comp = .Cells(Riga, z).Value

che coordinate sono?
Ho invece intuito che le coordinate
Case 5 To 17
e
Case 22 To 34
si riferiscono alle colonne da/a delle 2 Tabelle Pivot del foglio omonimo, colonne contenenti i dati in questione.

L'istruzione
Set area = .Range("C2", .Range("c2").End(xlDown))
è corretta, con il Range C2 c2 ripetuto due volte?

M'ero già messo l'anima in pace (la soluzione alternativa era la classica ricerca "semi-mauale"), ma con questa macro hai riacceso le mie fervide speranze...
Grazie assai e buona serata,
eZio

a10n11
Inviato: Thursday, November 25, 2010 7:53:04 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
guarda il file
http://rapidshare.com/files/433111224/aetio-prova.zip
nel foglio TabPivot trovi le indicazioni delle variabili.
Ho creato la macro assegnata al pulsante "Trova" in base alla disposizione delle tabelle nei due fogli.
se nel tuo file cambia la disposizione cambia i riferimenti delle macro.

la riga
Set area = .Range("C2", .Range("c2").End(xlDown))
significa che assegna alla variabile Area la zona da C2 all'ultima cella occupata di C2

saluti
Giap

aetio
Inviato: Thursday, November 25, 2010 8:54:30 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
tutto STRA-CHIARISSIMO... con solo due parole e un esempio! La macro ora che l'ho adattata alle mie tabelle funziona da dio... uno spettacolo geniale...!!
Qual'è il significato di queste istruzioni?
NrTab2 = .Cells(6, col).Value
NrTab1 = .Cells(5, x).Value
Nr = .Cells(Riga, y).Value
Comp = .Cells(Riga, z).Value

Grazie infinite, mi hai risolto un inghippo molto importante. Sei davvero il migliore in assoluto (non è retorica, parlano i fatti....). Buona serata,
eZio
a10n11
Inviato: Thursday, November 25, 2010 10:08:00 PM

Rank: AiutAmico

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


Qual'è il significato di queste istruzioni?
NrTab2 = .Cells(6, col).Value
NrTab1 = .Cells(5, x).Value
Nr = .Cells(Riga, y).Value
Comp = .Cells(Riga, z).Value



Salve

NrTab1 = .Cells(5, x).Value
questa la puoi cancellare non serve più è un residuo di una ipotesi diversa.

NrTab2 = .Cells(6, col).Value
serve per sapere quale colonna della tabella 2 (nel foglio 2) è riferita alla cella selezionata.
Assume il valore delle celle del Foglio TabPivot di riga 6

Nr = .Cells(Riga, y).Value
serve per conoscere il numero di tabella 1 (nel foglio 2) assume il valore di colonna 2 per la prima tabella pivot e la cella di colonna 19 per la seconda tabella pivot

Comp = .Cells(Riga, z).Value
serve per conoscere il valore del componente di NR . assume il valore di colonna D per la prima Pivot e
di colonna U per la seconda Pivot.


Se la guardi bene la macro non è poi molto diversa dal gioco della battaglia navale.

saluti
Giap


aetio
Inviato: Friday, November 26, 2010 10:17:13 AM

Rank: AiutAmico

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

Se la guardi bene la macro non è poi molto diversa dal gioco della battaglia navale.

... Vero! :)
Ma è "un tantino" più complicata...!! :)))

Sto testardamente (giuro che la mia testa è dura come il granito...chi mi conosce lo sa benissimo!! ahahaha) cercando di applicare la macro ad una variante del tema, che anziché partire da un confronto tra le due tabelle lavora sul confronto tra una delle 2 tabelle e la col.AH (che è composta da valori da 1 a 10). Il risultato è che la tabella Pivot si compila alla perfezione, tutti i dati corrispondono, ma se applico la macro CercaSorgente con le dovute correzioni del caso (come mi hai spiegato in modo impeccabile sopra) non funziona correttamente perché il riferimento della cella di Foglio non è corretto: il valore di col.AH non corrisponde... Ecco i parametri di lavoro delle macro(del file adattate al nuovo lavoro:

Dim col As Integer
Dim Pr As Integer
Dim Tab2 As Integer
Sub confronta_Tabelle2()
With Sheets("TabPivot")
.Cells.Clear
End With
Intab2 = 8
Ftab2 = 20
Pr = 1
For Tab2 = 1 To 2
Range("AK2:BH" & Rows.Count).ClearContents
'Range("AK2:bH65536").ClearContents
uriga = Range("C" & Rows.Count).End(xlUp).Row
Riga = 2
col = 37
For n = 34 To 34
For A = Intab2 To Ftab2
For i = 2 To uriga
Cells(Riga, col).Value = Cells(i, n).Value
Cells(Riga, col + 1) = n - 2
Cells(Riga, col + 2) = A
Cells(Riga, col + 3) = Cells(i, A).Value
ctrl = True
If ctrl Then
Riga = Riga + 1
Else
Riga = Riga
End If
ctrl = False
Next i
Next A
A = 7
Call CreaPivot2
Pr = Pr + 1
Sheets("foglio2").Select
col = col
Riga = 2
Next n
Intab2 = 21
Ftab2 = 33
Next Tab2
End Sub

Sub CreaPivot2()
Select Case Tab2
Case 1
colp = 3
Rtab = Sheets("TabPivot").Cells(Rows.Count, colp).End(xlUp).Row + 3
'Rtab = Sheets("TabPivot").Range("C65536").End(xlUp).Row + 3
Case 2
colp = 20
Rtab = Sheets("TabPivot").Cells(Rows.Count, colp).End(xlUp).Row + 3
'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

laTabella Pivot dovrebbe avere in:
a) col.B e col.U i valori di col.AH di Foglio2
b) col.D e col.W i valori da col.H a col.AG di Foglio2
c) col.E:Q e col.X:AJ il valore più"recente" di col. AH di Foglio2

Usando l'ultima macro

Sub CercaSorgente()
With Sheets("TabPivot")
Riga = ActiveCell.Row
col = ActiveCell.Column
Select Case col
Case 5 To 17
x = 5
y = 2
Z = 4
Case 24 To 36
x = 24
y =21
Z = 23
End Select
NrTab2 = .Cells(6, col).Value
Nr = .Cells(Riga, y).Value
Comp = .Cells(Riga, Z).Value
End With
With Sheets("Foglio2")
Set area = .Range("H3", .Range("h3").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
End Sub

le condizioni viste sopra a) e b) si verificano regolarmente, mentre quando lancio la macro CercaSorgente la condizione c) va a spasso come vuole lei e mi restituisce delle coordinate errate, perché è vero che un valore uguale si trova in quella colonna, in quella riga, ma che non è correlato al suo valore di col.AH di Foglio2, mentre la tabella Pivot lo segnala correttamente...

quale errore concettuale (e a questo punto sostanziale) commetto nell'adattare l'ultima macro??
Grazie assai, buona giornata
eZio
a10n11
Inviato: Friday, November 26, 2010 11:00:50 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
forse dipenderà dal fatto che è passato un pò di tempo ma..
questa riga:

For n = 34 To 34
che senso ha?? attivi un ciclo per una sola scansione.

in questa riga:
Cells(Riga, col + 1) = n - 2
il senso è ancora più oscuro. Il valore che ne ricavi (32) a cosa fa riferimento??

saluti
Giap






aetio
Inviato: Saturday, November 27, 2010 11:14:48 AM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
beh!... devo confessarti che anch'io sono molto titubante e perplesso sulla validità di quest'applicazione della macro "confronta_Tabelle2" e la relativa macro "CreaPivot2"...
In realtà devo far fare un confronto tra una vera e propria tabella ed una sola colonna (è un codice interno, classificato da 1 a 10)
Prendendo il file-prova che hai preparato, devo fare il confronto tra la TABELLA2 (col.H:AG) e la col.AH
Quindi l'istruzione
For n = 3 To 7
l'ho barbaramente adattata in
For n = 34 To 34
In effetti l'istruzione
Cells(Riga, col + 1) = n - 2
è una vera e propria bestemmia, una dimenticanza... è Cells(Riga, col + 1) = n
La realtà è che purtroppo non so creare una macro ad hoc per questo caso specifico... e dato che ho un problema al quale devo trovare soluzione ho cercato un improbabile quanto goffo adattamento... in poche parole: sono un Unno..!!
Come avrei invece dovuto agire?
Ti Ringrazio assai per la tua pazienza... Buona giornata,
eZio

a10n11
Inviato: Saturday, November 27, 2010 11:45:01 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
Per impostare la sola colonna 34 come tabella di comparazione bastava eliminare il ciclo For come segue:


Code:

Sub confronta_Tabelle2()
With Sheets("TabPivot")
.Cells.Clear
End With
Intab2 = 8
Ftab2 = 20
Pr = 1
For Tab2 = 1 To 2
Range("AK2:BH" & Rows.Count).ClearContents
'Range("AK2:bH65536").ClearContents
uriga = Range("C" & Rows.Count).End(xlUp).Row
Riga = 2
col = 37
N=34
For A = Intab2 To Ftab2
For i = 2 To uriga
Cells(Riga, col).Value = Cells(i, n).Value
Cells(Riga, col + 1) = n
Cells(Riga, col + 2) = A
Cells(Riga, col + 3) = Cells(i, A).Value
ctrl = True
If ctrl Then
Riga = Riga + 1
Else
Riga = Riga
End If
ctrl = False
Next i
Next A
A = 7
Call CreaPivot2
Pr = Pr + 1
Sheets("foglio2").Select
col = col
Riga = 2
Intab2 = 21
Ftab2 = 33
Next Tab2
End Sub







Pertanto, la macro di ricerca sorgente andrà modificata come segue:

Code:

Sub CercaSorgente()
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
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
End Sub


saluti
Giap


aetio
Inviato: Saturday, November 27, 2010 2:08:59 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
questo è il classico caso in cui il vecchio e saggio modo di dire "annegare in un bicchier d'acqua" trova compimento.........
sono proprio un Unno...
Una domanda, grazie alla quale molto probabilmente mi meriterò un sonoro scappellotto:
in questa nuova macro l'istruzione della macro originaria "confronta_Tabelle2" A=7 diventa A=33?? O sbaglio.........
Grazie infinite, buon pomeriggio
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.