Sviluppare funzionalita su Microsoft Office con VBA 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
      272 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
        37 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
          272 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
            51 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: