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 | ||
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.
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.