Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

splittare una stringa

66 views
Skip to first unread message

Final Job

unread,
Feb 7, 2024, 6:56:43 PMFeb 7
to
Salve.

Foglio1. Devo splittare la stringa contenuta in un un campo della
tabella (colonna N).

Queste stringhe contengono ognuna una serie di informazioni divise fra
loro da alcuni separatori che possono essere usati una o più volte in
una stessa stringa. Sono: \ - ( ) e "."

Per ogni stringa, devo scorporare i testi contenuti tra due di questi
separatori. Inoltre, ho più il primo testo della stringa (che vede un
solo separatore alla fine del testo) e l'ultimo (che vede un solo
separatore all'inizio del testo).

Le parti splittate (senza spazi iniziali e finali) vanno raggruppate nel
Foglio2 inserendole ognuna in una colonna che li raccoglie secondo la
loro posizione nella "Stringa Madre":

la prima parte della stringa nella colonna J
l'eventuale seconda parte nella colonna M
l'eventuale terza parte nella colonna P
l'eventuale quarta parte nella colonna D
l'eventuale quinta parte nella colonna E
l'eventuale sesta parte nella colonna G
l'ultima parte della stringa, qualsiasi sia la quantità delle
precedenti, nella colonna W

La riga è la stessa del dato originale.

La prima riga dati è la 6.

Come si può fare?
Se possibile. Grazie.
Ale

casanmaner

unread,
Feb 8, 2024, 3:51:49 AMFeb 8
to
Ciao Ale,
un file contenente un buon numero di esempi reali di strighe da lavorare
sarebbe l'ideale per poter capire esattamente cosa fare.

Inoltre delle varie condizioni l'ultima, cioé questa:

>l'ultima parte della stringa, qualsiasi sia la quantità delle
> precedenti, nella colonna W

Le domande sono queste:
- se una stringa è composta solo di 3 parti comunque in colonna W
vorresti la terza parte? O ci si ferma ai dati in colonna P.

- una ipotetica stringa potrebbe contenere più di sei parti e quindi la
W sarebbe, ove presente la settima? E sarebbe il numero massimo di
sottoparti possibili?
O potrebbero anche esserci 8/9/10 ecc. sottoparti e a te interessa in
colonna W solo l'ultima? (es. ci sono 8 parti in colonna W solo l'ottava
saltando la settima?
O vorresti che tutte le parti successive alla sesta venissero "riunite"
in una stringa unica da riportare in colonna W?


Detto questo di certo la procedura è complessa perché, in pratica, vanno
create tante matrici distinte per colonna da riempire con diverse
verifiche per dimesione di matrice di ciascuna singola stringa, per riga.
Con ulteriori complessità se, dopo la sesta parte, occorresse "riunire"
le parti dalla settima in poi (ove ve ne fossero).
Insomma un bell'intreccio :)



casanmaner

unread,
Feb 8, 2024, 4:03:24 AMFeb 8
to
Il 08/02/2024 09:51, casanmaner ha scritto:

> Insomma un bell'intreccio :)
Tenuto conto che ogni matrice dovrebbe essere suddivisa in singole
sottomatrici se uno degli elementi che la compongono presenta un
separatore ulteriore.

casanmaner

unread,
Feb 8, 2024, 4:19:48 AMFeb 8
to
Comunque per questo penso che la soluzione più pratica sia di sostituire
a ciascuna stringa tutti i vari separatori con un unico separatore unico.
Così poi si otterebbe un'unica matrice splittando in base al separatore
unico.

issdr

unread,
Feb 8, 2024, 4:34:39 AMFeb 8
to
casanmaner wrote:

> Detto questo di certo la procedura è complessa perché, in pratica,
> vanno create tante matrici distinte per colonna da riempire con
> diverse verifiche per dimesione di matrice di ciascuna singola
> stringa, per riga.

la complessità dipende dalle risposte che darà Ale; mi sembra di
ricordare non abbia 365, il modo più semplice di procedere è
probabilmente via UDF.

@Final Job, esci ancora in binario, occhio. vai nel configuratore
avanzato e cerca le voci con "stricly_mime" (purtroppo da dove sono non
posso aiutarti di più)

issdr

unread,
Feb 8, 2024, 4:35:41 AMFeb 8
to
issdr wrote:

