Mi si è liberato uno spazio di tempo e ho provato a buttare giù una
procedura.
Prova con le tue stringhe in questo file di esempio (basta che compili
la colonna D per avere il numero di righe dell'intervallo e la colonna H
per avere le stringhe):
https://www.dropbox.com/scl/fi/bpm1xlglxbuz0g3zpg414/splittare-una-stringa.xlsm?rlkey=dd31ehyuryjj3zlqlbkh2w41l&dl=0
La procedura che effettua la popolazione delle colonne in base alle tue
ultime indicazioni sfrutta, a sua volta, una funzione nominata
"SplittaStringa" che splitta la singola stringa in base ad una serie di
caratteri separatori che ho individuato in questa matrice:
arrSeparatori = Array("\", "-", "(", ")", ".")
Questo il codice completo presente nel modulo 1:
Option Explicit
Sub ProceduraSplittaStringhe()
Const sNomeFoglioStringhe As String = "Foglio1"
Const sColEstensioneTabella As String = "D"
Const sColStringheDaSplittare As String = "H"
Const iRigaIntestazione As Long = 5
Dim PrimaRiga As Long
Dim UltimaRiga As Long
Dim NumeroRighe As Long
Dim rngEstTab As Range
Dim rngStringheDaSplittare As Range
Dim arrStringheDaSplittare As Variant
Dim i As Long, j As Long, y As Long
Dim arrTmp As Variant
Dim arrColA() As Variant
Dim arrColN() As Variant
Dim arrColL() As Variant
Dim ArrColC() As Variant
Dim ArrCoZ() As Variant
Dim MaxUbColRes As Long
PrimaRiga = iRigaIntestazione + 1
With ThisWorkbook
With .Worksheets(sNomeFoglioStringhe)
Set rngEstTab = .Columns(sColEstensioneTabella)
UltimaRiga = Application.Max(PrimaRiga, _
rngEstTab.Find(What:="*", _
After:=rngEstTab.Cells(1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row)
Set rngStringheDaSplittare = .Range(sColStringheDaSplittare &
PrimaRiga & ":" & sColStringheDaSplittare & UltimaRiga)
arrStringheDaSplittare = rngStringheDaSplittare.Value2
NumeroRighe = UltimaRiga - PrimaRiga + 1
ReDim arrColA(1 To NumeroRighe, 1 To 1)
ReDim arrColN(1 To NumeroRighe, 1 To 1)
ReDim arrColL(1 To NumeroRighe, 1 To 1)
ReDim ArrColC(1 To NumeroRighe, 1 To 1)
For i = 1 To NumeroRighe
If NumeroRighe = 1 Then
arrTmp = SplittaStringa(CStr(arrStringheDaSplittare))
Else
arrTmp = SplittaStringa(CStr(arrStringheDaSplittare(i, 1)))
End If
For j = LBound(arrTmp) To UBound(arrTmp)
Select Case j
Case 0
arrColA(i, 1) = arrTmp(j)
Case 1
arrColN(i, 1) = arrTmp(j)
Case 2
arrColL(i, 1) = arrTmp(j)
Case 3
ArrColC(i, 1) = arrTmp(j)
Case Is > 3
MaxUbColRes = Application.Max(MaxUbColRes,
UBound(arrTmp) - 3)
ReDim Preserve ArrCoZ(1 To NumeroRighe, 1 To
MaxUbColRes)
For y = 4 To UBound(arrTmp)
ArrCoZ(i, y - 3) = arrTmp(y)
Next y
End Select
Next j
Erase arrTmp
Next i
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
.Range("A" & PrimaRiga).Resize(NumeroRighe, 1).Value = arrColA
.Range("N" & PrimaRiga).Resize(NumeroRighe, 1).Value = arrColN
.Range("L" & PrimaRiga).Resize(NumeroRighe, 1).Value = arrColL
.Range("C" & PrimaRiga).Resize(NumeroRighe, 1).Value = ArrColC
.Range("Z" & PrimaRiga).Resize(NumeroRighe, UBound(ArrCoZ,
2)).Value = ArrCoZ
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End With ' .Worksheets(sNomeFoglioStringhe)
End With ' ThisWorkbook
End Sub
Function SplittaStringa(str As String) As Variant
Const SepU As String = "\"
Dim arrSeparatori As Variant
arrSeparatori = Array("\", "-", "(", ")", ".")
Dim arrStringhe As Variant
Dim sep As Variant
For Each sep In arrSeparatori
str = Replace(str, sep, SepU)
Next sep
SplittaStringa = Split(str, SepU)
End Function