Цель - заменить последнюю строку документа. Последняя строка всегда начинается с символа $. Я использую здесь находку, но в этом нет необходимости, у меня не было другого способа работать.

Я успешно использовал replace.text в find, но из-за некоторых условий я не могу использовать его без множества операторов if, выполняющих разные запросы.

Кажется, все работает, я пытаюсь, за исключением того, что дохожу до конца страницы или расширяю, чтобы удалить / заменить всю строку после $.

В частности, у меня не работает функция .Expand из 10 различных способов, которые я пробовал. и .EndKeys у меня никогда не работает. (Я пробовал каждую комбинацию WordDoc.Expand WordApp.Expand WordSelection.Expand, устанавливая activedocument и т. Д.)

На этом этапе код выглядит немного запутанным. For Each oRange - единственная часть, у которой есть проблемы, и это моя 10-я итерация, в которой я пытаюсь заставить ее работать.

Sub OpenDoc()
    Dim strFile As String
    Dim strPN As String
    Dim WordApp As Object, WordDoc As Object
    Dim WordSelection As Object
    Const wdReplaceOne = 1
    Dim oRange As Object
    Dim RoundPrice As Integer
    Dim PriceString As String

Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

For i = Selection.Rows.Count To 1 Step -1
If Cells(i, 4).Value <> "" Then
    If Cells(i, 4).Value <> "PN" Then
        'Print SD
        If IsError(Cells(i, 28).Value) = True Then
            RoundPrice = Cells(i, 12).Value
            RoundPrice = RoundPrice * 0.85
            PriceString = RoundPrice
            PriceString = Left(PriceString, Len(PriceString) - 1)
            PriceString = PriceString & "9"
            strPN = Cells(i, 4).Value
            strFile = "c:\Users\Robert\Desktop\Masterlist\B_" & strPN & ".docx"    'change to path of your file
            If Dir(strFile) <> "" Then    'First we check if document exists at all at given location
                'Word session creation
                Set WordApp = CreateObject("Word.Application")
                'word will be closed while running
                WordApp.Visible = True
                'open the .doc file
                Set WordDoc = WordApp.Documents.Open(strFile)
                'WordDoc.PrintOut
                Set WordSelection = WordApp.Selection
                
                 For Each oRange In WordDoc.StoryRanges
                        With oRange.Find
                        .Forward = False
                        .Text = "$"
                        .Execute Find
                        End With
                        With WordSelection
                        .Expand Unit:=wdLine
                        .Text = "$" & PriceString
                        End With
                Next oRange
                        
                  
                    WordDoc.SaveAs ("c:\Users\Robert\Desktop\B" & "_" & strPN & ".docx")
                    WordApp.Quit

            End If
          End If

    End If
End If
Next i


End Sub
0
Robert 11 Июн 2021 в 22:12

2 ответа

Лучший ответ

Ваш код не работает, потому что WordSelection не перемещается после оператора Set. Вы можете выполнить то, что вам нужно, просто используя Range. Вы также должны проверить, действительно ли Find что-то нашел.

For Each oRange In WordDoc.StoryRanges
    With oRange
        With .Find
            .Forward = False
            .Text = "$"
        End With
        If .Find.Execute Then
            .Expand Unit:=wdParagraph
            .Text = "$" & PriceString
        End If
    End With
Next oRange

Вам также следует избавиться от позднего связывания, поскольку вы ничего не получите от его использования. Вместо этого установите ссылку на библиотеку объектов Word и должным образом объявите объекты. Таким образом, вы также получите преимущества Intellisense.

0
Timothy Rylatt 11 Июн 2021 в 20:55

Попробуйте этот код:

 For Each oRange In WordDoc.StoryRanges
    With oRange.Find
        .Forward = False
        .Text = "$"
        .Execute
    End With
    oRange.Select
    With Selection
        .Expand Unit:=wdLine
        .Text = "$" & PriceString
    End With
' or use the next statements without Selection
'        With oRange
'            .Expand Unit:=wdParagraph
'            .Text = "$" & PriceString
'        End With
    Next oRange
0
Алексей Р 11 Июн 2021 в 19:47