Как мне определить новый word.range через существующий word.range, не затрагивая оригинал?

#vba #ms-word

#vba #ms-word

Вопрос:

Следующий подраздел принимает a word.range в качестве аргумента и выделяет текст жирным шрифтом, когда он заключен в двойные звездочки **

 Private Sub parse(parseRange As Word.Range)

'technical range for starting double asterics
Dim workRange As Word.Range
'range for enclosing doulbe asterics
Dim workRange2 As Word.Range
'another range for a bold text
Dim workRange3 As Word.Range
'flag variable 
Dim isSelect As Boolean
'number of iterated character in parseRange
Dim char

'I set my ranges through parseRange, otherwise I get "object variable not set" error
Set workRange = parseRange
Set workRange2 = parseRange
Set workRange3 = parseRange
        

char = 2
isSelect = False
Do While char <= parseRange.Characters.Count
    If parseRange.Characters(char) = "*" And parseRange.Characters(char - 1) = "*" Then
    Select Case isSelect
    Case False
        isSelect = True
        
        workRange.Start = parseRange.Start   char - 2

        'at this line the initial parseRange.characters.count is set to 2 and all the following code fails as a result.
        workRange.End = parseRange.Start   char
        workRange.Text = ""
    Case True
        isSelect = False
        workRange2.Start = parseRange.Start   char - 2
        workRange2.End = parseRange.Start   char
        workRange2.Text = ""
        
        workRange3.SetRange Start:=workRange.End, _
        End:=workRange2.Start
        workRange3.End = workRange2.Start
        workRange3.Bold = True
    End Select
    End If
    char = char   1
Loop

End Sub
  

Насколько я понимаю, поскольку я определил workRange / 2 / 3 через parseRange , изменения в этих диапазонах теперь влияют на оригинал. Как я могу избежать такой ошибки?

Ответ №1:

Объектная модель Word включает Duplicate метод для Range объекта. Это позволяет работать с копией диапазона, не затрагивая начальную и конечную точки оригинала. Это то, что вы хотите?

 Set workRange = parseRange.Duplicate
Set workRange2 = parseRange.Duplicate
Set workRange3 = parseRange.Duplicate