Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Claudio,
In alternativa, potrei postare una routine VBA da assegnare ad un pulsante.
Prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Menù | Inserisci | Modulo (oppure 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, critRng As Range
Dim vArrIn As Variant, vArrOut() As Variant
Dim vArrKeys As Variant
Dim oDic As Object
Dim sStr As String
Dim i As Long
Dim LRow As Long
Const sPrimoFoglio As String = "Foglio1" '<<=== Modifica
Const sSecondoFoglio As String = "Foglio2" '<<=== Modifica
Const iRigaIntestazioni As Long = 4 '<<=== Modifica
Const sCellaCriterio As String = "D2" '<<=== Modifica
Const sPrimaCellaReport As String = "A1" '<<=== Modifica
Const sIntestazione As String = _
"Nomi Univoci " '<<=== Modifica
Set WB = ThisWorkbook
With WB
Set srcSH = WB.Sheets(sPrimoFoglio)
Set destSH = WB.Sheets(sSecondoFoglio)
End With
With srcSH
LRow = LastRow(srcSH, .Columns("A:A"))
Set srcRng = .Range("A" & iRigaIntestazioni + 1 & ":B" & LRow)
Set critRng = .Range(sCellaCriterio)
End With
Set destRng = destSH.Range(sPrimaCellaReport)
vArrIn = srcRng.Value
Set oDic = CreateObject("Scripting.Dictionary")
With oDic
.CompareMode = 0
For i = LBound(vArrIn) To UBound(vArrIn)
sStr = critRng.Value
If UCase(vArrIn(i, 1)) = UCase(critRng.Value) Then
If Not .exists(sStr) Then
.Add Key:=vArrIn(i, 2), Item:=vbNullString
End If
End If
Next i
vArrKeys = Application.Transpose(SortedList(.keys))
destRng.Offset(1).Resize(.Count).Value = vArrKeys
destRng.Cells(1).Value = sIntestazione
End With
End Sub
'--------->>
Public Function SortedList(V As Variant)
Dim oSortedList As Object
Dim arrOut() As Variant
Dim sStr As String
Dim i As Long
Set oSortedList = CreateObject("System.Collections.Sortedlist")
With oSortedList
For i = LBound(V) To UBound(V)
sStr = V(i) ', 1)
If Not sStr = vbNullString Then
If Not .ContainsKey(sStr) Then
.Add Key:=sStr, Value:=i
End If
End If
Next i
ReDim arrOut(1 To .Count)
For i = 0 To .Count - 1
arrOut(i + 1) = .GetKey(i)
Next i
End With
SortedList = arrOut
End Function
'--------->>
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 Claudio20160703.xlsm a:
https://www.dropbox.com/s/mmxsc0smn4e4zk1/Claudio20160703.xlsm?dl=0
===
Regards,
Norman