› Sviluppare funzionalita su Microsoft Office con VBA › Funzioni Slice e Removespaces
-
AutoreArticoli
-
Sottotitolo: Due piccioni con una favola! Questo pezzullo lo dedico agli amanti del fast food… del prendi veloce e porta via alla svelta altrimenti si raffredda! Due piccole funzioncine da utilizzare al momento, senza pretese. La favola in questione è che spesso le cose più semplici sono quelle che si utilizzano più spesso..
[Leggi tutto al seguente link: https://www.excelvba.it/forumexcel/funzioni-slice-e-removespaces/]Ciao VF,
intanto grazie per i tuoi stimolanti interventi; mi permetto solo alcune considerazioni:
- dichiarare la variabile i come Integer non è congruente con le dimensioni del tipo di variabile String (circa 2 miliardi di caratteri per le stringhe di lunghezza variabile);
riguardo slice(), visto che detesto l'uso dei : per unire le istruzioni, prorpongo questa semplificazione
Public Function slice2(ByVal s As String, ifrom As Long, ito As Long) As String 'affetta una stringa e restituisce una sottostringa 'che inizia dal carattere ifrom e finisce al carattere ito, compresi ' es. slice ("pippo", 2, 4) --> ipp If ito - ifrom + 1 <= 0 Then slice2 = "" Else slice2 = Mid(s, ifrom, ito - ifrom + 1) End Functionriguardo Removespaces():
- non capisco perché fai un ciclo nel caso del flag allspaces a True, visto che l'istruzione Replace(Source, " ", "") sostituisce già tutti gli spazi visto che l'opzione count è omessa:
Facoltativa. Numero di sostituzioni di sottostringhe da eseguire. Se omesso, viene automaticamente impostato -1, che indica che verranno eseguite tutte le sostituzioni possibili
- trovo più conveniente, invece, usare il loop per l'opzione allspaces False, anziché scomodare le RegEx (piuttosto lente) per una cosa così semplice:
Function removespaces2(ByVal Source As String, Optional allspaces As Boolean = True) As String 'rimuove gli spazi da source. 'di default (true) toglie tutti gli spazi, se false invece riduce gli spazi a uno solo Select Case allspaces Case True Source = Replace(Source, " ", "") Case False Dim i As Long Do Source = Replace(Source, " ", " ") i = InStr(Source, " ") Loop Until i = 0 End Select removespaces2 = Source End FunctionGrazie scossa.
Lo scopo degli articoli è evidentemente stimolare la fantasia dei lettori per trovare soluzioni sempre migliori, sempre più appetibili, magari presentando anche funzionalità poco note o poco usate. Tutto è perfettibile e del resto lo scopo di questi spuntini è quello di iniziare a mostrare come vi sono sempre alternative o approcci diversi.
Ho utilizzato un esempio con le espressioni regolari per far vedere che esistono e come si possono usare anche in contesti semplici. Funzionale a una serie di articoli sulle regex in cui mi aspetto un tuo contributo 🙂
se invece vogliamo eliminare caratteri duplicati che non siano spazi
Sub remodup() s = ";sezione;;;;;potenza;" ss = removedup(s, ";") MsgBox ss End Sub Function removedup(ByVal Source As String, ByVal sep As String) As String 'riduce i caratteri ripetuti a uno solo Dim i As Long Do Source = Replace(Source, sep & sep, sep) i = InStr(Source, sep & sep) Loop Until i = 0 removedup = Source End FunctionCiao.
Quest'ultima la scriverei così
Function removedup(ByVal Source As String, ByVal sep As String) As String Do while InStr(Source, sep & sep) > 0 Source = Replace(Source, sep & sep, sep) Loop removedup = Source End Function 'oppure potrebbe convenire: Function removedup(ByVal Source As String, ByVal sep As String) As String Dim Rp As String Rp = sep & sep Do While InStr(Source, Rp) > 0 Source = Replace(Source, Rp, sep) Loop removedup = Source End Function -
AutoreArticoli
