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. Questo codice è indipendente da Excel, funziona cioè benissimo in qualunque applicativo della suite Office.

La prima, slice, serve per ottenere una sottostringa dal carattere tale al carattere talaltro, di una stringa più grande.

La seconda, removespaces, fa una cosa tanto semplice quanto noiosa, cioè rimuove da una stringa gli spazi (del tutto) o solo quelli ridondanti, restituendo una stringa pulita pulita. La particolarità di questa piccola routine è che sfrutta una “espressione regolare” (l’oggetto VbScript.Regexp) per trovare le occorrenze di almeno due spazi consecutivi e sostituirli con uno spazio solo. Le “espressioni regolari” sono uno strumento molto potente presente in tutti i linguaggi evoluti, la versione VBA e VBScript è piuttosto povera di funzioni (ha limitazioni pesanti) ma per piccoli scopi funziona bene. Magari un giorno ne vien fuori un altro piccolo articolo… piccolo però, perchè l’argomento è vastissimo e anche piuttosto complicato 🙂

Slice

Public Function slice(ByVal s As String, ifrom As Integer, ito As Integer) 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 slice = "": Exit Function
    slice = Mid(s, ifrom, ito - ifrom + 1)
End Function

Esempio di slice (che in fondo vuol dire “affetta”):

slice("tanto va la gatta al largo che ci lascia lo zio pino", 15, 24) = "tta al lar"

 

Removespaces

Function removespaces(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
    Dim i As Integer
        i = InStr(Source, " ")
        Do
            Source = Replace(Source, " ", "")
            i = InStr(Source, " ")
        Loop Until i = 0
        removespaces = Source
    
    Case False
    Dim oRE As Object
        Set oRE = CreateObject("vbscript.regexp")
        oRE.Global = True
        oRE.Pattern = " {2,}"
        removespaces = Trim(oRE.Replace(Source, " "))
        Set oRE = Nothing
    End Select
End Function

Esempio di removespaces:

removespaces(" tanto va la gatta al lardo") = "tantovalagattaallardo" 

removespaces(" tanto    va  la gatta      al lardo     " , False) = "tanto va la gatta al lardo"

Funzioni Slice e Removespaces
Tag:                         

Funzioni Slice e Removespaces

Login Registrati
Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
  • Autore
    Articoli
  • #6675 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      238 pts

      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/]

      #6699 Score: 1 | Risposta

      scossa
      Partecipante
        18 pts

        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 Function

         

        riguardo 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 Function

         

         

        #6701 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          238 pts

          Grazie 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 🙂

          #6714 Score: 0 | Risposta

          patel
          Moderatore
            50 pts

            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 Function
            #6745 Score: 0 | Risposta

            zer0kelvin
            Partecipante
              5 pts

              Ciao.

              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
            Login Registrati
            Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
            Rispondi a: Funzioni Slice e Removespaces
            Gli allegati sono permessi solo ad utenti REGISTRATI
            Le tue informazioni: