Ciao DUBBO.,
Ciao a tutti!
Benvenuto alla Community!
io ho questa situazione leggermente diversa:
| A | B | C |
---+-------+-------+-------
1 | Nomi | Valori | Valori
2 | Mario | 12 | x
3 | Mario | 33 | x
4 | Mario | 31 | x
5 | Luca | 10 | y
6 | Luca | 4 | y
7 | Luca | 19 | y
8 | Andrea | 31 | z
9 | Andrea | 0 | z
10 | Andrea | 8 | z
Devo ottenere:
| A | B | C |
---+-------+-------+-------
1 | Nomi | Valori | Valori
2 | Mario | 12, 33, 31 | x
3 | Luca | 10, 4, 19 | y
4 | Andrea| 31, 0, 8 | z
in pratica:
se A1 identico A2:
A1 = A1
B1 = B1, B2
C1 = C1 (se C1 = C2 altrimenti C1, C2)
Infatti, credo che il problema sia intriscamente diversa!
Tuttavia, 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 SH As Worksheet
Dim srcRng As Range, destRng As Range
Dim arrIn As Variant, arrOut() As Variant
Dim arrKeys As Variant, arrItems As Variant
Dim arrKeys2 As Variant, arrItems2 As Variant
Dim oDic As Object, oDic2 As Object
Dim sStr As String
Dim dVal As Double
Dim vVal As Variant
Dim i As Long, j As Long, iCtr As Long
Dim LRow As Long
Dim CalcMode As Long
Const SFoglio As String = "Foglio1" '<<=== Modifica
Set WB = ThisWorkbook
Set SH = WB.Sheets(SFoglio)
With SH
LRow = LastRow(SH, .Columns("A:A"))
Set srcRng = .Range("A2:C" & LRow)
Set destRng = .Range("E1")
End With
arrIn = srcRng.Value
Set oDic = CreateObject("Scripting.Dictionary")
Set oDic2 = CreateObject("Scripting.Dictionary")
oDic.CompareMode = 1
oDic2.CompareMode = 1
For i = 1 To UBound(arrIn)
sStr = Trim(arrIn(i, 1))
dVal = arrIn(i, 2)
vVal = arrIn(i, 3)
With oDic
If Not .exists(sStr) Then
.Add Key:=sStr, Item:=dVal
oDic2.Add Key:=sStr, Item:=vVal
Else
.Item(sStr) = .Item(sStr) & "," & dVal
End If
End With
Next i
With oDic
arrKeys = .keys
arrItems = .items
iCtr = .Count
End With
With oDic2
arrKeys2 = .keys
arrItems2 = .items
End With
ReDim arrOut(1 To iCtr, 1 To 3)
For i = 1 To iCtr
arrOut(i, 1) = arrKeys(i - 1)
arrOut(i, 2) = arrItems(i - 1)
arrOut(i, 3) = arrItems2(i - 1)
Next i
On Error GoTo XIT
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
With destRng
.Offset(1).Resize(iCtr, 3).Value = arrOut
With .Resize(1, 3)
.Value = srcRng.Rows(0).Value
.Font.Bold = True
.Interior.Color = RGB(255, 255, 0)
End With
End With
XIT:
With Application
.Calculation = CalcMode
.ScreenUpdating = True
End With
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
Nonostante la lunghezza del codice, il tempo di esecuzione è marginalmente più di 1 millisecondo.
Potresti scaricare il mio file di prova Dubbo20160923.xlsma:
https://www.dropbox.com/s/3dmvy0q25yz42rs/Dubbo20160923.xlsm?dl=0
In questo file, ho assegnato la macro ad un pulsante sul Foglio1.
Mi rendo conto che sei nuovo alla Community e non sarai quindi consapevoli del modus operandi di questo forum, ma, per riferimento futuro, vorrei suggerire che sia meglio di non accodarsi a post chiusi e ormai vecchi. Ciò consentirà di massimizzare le possibilità
di ricevere risposte utili e aiuterà anche coloro che potessero cercare soluzioni ai problemi simili negli archivi della Community.
Alla prossima.
===
Regards,
Norman
