Ciao Francesco,
In attesa del file di esempio e, ponendo che la colonna de lotto sia la colonna B e che la colonna per i codici sequenziali sia la colonna D, prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IMper 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 rngIn As Range, rngOut As Range, rCell As Range
Dim vArrIn As Variant, vArrUnique As Variant, vArrOut() As Variant
Dim Res As Variant
Dim i As Long
Dim LRow As Long
Const sFoglio As String = "Foglio1" '<<=== Modifica
Const sColonna_Lotto As String = "B:B" '<<=== Modifica
Const sColonna_CodiceSequenziale As String = "D:D" '<<=== Modifica
Set WB = ThisWorkbook
Set SH = WB.Sheets(sFoglio)
With SH
LRow = LastRow(SH, .Range(sColonna_Lotto))
Set rngIn = .Range(sColonna_Lotto).Resize(LRow)
End With
vArrIn = rngIn.Value
vArrUnique = SortedUniqueList(rngIn.Value)
ReDim vArrOut(1 To UBound(vArrIn), 1 To 1)
vArrOut(1, 1) = "Codice Sequenziale"
For i = 2 To UBound(vArrIn)
Res = Application.Match(CStr(vArrIn(i, 1)), vArrUnique, 0)
vArrOut(i, 1) = Res
Next i
Intersect(rngIn.EntireRow, SH.Columns(sColonna_CodiceSequenziale)).Value = vArrOut
End Sub
'-------->>
Public Function SortedUniqueList(V As Variant)
Dim oSortedUniqueList As Object
Dim arrOut() As Variant
Dim sStr As String
Dim i As Long
Set oSortedUniqueList = CreateObject("System.Collections.Sortedlist")
With oSortedUniqueList
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
SortedUniqueList = 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
===
Regards,
Norman