> stricly_mime

strictly_mime

Final Job

unread,
Feb 8, 2024, 7:04:20 AMFeb 8
to
Il 08/02/2024 00:56, Final Job ha scritto:
Mi rendo conto della complessità quindi ho modificato tutto.

Penso di procedere con un ciclo for next che per ogni record del
foglio1, al campo della colonna H, prima di tutto vada a uniformare
tutti i separatori con un unico "\" poi vada a splittare la stringa
modificata inserendo i relativi spezzoni rispettivamente:
1° nella colonna A del foglio2 alla stessa riga della stringa di origine
nel foglio1
2° nella colonna N del foglio2 alla stessa riga della stringa di origine
nel foglio1
3° nella colonna L del foglio2 alla stessa riga della stringa di origine
nel foglio1
4° nella colonna C del foglio2 alla stessa riga della stringa di origine
nel foglio1

Eventuali altri spezzoni dalla colonna Z del foglio2 a seguire a Destra,
tanto è tutto libero.

Adesso non ho modo di popolare un esempio ma mi sarebbe già sufficiente
qualche istruzione di massima per fare questo passaggio su un paio di
righe poi integro e completo io.

Dati sempre dalla riga 6 con intestazioni alla riga 5 e controllo
estensione tabella alla colonna D tutto del foglio1

Non ho 365

Grazie ad entrambi
Ale

Final Job

unread,
Feb 8, 2024, 7:06:46 AMFeb 8
to
Il 08/02/2024 10:35, issdr ha scritto:
> issdr wrote:
>
>> stricly_mime
>
> strictly_mime

Grazie ma io ho già provato a seguire le istruzioni che mi avevi
indicato in precedenza. Ho sbagliato qualcosa, forse. Infatti, non mi è
molto chiaro il procedimento. Io uso thunderbird su windows 10.

Appena ho un attimo ci torno su.
Ale


casanmaner

unread,
Feb 8, 2024, 7:32:09 AMFeb 8
to
Ma ti interessa una procedura che periodicamente vada a fare questo lavoro?
O potresti valutare una FDU da inserire, in base alle esigenze, come una
funzione nelle celle di interesse?

issdr

unread,
Feb 8, 2024, 9:25:36 AMFeb 8
to
Il 08/02/2024 13:06, Final Job ha scritto:
> Il 08/02/2024 10:35, issdr ha scritto:
>> issdr wrote:
>>
>>> stricly_mime
>>
>> strictly_mime
>
> Grazie ma io ho già provato a seguire le istruzioni che mi avevi
> indicato in precedenza. Ho sbagliato qualcosa, forse. Infatti, non mi è
> molto chiaro il procedimento. Io uso thunderbird su windows 10.
magari hai saltato una delle due immagini che ti avevo linkato.

questo sistema in teoria è più diretto:

Impostazioni / Generali, in fondo trovi l'Editor di configurazione.
Nella maschera di ricerca inserisci mail.strictly_mime ed imposti la
voce a True (usi il tasto a destra per farlo). chiudi il programma, lo
riavvii e fai un post di prova con lettere accentate.


issdr

unread,
Feb 8, 2024, 9:30:13 AMFeb 8
to
Mi è partito in base64 il reply, forse perché il tuo post lo era.

questa è un'altra prova, chiedo scusa.

issdr

unread,
Feb 8, 2024, 9:33:58 AMFeb 8
to
Il 08/02/2024 15:25, issdr ha scritto:
> Il 08/02/2024 13:06, Final Job ha scritto:
> > Il 08/02/2024 10:35, issdr ha scritto:
> >> issdr wrote:
> >>
> >>> stricly_mime
> >>
> >> strictly_mime
> >
> > Grazie ma io ho già provato a seguire le istruzioni che mi avevi
> > indicato in precedenza. Ho sbagliato qualcosa, forse. Infatti, non mi è
> > molto chiaro il procedimento. Io uso thunderbird su windows 10.
> magari hai saltato una delle due immagini che ti avevo linkato.
>
> questo sistema in teoria è più diretto:
>
> Impostazioni / Generali, in fondo trovi l'Editor di configurazione.
> Nella maschera di ricerca inserisci mail.strictly_mime ed imposti la
> voce a True (usi il tasto a destra per farlo).

le istruzioni che ho trovato online sono sbagliate. va importato a
False, in questo modo parte con codifica testo (cioè, spero. vediamo)

Final Job

unread,
Feb 9, 2024, 8:01:39 AMFeb 9
to
Il 08/02/2024 13:32, casanmaner ha scritto:

>
> Ma ti interessa una procedura che periodicamente vada a fare questo lavoro?
> O potresti valutare una FDU da inserire, in base alle esigenze, come una
> funzione nelle celle di interesse?

Mi farebbe più comodo una procedura. La devo inserire in un ciclo più
esteso da lanciare al bisogno.


casanmaner

unread,
Feb 9, 2024, 8:25:53 AMFeb 9
to
Ok, vedo ti preparare qualcosa nel fine settimana :-)

casanmaner

unread,
Feb 9, 2024, 12:46:10 PMFeb 9
to
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

Final Job

unread,
Feb 9, 2024, 1:40:54 PMFeb 9
to
Era già a True
Comunque ho resettato e riportato nuovamente a True.

Non so se fosse questa la prova che mi hai chiesto.
Comunque grazie.

èè éé ààà ùùù
Prova con l'apostrofo

Final Job

unread,
Feb 9, 2024, 2:07:54 PMFeb 9
to
Il 09/02/2024 18:46, casanmaner ha scritto:

> 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"

Si, funziona. Non ti dico cosa avevo impostato io.

I risultati dovrei, però, averli sul Foglio2, alle stesse colonne target
attualmente considerate nella tua procedura e alla stessa riga della
stringa di origine. Ho provato a fare qualcosa ma non è alla mia portata.

Ti ringrazio anche per la chiarezza dei settaggi iniziali che mi
permettono di adattare la procedura alle variazioni che dovessero
intervenire.

Io la conversione dei separatori l'avevo impostata nella stessa cella di
origine come primo passo della procedura che immaginavo (e che mai
avrebbe funzionato così). Meglio come fai tu, ovviamente.
Ale

casanmaner

unread,
Feb 9, 2024, 2:26:01 PMFeb 9
to
Ciao Ale,
scusa mi ero perso il particolare che i dati dovessero finire in un
altro foglio.
Scarica nuovamente il file dallo stesso link.
Ho modificato la procedura in modo che i dati vengano portati nel
foglio2, il cui nome viene impostato con una nuova costante.
Ho anche modificato il nome di una variabile (quella che della colonna
Z) per renderla uniforme alle altre (mi era rimasta nella tastiera una "l")

Option Explicit

Sub ProceduraSplittaStringhe()

Const sNomeFoglioStringhe As String = "Foglio1"
Const sNomeFoglioDestinazione As String = "Foglio2"
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 ArrColZ() As Variant
ReDim Preserve ArrColZ(1 To NumeroRighe, 1 To
MaxUbColRes)
For y = 4 To UBound(arrTmp)
ArrColZ(i, y - 3) = arrTmp(y)
Next y
End Select
Next j
Erase arrTmp
Next i
End With ' .Worksheets(sNomeFoglioStringhe)

With .Worksheets(sNomeFoglioDestinazione)
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(ArrColZ,
2)).Value = ArrColZ
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End With ' .Worksheets(sNomeFoglioDestinazione)

End With ' ThisWorkbook
End Sub

Function SplittaStringa(str As String) As Variant
Const SepU As String = "\"
Dim arrSeparatori As Variant
arrSeparatori = Array("\", "-", "(", ")", ".")

issdr

unread,
Feb 9, 2024, 3:44:43 PMFeb 9
to
Final Job wrote:

> Era già a True
> Comunque ho resettato e riportato nuovamente a True.
>
> Non so se fosse questa la prova che mi hai chiesto.
> Comunque grazie.

impostalo su False. in un alrro post ho scritto che la guida che ho
trovato è sbagliata. è importante, rischi di finire in black list tu, e
chi ti risponde potrebbe ricevere score negativi.

ciao

Final Job

unread,
Feb 9, 2024, 4:41:07 PMFeb 9
to
e non va bene, certo.
in quella parte dei settaggi la condizione d'insieme è la seguente:

mail.strictly_mime true
mail.strictly_mime.parm_folding 1
mail.strictly_mime_headers true

Setto false solo la prima?

Final Job

unread,
Feb 9, 2024, 4:47:18 PMFeb 9
to
Il 09/02/2024 20:25, casanmaner ha scritto:
> Ciao Ale,
> scusa mi ero perso il particolare che i dati dovessero finire in un
> altro foglio.

Ma figurati.
Grazie per sempre preziosi suggerimenti.
Ale

issdr

unread,
Feb 9, 2024, 4:54:44 PMFeb 9
to
Final Job wrote:

> mail.strictly_mime true
> mail.strictly_mime.parm_folding 1
> mail.strictly_mime_headers true
>
> Setto false solo la prima?


Final Job

unread,
Feb 9, 2024, 7:42:06 PMFeb 9
to
Cambiata impostazione a false
chiuso e riaperto thunderbird
confermato "False" solo il primo parametro

òèéàù

'''
òàòèù

issdr

unread,
Feb 9, 2024, 8:30:26 PMFeb 9
to
Final Job wrote:

> Cambiata impostazione a false
> chiuso e riaperto thunderbird
> confermato "False" solo il primo parametro
>
> òèéàù

ottimo. fai Ctrl + U sul messaggio a cui sto rispondendo, poi risali al
tuo precedente e fallo anche su quello, così vedrai la differenza.

Final Job

unread,
Feb 10, 2024, 9:15:20 AMFeb 10
to
Visto. E'evidente la differenza e l'esigenza. Seguo vari newsgroup da
decenni non ho mai avuto questo problema che a volte mi negava l'inoltro
dei miei stessi post. Attualmente lavoro con una seconda installazione
di Thunderbird nella quale (così come nella precedente) non ho mai
cambiato le impostazioni, anche perchè non me ne intendo. Siccome fino
all'installazione precedente non ho mai avuto problemi, mi domando cosa
possa essere successo. Ma solo per curiosità.

In ogni caso ti ringrazio perchè, benchè abbia più volte chiesto
suggerimenti, solo adesso riesco a metterci le mani.
Ale

Final Job

unread,
Feb 11, 2024, 11:12:46 AMFeb 11
to
Il 09/02/2024 20:25, casanmaner ha scritto:
> Ciao Ale,

> Scarica nuovamente il file dallo stesso link.

Scusa, ma se io volessi condizionare l'applicazione della procedura alla
sola riga dove è il cursore cosa va modificato.

Ho provato a cambiare in alcuni punti ma siccome il campo di azione
della procedura si basa su tre parametri (Riga iniziale, Estensione e
Ultima riga), c'è sempre qualcosa che non torna.

Non è urgente e sempre che ti sia possibile.
Grazie
Ale

Final Job

unread,
Feb 11, 2024, 11:18:29 AMFeb 11
to
Ho risolto settando
numero righe =1
riga iniziale e riga finale con la posizione del cursore

poco elegante ma .....
Grazie

Final Job

unread,
Feb 11, 2024, 11:47:27 AMFeb 11
to
Scusa ma ti devo disturbare nuovamente perchè questo è un aspetto che va
oltre le mie conoscenze.

Se modifico la seguente istruzione:
arrSeparatori = Array("\", "-", "(", ")", ".")

o se la stringa da splittare contiene un solo tipo di separatore, la
procedura si blocca qui:

casanmaner

unread,
Feb 11, 2024, 1:27:53 PMFeb 11
to
Dovresti specificare la modifica fatta ad arrSeparatori e quale è la
stringa che dà errore perché io, anche inserendo un solo separatore, o
anche nessuno, non riesco a replicare l'errore.

ciao

casanmaner

unread,
Feb 11, 2024, 1:32:52 PMFeb 11
to
Forse sono riuscito a replicare la situazione.
Prova a modificare quella riga con:

If MaxUbColRes > 0 Then .Range("Z" &

Final Job

unread,
Feb 12, 2024, 9:05:43 AMFeb 12
to
Il 11/02/2024 19:32, casanmaner ha scritto:

> Prova a modificare quella riga con:
>
>          If MaxUbColRes > 0 Then .Range("Z" &
> PrimaRiga).Resize(NumeroRighe, UBound(ArrColZ, 2)).Value = ArrColZ

Si, va bene. Scusa il disturbo ulteriore.
Grazie
Ale
0 new messages