Ciao Luca,
Benvenuto alla Comunity!
vorrei chiedere una delucidazione in merito alla possibilità di sommare celle in excel in base a determinati criteri.
Mi trovo a lavorare su un foglio excel caratterizzato da poco più di 6000 righe (record). Moltissimi record nella prima colonna (colonna A nell'esempio) sono caratterizzati dallo stesso numero, mentre nella seconda colonna (colonna B nell'esempio) il numero
è differente. Vorrei chiedere se fosse possibile impostare una funzione che possa permettermi di sommare, per tutti i record caratterizzati dallo stesso valore nella colonna A, i valori della colonna B in maniera tale da restituire il valore totale in un'unica
cella in alto e cancellare quelle successive caratterizzate dallo stesso valore nella colonna A.
ESEMPIO:
COLONNA A COLONNA B
record1 100 0,5
2 100 12
3 100 1,7
4 101 15
5 102 0,4
6 102 14,5
7 102 7
8 102 5,01
9 102 16
vorrei che il record 1 abbia nella colonna A il valore 100 e nella colonna B la somma (0,5+12+1,7) in maniera tale da eliminare i record successivi caratterizzati dallo stesso valore nella colonna A. Vorrei che tutto questo sia riproducibile per tutti i
record del mio foglio excel.
Quindi per ricapitolare:
COLONNA A COLONNA B
record 1 100 somma(0,5+12+1,7)
record 2 101 15
record 3 102 somma (0,4+14,5+7+5,01+16)
Qualcuno mi può aiutare?
Prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice:
'=========>>
Option Explicit
'--------->>
Public Sub Tester()
Dim WB As Workbook
Dim srcSH As Worksheet, destSH As Worksheet
Dim srcRng As Range, destRng As Range
Dim arrIn As Variant
Dim oDic As Object
Dim sStr As String
Dim dVal As Double
Dim LRow As Long, iRows As Double
Dim arrKeys As Variant, arrItems As Variant
Dim i As Long, j As Long, k As Long
Const sFoglioDati As String = "Foglio1" '<<=== Modifica
Const sFoglioRisultati As String = "Foglio2" '<<=== Modifica
Const iRigaIntestazioni As Long = 1 '<<=== Modifica
Set WB = ThisWorkbook
With WB
Set srcSH = .Sheets(sFoglioDati)
Set destSH = .Sheets(sFoglioRisultati)
End With
With srcSH
LRow = LastRow(srcSH, .Columns("A"))
Set srcRng = .Range("A" & iRigaIntestazioni + 1). _
Resize(LRow - iRigaIntestazioni, 2)
End With
With destSH
.Columns("A:B").ClearContents
Set destRng = .Range("A2")
End With
arrIn = srcRng.Value
Set oDic = CreateObject("Scripting.Dictionary")
With oDic
.CompareMode = vbTextCompare
For i = 1 To UBound(arrIn)
sStr = arrIn(i, 1)
dVal = arrIn(i, 2)
If Not .exists(sStr) Then
.Add Key:=sStr, Item:=dVal
Else
.Item(sStr) = .Item(sStr) + dVal
End If
Next i
arrKeys = Application.Transpose(.keys)
arrItems = Application.Transpose(.items)
iRows = .Count
End With
On Error GoTo XIT
Application.ScreenUpdating = False
With destRng
.Offset(-1).Resize(1, 2).Value = srcRng.Rows(0).Value
With .Resize(iRows)
.Columns(1).Value = arrKeys
.Columns(2).Value = arrItems
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
End With
XIT:
Application.ScreenUpdating = True
End Sub
'--------->>
Public Function LastRow(SH As Worksheet, _
Optional Rng As Range, _
Optional minRow As Long = 1)
If Rng Is Nothing Then
Set Rng = SH.Cells
End If
On Error Resume Next
LastRow = Rng.Find(What:="*", _
after:=Rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
If LastRow < minRow Then
LastRow = minRow
End If
End Function
'<<=========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel
- Salva il file con l’estensione xlsm
- Alt+F8 per aprire la finestra di gestione delle macro
- Seleziona Tester | Esegui
Potresti scaricare il mio file di prova Luca20170307.xlsm a:
https://www.dropbox.com/s/8w8dkcmpqtrefkl/Luca20170307.xlsm?dl=0
===
Regards,
Norman
