|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, questa macro
Dim col As Integer Dim Pr As Integer Dim Tab2 As Integer Sub confronta_Tabelle2() '-------edita la pagina TabPivot filtrando i dati di tabella2 (H:AG) '-------e di Freq. (Col.AH) '-------Nasconde già i Subtotali With Sheets("TabPivot") .Cells.Clear End With Intab2 = 8 Ftab2 = 20 Pr = 1 For Tab2 = 1 To 2 Range("AK2:BH" & Rows.Count).ClearContents Uriga = Range("H" & Rows.Count).End(xlUp).Row riga = 2 col = 37 n = 34 For A = Intab2 To Ftab2 For i = 3 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 = 33 Call CreaPivot2 Pr = Pr + 1 Sheets("foglio2").Select col = col riga = 2 Intab2 = 21 Ftab2 = 33 Next Tab2 End Sub
a cui è associata ques'altra
Sub CreaPivot2() 'macro abbinata alla "confronta_Tabelle2" Select Case Tab2 Case 1 colp = 3 Rtab = Sheets("TabPivot").Cells(Rows.Count, colp).End(xlUp).Row + 3 Case 2 colp = 22 Rtab = Sheets("TabPivot").Cells(Rows.Count, 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 With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Somma di Numero") .Function = xlCount .Caption = "conteggio di numero" End With 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 ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Numero").Subtotals = _ Array(False, False, False, False, False, False, False, False, False, False, False, False) Set rng = Nothing End Sub
esegue egregiamente il suo enorme lavoro. Ora, ho una serie di tabelle in cui nelle celle della col.AH anziché un numero (es.9) c'è scritto un codice alfanumerico (es.9G) [è l'unica variazione rispetto alle tabelle in cui le macro funzionano alla perfezione] Eseguendo le macro viene restituito un Errore di run-time '1004' Impossibile trovare la proprietà PivotFields per la classe PivotTable.
Nel modulo VBa della Sub CreaPivot2 la riga che sopra è scritta in rosso viene evidenziata in giallo.
Come posso istruire la macro affinché possa lavorare col codice alfanumerico (es.9G)?
Grazie assai, buona serata eZio
.
|
|
|
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve edit.. a memoria ,si fanno solo confusioni. l'errore fa riferimento alla generazione stessa della tabella. quindi l'errore è da tutt'altra parte. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto: edit.. a memoria ,si fanno solo confusioni. l'errore fa riferimento alla generazione stessa della tabella. quindi l'errore è da tutt'altra parte.
ah!... allora devo scovare dove si nasconde quel subdolo guastafeste. Grazie assai, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, so che forse mi merito una bocciatura: in modo assolutamente empirico ho provato a commentare il gruppo di istruzioni a cui apparteneva la riga evidenziata nell'avviso di errore, precisamente With ActiveSheet.PivotTables("Tabella_pivot" & Pr).PivotFields("Somma di Numero") .Function = xlCount .Caption = "conteggio di numero" End With della sub CreaPivot2 col risultato che ora funziona tutto fino al termine senza restituire errori. Ho quindi fatto un pò di prove random, col risultato che i dati della TabPivot confrontati con le tabelle a cui si riferiscono sono tutti esatti e collimano alla perfezione. A questo punto però mi chiedo: cosa ho escluso dal lavoro della macro? Credo le righe dei "totali" della TabPivot, che però a me in questa ricerca non interessano, per cui se è solo quello il problema (ed è procedimento ammesso)... non c'è problema. ;-))
Grazie assai, buona giornata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, EDIT. a10n11 ha scritto: a memoria ,si fanno solo confusioni.
Hai pienamente ragione... ho preparato un file Esempio per meglio definire il problema. Grazie assai, buona serata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
EDIT..
Inserendo manualmente i dati mancanti nelle col.B e U del foglio TabPivot e facendo eseguire la sub che generava l'errore (evidenziaInTabella4) il foglio CATASTE si compila regolarmente senza più restituire errore. Credo quindi in modo assai verosimile che l'errore sia generato proprio da quei dati mancanti non so però individuare il motivo della mancata compilazione delle col. B e U
Grazie assai (quanta pazienza che hai!!) eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
RI-EDIT (!!)
Finalmente sono riuscito a capire il problema che ho esposto qui sopra... ( :-)) ) l'errore era in questa sub
Sub Per_filtro_tabella_Pivot() With Sheets("TabPivot") Uriga = .Range("D" & Rows.Count).End(xlUp).Row col = 3 col2 = 2 For i = 1 To 2 For n = 6 To Uriga If IsNumeric(.Cells(n, col)) And .Cells(n, col).Value > 0 Then .Cells(n, col2).Value = .Cells(n, col) Else If .Cells(n, col) = "" And .Cells(n, col + 1) <> "" Then .Cells(n, col2).Value = .Cells(n - 1, col2) End If End If Next n col = 22 col2 = 21 Next i End With End Sub
che, siccome siamo di fronte ad un valore di tipo NumeroLettera (es.3G), la riga scritta in rosso andava modificata così:
If Not IsNumeric(.Cells(n, col)) And .Cells(n, col).Value > 0 Then
Quindi questo problema nel problema è risolto. [Halleluya!!]
Resta comunque da comprendere il motivo per cui devo commentare quelle righe per far funzionare le macro (abbinate) confronta_Tabelle2 e CreaPivot2. L'unica differenza che c'è fra queste tabelle e quelle in cui si esegue perfettamente la macro CreaPivot2 "standard" (quella senza le righe commentate, nelle tabelle di soli numeri) è che la col. AH anziché essere un numero è espressa con un valore alfanumerico. Forse può essere utile questo dettaglio: la tabella compilata in foglio2 (col.AH:AN), nel momento della restituzione dell'errore, è arrivata esattamente all'ultima cella della tabella di sinistra compilata in foglio TabPivot (col.20 di foglio2).quindi c'è qualche ostacolo "tecnico" che impedisce di compilare anche la tabella di destra (col.21:33 di foglio2). Dato che con quelle righe commentate la macro restituisce tabelle con i dati che mi interessano esatti, non so se in tal modo innesco altri problemi. In ogni caso se hai inserito quelle righe nella macro ci sarà stato un validissimo motivo (che a me sfugge).
(Nota: nel foglio TabPivot dell'esempio la tabella di destra è più alta di quella di sinistra: è solo dovuto al fatto che le tabelle di origine dell'esempio (quelle di Foglio 2) non contengono tutti i codici. In realtà la tabella di des. è sempre alta come qella di sin.)
Grazie assai eZio
|
|
Guest |