Cách tìm kiếm văn bản từ sau ra trước


2

Backstory: Tôi đang sao chép và dán kết quả tìm kiếm từ một trang web thành word. văn bản được dán trông giống như hình ảnh dưới đây:

nhập mô tả hình ảnh ở đây

Mục tiêu: Tôi chỉ muốn hai dòng từ mỗi bộ kết quả tìm kiếm (được mô tả bằng màu xanh lá cây). Mọi thứ khác cần phải được xóa. (rất tẻ nhạt khi bạn có hàng trăm kết quả tìm kiếm). Tôi muốn xác định một chuỗi bắt đầu bằng từ đầu tiên màu đỏ và kết thúc bằng hình ảnh thu nhỏ tiếp theo. Sau đó tôi muốn xóa nó.

tin tốt: từ đầu tiên trong màu đỏ luôn luôn giống nhau. Chúng tôi sẽ gọi nó là "Đầu tiên".

Vấn đề của tôi: vì số lượng kết quả tìm kiếm sẽ luôn thay đổi, cách duy nhất tôi có thể nghĩ đến khi xác định một phạm vi kết thúc bằng một hình ảnh là bắt đầu từ cuối tài liệu và làm việc. Tôi muốn bắt đầu với hình ảnh cuối cùng

ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count)

sau đó tìm kiếm ngược từ hình ảnh này cho văn bản "Đầu tiên". Khi tôi tìm thấy sự xuất hiện đầu tiên của từ đó, tôi muốn tạo một phạm vi bằng cách sử dụng hình ảnh cuối cùng và từ đó để tôi có thể xóa nó. Tôi không thể tìm ra cách để làm điều này.

Tiến bộ cho đến nay: Đây là những gì tôi có cho đến nay: cho đến nay, nó tìm kiếm chuyển tiếp cho văn bản "đầu tiên". Làm thế nào để tôi đảo ngược điều này?

Sub Clear_Stuff()

    Dim blnFound As Boolean
    Dim Pic As Range
    Dim First As Range
    Dim rngFound As Range

    Dim LastPic As InlineShape
        Set LastPic = ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count)

Application.ScreenUpdating = True

'=====================================================================================
' Selects the last picture on the document, moves the selection to the right once,
' and sets variable Pic to that selection
'-------------------------------------------------------------------------------------
    LastPic.Select
        Selection.MoveRight wdWord
        Set Pic = Selection.Range
'======================================================================================
' searches for the text "First", moves the selection to the left once
' and sets variable First to that selection
' then it sets the range variable rngFound with Pic and First as its bounds
'--------------------------------------------------------------------------------------
        Selection.Find.Execute FindText:="First", Forward:=False
        blnFound = Selection.Find.Execute
        If blnFound Then
            Selection.MoveLeft wdWord
            Set First = Selection.Range
            Set rngFound = ActiveDocument.Range(First.Start, Pic.Start)
        End If

'========================================================================
' Deletes the range
'------------------------------------------------------------------------
    rngFound.Select
        Selection.Delete

Application.ScreenUpdating = True

End Sub

Tôi chắc chắn hy vọng điều này là rõ ràng. Tôi sẽ rất vui khi thêm bất kỳ ai làm rõ. Tôi là người mới ở VBA. Nếu tôi có thể làm điều này hoạt động trên kết quả tìm kiếm cuối cùng, thì tôi sẽ lặp macro này để chăm sóc toàn bộ tập hợp kết quả.

cảm ơn bạn rất nhiều vì bất kỳ và tất cả sự giúp đỡ!


Nói rõ hơn: Tôi cần phần mã này của tôi: [select.find.text = "first"] bằng cách nào đó nói với macro để tìm kiếm ngược từ cuối tài liệu. có lẽ giải pháp là nói với macro tìm kiếm sự xuất hiện cuối cùng của từ "Đầu tiên" trong toàn bộ tài liệu. điều đó có thể không?
Jamiho

Câu trả lời:


1

Mã để giải thích cách xóa lần xuất hiện cuối cùng của một chuỗi đã cho

Sub DeleteLastOccurence() 
    Set myRange = ActiveDocument.Content
    myRange.Find.Execute FindText:="Hello", Forward:=False
    If myRange.Find.Found = True Then myRange.Delete
