Stefan Welscher: (VBA) Mit Mustern/Regex suchen

Hallo,
ich muss mich gerade etwas durch VBA quälen und bin jetzt an einem Punkt, an dem ich Regex benötigen würde um einen Teilstring auszuschneiden.

Der Quell-String ist eine Bandbreite gefolgt von der Einheit:

z.B. "1024 Kbps" oder "1 Mbps" oder "34MBit"

Ich müsste jetzt Wert und Einheit trennen und den Wert in Kilobit umrechnen, was ich in Perl ungefähr so lösen würde:

  
my $value=0;  
if ($bandwidth=/(\d+)\s*(gb|mb|kb|b)?/i)  
{  
   $value=$1; my $unit=$2;  
   if ($unit eq "gb")  
   {  
      $value*=1024*1024;  
   }  
   elsif ($unit eq "mb")  
   {  
      $value*=1024;  
   }  
   elsif ($unit eq "b")  
   {  
      $value/=1024;  
   }  
}  

Da sowohl Value als auch Unit unterschiedliche Zeichenlängen habe können kann ich die VBA-Funktionen Mid, Right, Left nicht nutzen. Mit Like kann ich zwar matchen, bekomme aber nur True oder False anstatt der Treffer zurückgeliefert.

Wie kann ich dieses eigentlich recht Simple Problem mit VBA lösen?

Besten Dank!

  1. Mahlzeit,

    ich muss mich gerade etwas durch VBA quälen und bin jetzt an einem Punkt, an dem ich Regex benötigen würde um einen Teilstring auszuschneiden.

    Ich hatte mal das gleiche Problem. Hab dann nach VBA, RegExp usw. gesucht und eine entsprechende externe Komponente (sogar kostenlos) gefunden, die man z.B. als Add-In einbinden kann und die ein RegExp-Objekt zur Verfügung stellt.

    Frag mich aber bitte jetzt nicht nach dem Namen - ist schon länger her. :-)

    Wie kann ich dieses eigentlich recht Simple Problem mit VBA lösen?

    AFAIK nicht ohne externe Tools.

    MfG,
    EKKi

    1. Ich hatte mal das gleiche Problem. Hab dann nach VBA, RegExp usw. gesucht und eine entsprechende externe Komponente (sogar kostenlos) gefunden, die man z.B. als Add-In einbinden kann und die ein RegExp-Objekt zur Verfügung stellt.

      Also wenn ich dieses AddIn finden würde uns es schaffen würde es zu installieren (hab ich atm noch nie gemacht...) uns der Code auch noch funktionieren würde, müsste ich dann das AddIn an jedem PC installieren, der die Excel-Tabelle nutzt?

      Sollte das der Fall sein Fällt diese Lösung leider raus.... :(

      1. Mahlzeit,

        Also wenn ich dieses AddIn finden würde uns es schaffen würde es zu installieren (hab ich atm noch nie gemacht...) uns der Code auch noch funktionieren würde, müsste ich dann das AddIn an jedem PC installieren, der die Excel-Tabelle nutzt?

        Ähm, ja. Natürlich. Gehört schließlich nicht zum Standardumfang von Excel.

        Sollte das der Fall sein Fällt diese Lösung leider raus.... :(

        Das ist natürlich schade. Aber von Haus aus kennt VBA nun mal keine regulären Ausdrücke und auch nichts Vergleichbares (ich lasse mich aber gerne eines Besseren belehren).

        MfG,
        EKKi

        1. (ich lasse mich aber gerne eines Besseren belehren).

          Hab noch ein wenig gesucht...und einen Forumeintrag gefunden:
          http://www.office-loesung.de/ftopic83090_0_0_asc.php

          VBA kann wohl doch RegEx:

            
          Function get_bandwidth_kbit(ByVal bw) As String  
             Dim unit As String  
             Dim objRegEx As Object, objMatchCollection As Object, objMatch As Object  
             Dim a As Integer  
             Set RegEx = CreateObject("vbscript.regexp")  
             RegEx.Global = True  
             RegEx.IgnoreCase = True  
             RegEx.MultiLine = False  
             RegEx.Pattern = "([0-9]+)\s*(gb|mb|kb|b)?"  
            
             Set MatchAll = RegEx.Execute(bw)  
             Set Match = MatchAll(0)  
            
             If Match.submatches.Count > 0 Then  
                bw = Match.submatches(0)  
                If Match.submatches.Count >= 1 Then  
                   unit = UCase(Match.submatches(1))  
                   If unit = "GB" Then  
                      bw = bw * 1024 * 1024  
                   ElseIf unit = "MB" Then  
                      bw = bw * 1024  
                   ElseIf unit = "B" Then  
                      bw = bw / 1024  
                   End If  
                End If  
             Else  
                bw = 0  
             End If  
            
             Set RegEx = Nothing  
             Set MatchAll = Nothing  
             Set Match = Nothing  
            
             get_bandwidth_kbit = bw  
          End Function  
          
          

          Könnte zwar kürzer sein, aber funktioniert!

          Thx@all!

      2. Hello,

        Sollte das der Fall sein Fällt diese Lösung leider raus.... :(

        ...dann bleibt dir nur schneiden mittels Left/Right und Len, oder eben ein Split und anschließende Analyse der Teile.

        MfG
        Rouven

        --
        -------------------
        Death is nature's way of telling you to slow down.
  2. Hi,

    z.B. "1024 Kbps" oder "1 Mbps" oder "34MBit"

    wenn es sich um Excel (oder eine andere Office-Anwendung) ab der Version 2000 handelt, wäre Split() hier die einfachste Variante.

    Viele Grüße

    Jörg