› Sviluppare funzionalita su Microsoft Office con VBA › Funzione Split per ottenere un vettore di caratteri
-
AutoreArticoli
-
Ciao A tutti.
ho cercato inutilmente nei vecchi archivi ma non ho trovato ciiò che cercavo.
Mi sembra di ricordare che qualcuno (forse VF) avesse specificato come usare la funzione Split per dividere una o più parole in singoli caratteri Ovvero data La Parola Luca avere
Vettore(0) = L
Vettore(1) = u
Vettore(2) = c
Vettore(3) = aRicordo bene che si poteva fare? Come?
Colgo l'occasione per Salutare tutti e augurare un buon Natale e un Felice anno nuovo
Ciao,ho cercato nel mio archivio:
Sub stringaVerticale() Call string_to_array("hello world") End SubPublic Function string_to_array(stringa As String) 'che trasforma una stringa di testo in un array di caratteri '(esempio: "hello" restituisce il vettore composto da "h", "e", "l", "l", "o") Dim coll As New Collection Dim aumenta As Long, lung As Long, i As Long, uprow As Long Dim dato As String, dat As String Dim item As Variant aumenta = 1 lung = Len(stringa) For i = 1 To lung dato = Mid(stringa, aumenta, 1) coll.Add dato aumenta = aumenta + 1 Next uprow = 1 For Each item In coll Cells(uprow, 6) = item dat = dat & Chr(13) & Chr(10) & item uprow = uprow + 1 Next MsgBox dat End Function
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )La funzione Split ha bisogno di un separatore tra i vari caratteri per funzionare
Ciao,
questa udf restituisce la matrice come da tua richiesta:
Function StrToArr(ByVal sTesto As String) As Variant Dim j As Long, nLen As Long, vRet As Variant nLen = Len(sTesto) ReDim vRet(1 To nLen) For j = 1 To nLen vRet(j) = Mid(sTesto, j, 1) Next j StrToArr = vRet End FunctionEsempio basico per testarla:
Sub prova() Dim sString As String sString = Join(StrToArr("prova"), "-") Range("A1:E1") = StrToArr("prova") MsgBox sString End SubMi sembra di ricordare che qualcuno (forse VF) avesse specificato come usare la funzione Split
Me lo ricordo. Questa era la mia proposta:
'TRASFORMA UNA STRINGA DI TESTO IN UN ARRAY DI CARATTERI Function string_to_array(ByVal value As String) As Variant value = StrConv(value, vbUnicode) string_to_array = Split(Left(value, Len(value) - 1), vbNullChar) End FunctionIl cui utilizzo è semplice perché restituisce un vettore a base zero:
?string_to_array("LUCA")(0) L@patel: giusta osservazione, qui infatti ho utilizzato vbNullChar come separatore.
>Me lo ricordo. Questa era la mia proposta ...
@VF: non me la ricordavo; ottima soluzione!
Grazie tutti,
Ricordavo un utilizzo di split... E infatti eccolo.
Ringrazio anche tutti coloro che hanno proposto soluzioni alternative.
Ogni soluzione porta in se qualcosa di valido e qualcosa per imparare.
Buon Natale
P. S.
Spero con il nuovo anno di riuscire a partecipare un po'di più.
Ciao
Mi associo agli auguri di buone feste!
Ogni soluzione porta in se qualcosa di valido e qualcosa per imparare.

ottima soluzione!
Questo complimento da parte di scossa è il mio regalo di Natale di quest'anno!! Grazie!!

AUGURI A tutto il Forum
Ciao a tutti
Mi associo agli auguri di @albatros (ciao) e propongo una elaborazione del suggerimento di @vecchio frac (ciao anche a te).
La seguente macro "traspone" in verticale quanto scritto nella cella A1
Option Explicit Sub prova2() 'traspone in verticale il dato in A1 Dim dato As String, i As Long, lung As Integer Dim arrDat(), a As Long dato = StrConv(Cells(1, 1).value, vbUnicode) lung = Len(dato) For i = 1 To lung ReDim Preserve arrDat(0 To i - 1) arrDat(i - 1) = Split(Mid(dato, i, 1), vbNullChar) Next i a = 1 For i = 0 To UBound(arrDat) Step 2 Cells(a, 4) = arrDat(i) a = a + 1 Next i End SubSicuramene avete notato il ciclo con Step 2. Questo perchè il vbNullChar aggiunge dopo ogni lettera (ma vale anche coi numeri) un carattere "strano".
Come si potrebbe ovviare?
Ciao a tutti e BUON NATALE,
Mario
I miei complimenti VF ! non ho capito come funziona la conversione unicode, me la puoi spiegare ?
Come si potrebbe ovviare?
E' corretto perché devi saltare il null char. L'array di byte è fatto così, un elemento, null char, un elemento, null char, ecc.
Io suggerisco in alternativa Application.Transpose ma è una furbata utilizzando un metodo di Excel 🙂Sub prova3() 'traspone in E1... in verticale il dato in A1 Dim dato As String Dim arrDat As Variant dato = StrConv(Cells(1, 1).Value, vbUnicode) arrDat = Split(Left(dato, Len(dato) - 1), vbNullChar) Range(Cells(1, "E"), Cells(Len(dato) / 2, "E")) = Application.Transpose(arrDat) End SubI miei complimenti VF ! non ho capito come funziona la conversione unicode, me la puoi spiegare ?
Il mondo ANSI e il mondo Unicode, sono tanto lontani tra loro che gli stessi ideatori di quegli standard probabilmente non sanno nemmeno cosa hanno combinato 🙂 Poi ci sono anche i codici di paese e i codici di pagina... ricordate il comando DOS "mode con:" ?
Chiaramente Unicode ha permesso di aumentare notevolmente il numero di caratteri rappresentabili su una tavola... VB ha cercato di mantenere il passo offrendo un modo per recuperare i valori Unicode con le funzioni di stringa gemelle a quelle classiche (ChrW, AscW, LenB). Naturalmente io non sono così tecnico nè così ferrato da saper spiegare come funziona la conversione Unicode. Che peraltro credo che usiamo pochissimo (a dire il vero mi è capitato recentemente e per fortuna ChrW funziona bene).
Temo che devo rinviarti a qualche paziente googlata!
-
AutoreArticoli
