我正在尝试使用VBA在Microstation中执行此任务。我想用它来查找和替换图中的多个数字。
我一般都知道这个程序,但是我把它放在一起很麻烦。我有2个变量。
提前感谢您,并为编写错误的代码感到抱歉。刚习惯VBA!
Sub main()
Dim Find_text () As string = split ("150 160 170 180 190 200 210 220")
Dim Replace_text () As string = split ("15 16 17 18 19 20 21 22")
For i As Integer = 0 To Find_text.length - 1
'I will write my find and replace code here
Next
End Sub
答案 0 :(得分:1)
您可以使用函数InStr()在字符串和函数Replace()中查找子字符串,以使用replace_string替换找到的字符串
Sub main()
Dim Find_text() As String
Dim Replace_text() As String
Dim str As String
str = "test 150 test 160 test 170 test 200 test 220"
Find_text = Split("150 160 170 180 190 200 210 220")
Replace_text = Split("15 16 17 18 19 20 21 22")
For i = 0 To UBound(Find_text)
For j = 0 To UBound(Replace_text)
If InStr(str, Find_text(j)) > 0 Then
str = Replace(str, Find_text(j), Replace_text(j))
End If
Next
Next
MsgBox str
End Sub
答案 1 :(得分:1)
诀窍是使用Microstation API获取要操作的元素列表。您可以使用.GetSelectedElements
或.Scan
,具体取决于您希望工具的工作方式。正如你所说,你刚刚习惯了vba,我已经大量评论了下面的代码。
其他问题包括文本元素和文本节点(多行文本)需要以不同方式处理,并且在修改后不要忘记.Rewrite
元素。
Option Explicit
Sub replaceText()
Dim findText() As String
Dim replaceText() As String
'set find and replace
findText = Split("10 20 30 40 50")
replaceText = Split("a b c d e")
'guard against unequal length searches
If UBound(findText) <> UBound(replaceText) Then
MsgBox "Find and replace are not equal lengths"
Exit Sub
End If
' Scan Criteria are needed when looking for elements in a model
' Set up scan criteria to only include text types
Dim eSC As New ElementScanCriteria
eSC.ExcludeAllTypes
eSC.IncludeType msdElementTypeText 'text element
eSC.IncludeType msdElementTypeTextNode 'multiple line text element
Dim model As ModelReference
Set model = ActiveModelReference
' if you need to loop through multiple models you could use this
' Set model = ActiveDesignFile.Models(i)
' Element Enumerator is a list of elements
Dim elements As ElementEnumerator
'scan active model for text
Set elements = model.Scan(eSC)
' the elements could also be retrieved using
' Set elements = model.GetSelectedElements
' iterate through element set
' If there is another element in the list then
' MoveNext sets elements.Current to the next element and returns true
' otherwise it returns false and the loop exits.
Do While elements.MoveNext
Dim i As Integer
Dim textNodeI As Integer
Dim tempText As String
' elements.Current is a generic element
' we need to check its type to handle it correctly
If elements.Current.IsTextElement Then
' access the generic element using the text element interface
With elements.Current.AsTextElement
'.text here refers to elements.Current.AsTextElement.text as specified by the With statement
tempText = .text
'split is 0 indexed
For i = 0 To UBound(findText)
tempText = Replace(tempText, findText(i), replaceText(i))
Next
'set the elements text to the replaced text
.text = tempText
'rewrite the text element to the model
.Rewrite
End With
ElseIf elements.Current.IsTextNodeElement Then
With elements.Current.AsTextNodeElement
' TextNodes have an array of TextLines (1 indexed)
For textNodeI = 1 To .TextLinesCount
'same as for text but for each line of node
tempText = .TextLine(textNodeI)
For i = 0 To UBound(findText)
tempText = Replace(tempText, findText(i), replaceText(i))
Next
.TextLine(textNodeI) = tempText
Next
' Rewrite the text node after you have replaced each line.
.Rewrite
End With
End If
Loop
End Sub