La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Ciao a tutti,
sono un utente di Excel (ho la versione 2019) avrei necessità di estrarre da un database, (nell'esempio allegato, foglio "Dati") i totali per riga, questi devono essere raggruppati in un nuovo foglio ("Riepilogo"). E'un'operazione che normalmente faccio con una pivot, ma in questo caso devo aggiungerla ad una istruzione in una macro che fa altre cose, per cui mi servirebbe un istruzione VBA.
Potreste aiutarmi? Grazie molte.
ciao
Ciao
Hai allegato un file .xlsx (quindi senza macro) e non mi sembra il caso di suggerire qualcosa che potrebbe interferire con l'altra macro che dici di avere nel file. Nella risposta (se rispondi) aggiungi anche in che maniera il codice deve funzionare (con un pulsante, con qualche evento o come)
Ciao,
Mario
Ciao Mario,
la rendo più sempice: considera il file che ho allegato fine a se stesso; cioè ho un foglio con una serie di dati (foglio "Dati"), devo ottenere un foglio ("Riepilogo") equivalente a quello che otterrei con una pivot, in forma di tabella, e con un'istruzione in VBA, il pulsante poi lo metto io.
Grazie
Ciao
Ti suggerisco step by step (pensa tu a trasformarli in codice VBA)
Copia i dati delle colonne A:B del primo Foglio e incollale nel secondo Foglio; elimina i doppioni; crea un ciclo relativo ai nomi del secondo foglio e "spazzola" i dati del primo Foglio: se i dati sono uguali somma i valori in una variabile; alla fine del secondo ciclo scrivi il valore della variabile su Foglio2; azzera la variabile e ripeti.
Se hai difficoltà, chiedi pure.
Ciao,
Mario
Ciao, se lo sapessi fare non avrei scritto.
non è possibile avere un codice vba che io possa utilizzare ed eventualmente adeguare?
Grazie
Ciao
Quindi NON conosci VBA. Però vorresti il codice "bello e pronto"! E in caso, possibilissimo, di mal funzionamento come pensi di poterlo "adeguare"? Credo che la cosa migliore sarebbe "imparare" VBA e poi cimentarsi nelle problematiche.
Non sono d'accordo a dare in mano a qualcuno un'arma che non sa utilizzare.
Scusami ma la penso così. Ciao,
Mario
mah! non mi sembrava aver chiesto una cosa così complicata.
Avevo realizzato un codice vba con il registratore di macro che simulava il comportamento di una tabella Pivot, ma era una schifezza e comunque non teneva conto del variare dei dati.
Lo scrivo qui sotto, giusto per far capire che comunque un po' di impegno c'è l'ho messo.
Avevo anche scelto la strada della formula matriciale:
=INDICE($A$2:$A$21;CONFRONTA(0;CONTA.SE($E$1:E1;$A$2:$A$21);0))
=SOMMA.SE($A$2:$A$21;E2;$C$2:$C$21)
raggruppa i dati, si, ma anche questa presenta dei limiti: devo comunque copiare l'intervallo di dati ed ovviamente, non è sempre lo stesso.
Mi sembra esagerata la tua preoccupazione, ma comunque rispetto il tuo pensiero.
Buona serata anche a te.
Sub Macro1()
'
' Macro1 Macro
'
'
Sheets("Dati").Select
Range("B12").Select
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Dati!R1C1:R21C3", Version:=6).CreatePivotTable TableDestination:= _
"Foglio5!R3C1", TableName:="Tabella pivot4", DefaultVersion:=6
Sheets("Foglio5").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("Tabella pivot4")
.ColumnGrand = True
.HasAutoFormat = True
.DisplayErrorString = False
.DisplayNullString = True
.EnableDrilldown = True
.ErrorString = ""
.MergeLabels = False
.NullString = ""
.PageFieldOrder = 2
.PageFieldWrapCount = 0
.PreserveFormatting = True
.RowGrand = True
.SaveData = True
.PrintTitles = False
.RepeatItemsOnEachPrintedPage = True
.TotalsAnnotation = False
.CompactRowIndent = 1
.InGridDropZones = True
.DisplayFieldCaptions = True
.DisplayMemberPropertyTooltips = False
.DisplayContextTooltips = True
.ShowDrillIndicators = True
.PrintDrillIndicators = False
.AllowMultipleFilters = False
.SortUsingCustomLists = True
.FieldListSortAscending = False
.ShowValuesRow = False
.CalculatedMembersInFilters = False
.RowAxisLayout xlTabularRow
End With
With ActiveSheet.PivotTables("Tabella pivot4").PivotCache
.RefreshOnFileOpen = False
.MissingItemsLimit = xlMissingItemsDefault
End With
ActiveSheet.PivotTables("Tabella pivot4").RepeatAllLabels xlRepeatLabels
With ActiveSheet.PivotTables("Tabella pivot4").PivotFields("Nome")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tabella pivot4").PivotFields("Descrizione")
.Orientation = xlRowField
.Position = 2
End With
ActiveSheet.PivotTables("Tabella pivot4").AddDataField ActiveSheet.PivotTables( _
"Tabella pivot4").PivotFields("qta"), "Somma di qta", xlSum
Range("A6").Select
ActiveSheet.PivotTables("Tabella pivot4").PivotFields("Nome").Subtotals = Array _
(False, False, False, False, False, False, False, False, False, False, False, False)
Range("B6").Select
ActiveSheet.PivotTables("Tabella pivot4").PivotFields("Descrizione").Subtotals _
= Array(False, False, False, False, False, False, False, False, False, False, False, False _
)
ActiveSheet.PivotTables("Tabella pivot4").PivotSelect "Descrizione[All]", _
xlLabelOnly, True
Range("A2:C9").Select
Selection.Copy
Sheets("Riepilogo").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Rows("1:2").Select
Range("A2").Activate
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Rows("6:6").Select
Selection.Delete Shift:=xlUp
Range("B5").Select
End Sub
Ciao @Maxck2813
se posso esserti di aiuto, anziché piazzarti la macro già bella e pronta, ti scrivo passo passo ciò che Marius ti ha indicato. Se segui attentamente ciò che è scritto e traduci ogni rigo in codice VBA, vedrai che riuscirai nella tua richiesta. Prova a vedere fin dove arrivi, poi posta la tua soluzione. A quel punto gli diamo una "ripulita" se serve. Se cerchi in rete, troverai ogni indicazione che ho scritto:
Sub raggruppa() 'dichiara 4 variabili come LONG 'dichiara 1 variabile come DOUBLE 'disabilita l'aggiornamento dello schermo 'utilizza la prima variabile LONG e calcola l'ultima cella compilata nella colonna B del foglio DATI 'cella A1 del foglio RIEPILOGO = cella A1 del foglio DATI 'cella B1 del foglio RIEPILOGO = cella B1 del foglio DATI 'cella C1 del foglio RIEPILOGO = cella C1 del foglio DATI 'l'intervallo di celle (B2:B & la prima variabile LONG) del foglio RIEPILOGO = l'intervallo di celle (B2:B & la prima variabile LONG) del foglio DATI 'all'intervallo che hai appena copiato nel foglio RIEPILOGO, rimuovi i duplicati. Utilizza il metodo 'RemoveDuplicates'. Aiutati con il registratore di macro per capire come fare. 'ordina l'intervallo utilizzando il metodo 'Sort'. Anche qui aiutati con il registratore di macro 'utilizza la seconda variabile LONG per calcolare l'ultima cella compilata della colonna B del foglio RIEPILOGO 'utilizza la terza variabile LONG in un ciclo FOR...NEXT che va da 2 alla seconda variabile LONG 'imposta la variabile DOUBLE = 0 'utilizza la quarta variabile LONG per un secondo ciclo FOR...NEXT che va da 2 alla prima variabile LONG 'fai un confronto con IF, dove valuti se il contenuto della cella (B & terza variabile LONG) del foglio RIEPILOGO è uguale alla contenuto della cella (B & prima variabile LONG) del foglio DATI 'se il confronto è uguale, allora la variabile DOUBLE = variabile DOUBLE + contenuto della cella (C & quarta variabile DOUBLE) del foglio DATI 'la cella (A & seconda variabile LONG) del foglio RIEPILOGO = alla cella (A & quarta variabile LONG) del foglio DATI 'la cella (C & seconda variabile LONG) del foglio RIEPILOGO = variabile DOUBLE 'chiudi il secondo ciclo FOR...NEXT 'chiudi primo ciclo FOR...NEXT 'applica il 'NumberFormat' = "0.00" alla colonna 3 del foglio RIEPILOGO (Columns(3).NumberFormat = "0.00") 'abilita l'aggiornamento dello schermo 'mostra messaggio "Fatto!" End Sub
Grazie per i consigli e per il tempo che avete dedicato alla mia richiesta. Ci lavoro un po' e seguirò i vostri consigli.
Buona serata