End Sub

Phần quan trọng là Forward:=Falsenơi chúng tôi bảo VBA tìm kiếm ngược

Trước | Sau

nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây

Tài nguyên đã sử dụng


Biên tập

Mã này đã cắt các tìm kiếm cho hình ảnh cuối cùng. Sau đó, nó đi ngược lại để tìm kiếm sự xuất hiện đầu tiên của từ khóa của bạn ( Đầu tiên trong ví dụ này). Sau đó, nó chọn phạm vi giữa từ khóa của bạn và hình ảnh. Bạn có thể làm bất cứ điều gì bạn muốn với nó như xóa.

Sub DeleteLastOccurence()

    Dim rngPicture  As Range
    Dim rngJunk     As Range

    Set rngPicture = ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).Range
    Set rngJunk = Range(0, rngPicture.Start)

    rngJunk.Find.Execute FindText:="First", Forward:=False

    If rngJunk.Find.Found = True Then Range(rngJunk.Start, rngPicture.Start).Select

End Sub

nhập mô tả hình ảnh ở đây


Tôi đã cập nhật macro trong bài viết gốc của tôi. Tôi đã quản lý để kết hợp đề xuất của bạn vào macro của tôi, nhưng vẫn còn một vấn đề. Vì một số lý do, mã tìm thấy sự xuất hiện lần thứ hai đến lần cuối của "Đầu tiên". Do đó, phạm vi được chọn để xóa bao gồm một tập hợp kết quả tìm kiếm mà tôi muốn giữ. Nói cách khác, khi tôi lặp lại điều này, nó sẽ xóa một nửa dữ liệu mong muốn của tôi. Bạn có biết tại sao điều này có thể xảy ra không ??
Jamiho

@Jamiho Nên làm gì với rác không mong muốn sau bức ảnh cuối cùng?
nixda

điều đó cũng sẽ bị xóa khi macro này thành công, nó sẽ chỉ để lại cho tôi hai dòng tôi muốn từ mỗi bộ kết quả tìm kiếm - được phân tách bằng một dòng trống duy nhất. Đến bây giờ, tôi tự xóa các rác không mong muốn xuất hiện sau ảnh cuối cùng, sau đó tôi chạy macro.
Jamiho

Cảm ơn bạn rất nhiều vì đã dành thời gian! đoạn mã thứ hai của bạn hoạt động rất tốt. Tôi chỉ thay đổi "rngPicture.start" thành "rngPicture.end" để nó cũng xóa các hình ảnh. Ngoài ra, nó chính xác là những gì tôi cần.
Jamiho

0

Chỉ để cho bạn thấy thành phẩm của tôi:

Đầu tiên, macro xóa ảnh đầu tiên (ở đầu tài liệu). Điều này sẽ đảm bảo rằng xảy ra lỗi khi vòng lặp của tôi đạt đến đỉnh của tài liệu

sau đó, nó tiến hành làm những gì bạn đã giúp tôi và lặp lại mãi cho đến khi xảy ra lỗi (nghĩa là không thể tìm thấy hình ảnh khác). Vào thời điểm đó, vĩ mô kết thúc.

Sub DeleteLastOccurence()

    On Error GoTo GetOut

    ActiveDocument.InlineShapes(1).Delete

    Do
        Dim rngPicture  As Range
        Dim rngJunk As Range

        Set rngPicture = ActiveDocument.InlineShapes(ActiveDocument.InlineShapes.Count).Range
        Set rngJunk = ActiveDocument.Range(0, rngPicture.Start)

        rngJunk.Find.Execute FindText:="KeyWord", Forward:=False

        If rngJunk.Find.Found = True Then ActiveDocument.Range(rngJunk.Start, rngPicture.End).Select
            Selection.Delete

    Loop While 1 + 1 = 2


GetOut:

End Sub

Tôi chắc chắn có một cách tốt hơn để nói rằng một vòng lặp sẽ tiếp tục mãi mãi, ngoài "vòng lặp trong khi 1 + 1 = 2. Nhưng tôi đoán rằng nó sẽ hoạt động. Lol.

cảm ơn lần nữa


Hãy xem xét một số thay đổi: pastebin.com/WCzXxWc8#
nixda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.