Mit VBA Text ersetzen - Teil2: komplexe Strukturen


  
 Bezieht sich auf 
  
 Produkt(e):MicroStation
 Version(en):08.11.09.578
 Umgebung: Windows 7 32 bit,Windows 7 64 bit
 Produktbereich: Programmierung
 Produktunterbereich: VBA
 Ursprünglicher Autor:Artur Goldsweer, Bentley Technical Support Group
  

  

Hintergrundinformation

In diesem zweiten Teil soll die Funktionalität erweitert werden, und zwar so, dass nicht nurTextelemente geprüft werden, die direkt im aktiven Modell platziert wurden, sondern auch solche, die sich in Textknoten und auch in Zellen mit beliebiger Verschachtelungstiefe  befinden.

Erforderliche Schritte

Um die Untersuchung in verschachtelten Zellen durchzuführen, habe ich eine Subroutine complexSearch  hinzugefügt, die rekurisv für die Iteration in den Zellen verwendet wird.
Zusätzlich wird ein weiterer Aufrufparameter unterstützt, mit dem man anzeigen kann, ob die Ersetzung in komplexen Elementen durchgeführt werden soll,
Läßt man dieses Parameter weg, so reduziert sich die Funktionalität wie in dem Beispiel aus dem ersten Teil, jedoch mit einer Ausnahme, nämlich Textknoten werden jetzt bearbeitet, ohne dass die Option benutzt wird.

Hier also ein Beispiel, wie man dies durchführen könnte:

Option Explicit
    '' Auch in (verschachtelten) Zellen und Textstrings suchen

    Private sToFind As String       ' zu suchender Text
    Private sToReplace As String    ' mit diesem Text zu ersetzen
    Private isComplex As Boolean

Sub TxtRep_complex()
    Dim CmdLine() As String
    Dim Ee As ElementEnumerator
    Dim Sc As New ElementScanCriteria

    ' als Trennzeichen zwischen den Parametern wird "|" angenommen
    CmdLine = Split(KeyinArguments, "|")
    ' Abbruch, wenn falsche Parameter mitgegeben wurden:
    If UBound(CmdLine) < 1 Then  ' es fehlen Parameter
        MessageCenter.AddMessage "Text ersetzen: es fehlen Parameter, siehe Details:", "Aufruf erfolgte mit: " + KeyinArguments, msdMessageCenterPriorityError
        Exit Sub
    End If
    
    sToFind = Trim(CmdLine(0))      '1.Parameter zu suchender Text
    sToReplace = Trim(CmdLine(1))   '2.Parameter der neue Text
    
    ' prüfen ob optionaler Parameter complex=yes mitgegeben wurde
    isComplex = False
    If UBound(CmdLine) > 1 Then
        If InStr(CmdLine(2), "complex") > 0 And InStr(CmdLine(2), "yes") > 0 Then isComplex = True
    End If
    
    ' wenn nicht in Zellen suchen, dann nur Texte und Textknoten filtern:
    If isComplex = False Then
        Sc.ExcludeAllTypes
        Sc.IncludeType msdElementTypeText
        Sc.IncludeType msdElementTypeTextNode   ' auch Textknoten immer durchsuchen
    Else
        Sc.ExcludeNonGraphical
    End If
    
    Set Ee = ActiveModelReference.Scan(Sc)
    'aktuelles Modell durchsuchen und Prüfroutine starten:
    Do While Ee.MoveNext
        Call complexSearch(Ee.Current)
    Loop
End Sub
' Hilfsroutine zum rekursiven Durchsuchen verschachtelter komplexer Elemente
Sub complexSearch(oEle As Element)
    Dim EeSub As ElementEnumerator
    ' Wenn ein komplexes Element oder Textknoten gefunden wird, dann alle Unterelemente prüfen:
    If (oEle.IsComplexElement And isComplex) Or (oEle.Type = msdElementTypeTextNode) Then
        Set EeSub = oEle.AsComplexElement.GetSubElements
        Do While EeSub.MoveNext
            Call complexSearch(EeSub.Current)
        Loop
    ' ansonsten String vergleichen, falls ein Text vorliegt:
    Else
        If oEle.Type = msdElementTypeText Then
            If oEle.AsTextElement.Text = sToFind Then
               oEle.AsTextElement.Text = sToReplace
               oEle.Rewrite
            End If
        End If
    End If
End Sub

 Der Aufruf erfolgt bei diesem Beispiel über die Subroutine TxtRep_complex, die wie im vorigen Beispiel mit 2 Parametern aufgerufen werden kann:

vba run TxtRep_complex Suchtext

Mit dem optionalen Parameter complex=yes wird angegeben, ob auch in allen komplexen Strukturen nach Texten gesucht werden soll:

vba run TxtRep_complex Suchtext | Erstztext | [complex=yes]

Diese 3 Variablen:

    Private sToFind As String       ' zu suchender Text
    Private sToReplace As String    ' mit diesem Text zu ersetzen
    Private isComplex As Boolean

sind außerhalb der Routine als Private deklariert worden, damit sie in allen Routinen des Moduls gültig sind und nicht bei jdem Aufruf der Routinen als Parameter mitgegeben werden müssen.

Sehen Sie hierzu auch