Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Luca,
Per rendere il mio codice più robusto e resiliente e per eliminare uno specifico bug minore, prova a sostituire il mio codice con la seguente versione:
'========>>
Option Explicit
Option Compare Text
'-------->>
Public Sub Tester()
Dim WB As Workbook
Dim srcSH As Worksheet, SH\_Attiva As Worksheet, SH\_Scaduta As Worksheet, SH\_InScadenza As Worksheet
Dim srcRng As Range, destRng As Range
Dim arrIn As Variant, arrAttiva() As Variant, arrScaduta() As Variant, arrInScadenza() As Variant
Dim sStr As String
Dim i As Long, j As Long
Dim iRow As Long, jRow As Long, kRow As Long
Dim iCtr As Long, jCtr As Long, kCtr As Long
Const sFoglio\_Sorgente As String = **"Foglio1" '<<=== Modifica**
Const sFoglio\_Attiva As String = **"Attiva" '<<=== Modifica**
Const sFoglio\_Scaduta As String = **"Scaduta" '<<=== Modifica**
Const sFoglio\_InScadenza As String = **"In Scadenza" '<<=== Modifica**
Set WB = ThisWorkbook
With WB
Set srcSH = .Sheets(sFoglio\_Sorgente)
If SheetExists(sFoglio\_Attiva) Then
Set SH\_Attiva = .Sheets(sFoglio\_Attiva)
Else
Set SH\_Attiva = .Sheets.Add
SH\_Attiva.Name = sFoglio\_Attiva
End If
If SheetExists(sFoglio\_Scaduta) Then
Set SH\_Scaduta = .Sheets(sFoglio\_Scaduta)
Else
Set SH\_Scaduta = .Sheets.Add
SH\_Scaduta.Name = sFoglio\_Scaduta
End If
If SheetExists(sFoglio\_InScadenza) Then
Set SH\_InScadenza = .Sheets(sFoglio\_InScadenza)
Else
Set SH\_InScadenza = .Sheets.Add
SH\_InScadenza.Name = sFoglio\_InScadenza
End If
End With
With srcSH
iRow = LastRow(srcSH, .Columns("A"))
Set srcRng = .Range("A1").Resize(iRow, 2)
End With
arrIn = srcRng.Value
ReDim arrAttiva(1 To UBound(arrIn))
ReDim arrScaduta(1 To UBound(arrIn))
ReDim arrInScadenza(1 To UBound(arrIn))
For i = LBound(arrIn) To UBound(arrIn)
Select Case arrIn(i, 2)
Case "Attiva"
sStr = arrIn(i, 1)
If IsValidEmail(sStr) Then
iCtr = iCtr + 1
arrAttiva(iCtr) = sStr
End If
Case "Scaduta"
sStr = arrIn(i, 1)
If IsValidEmail(sStr) Then
jCtr = jCtr + 1
arrScaduta(jCtr) = sStr
End If
Case "In Scadenza"
sStr = arrIn(i, 1)
If IsValidEmail(sStr) Then
kCtr = kCtr + 1
arrInScadenza(kCtr) = sStr
End If
End Select
Next i
With SH\_Attiva
jRow = LastRow(SH\_Attiva, .Columns("A"))
kRow = LastRow(SH\_Attiva, .Columns("C"), jRow + 1)
ReDim Preserve arrAttiva(1 To iCtr)
.Range("A" & jRow + 1).Resize(iCtr).Value = Application.Transpose(arrAttiva)
.Range("C" & kRow).Value = Join(arrAttiva, ", ")
.UsedRange.EntireColumn.AutoFit
End With
With SH\_Scaduta
jRow = LastRow(SH\_Scaduta, .Columns("A"))
kRow = LastRow(SH\_Scaduta, .Columns("C"), jRow + 1)
ReDim Preserve arrScaduta(1 To jCtr)
.Range("A" & jRow + 1).Resize(jCtr).Value = Application.Transpose(arrScaduta)
.Range("C" & kRow).Value = Join(arrScaduta, ", ")
.UsedRange.EntireColumn.AutoFit
End With
With SH\_InScadenza
jRow = LastRow(SH\_InScadenza, .Columns("A"))
kRow = LastRow(SH\_InScadenza, .Columns("C"), jRow + 1)
ReDim Preserve arrInScadenza(1 To kCtr)
.Range("A" & jRow + 1).Resize(kCtr).Value = Application.Transpose(arrInScadenza)
.Range("C" & kRow).Value = Join(arrInScadenza, ", ")
.UsedRange.EntireColumn.AutoFit
End With
Call MsgBox(Prompt:="Fatto", Buttons:=vbInformation, Title:="REPORT")
End Sub
'--------->>
Public Function SheetExists(sSheetName As String, _
Optional ByVal WB As Workbook) As Boolean
On Error Resume Next
If WB Is Nothing Then
Set WB = ThisWorkbook
End If
SheetExists = CBool(Len(WB.Sheets(sSheetName).Name))
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
'-------->>
Public Function IsValidEmail(sEmailAddress As String) As Boolean
Dim sEmailPattern As String
Dim oRegEx As Object
Dim bReturn As Boolean
sEmailPattern = "^([a-zA-Z0-9\_\-\.]+)@[a-z0-9-]+(\.[a-z0-9-]+)\*(\.[a-z]{2,3})$"
Set oRegEx = CreateObject("VBScript.RegExp")
oRegEx.Global = True
oRegEx.IgnoreCase = True
oRegEx.Pattern = sEmailPattern
bReturn = False
If oRegEx.Test(sEmailAddress) Then
If oRegEx.Test(sEmailAddress) Then
bReturn = True
End If
Else
bReturn = False
End If
IsValidEmail = bReturn
End Function
'<<========
Ho aggiornato il mio file di prova Luca20230210.xlsm
===
Regards,
Norman