Tìm và thay thế những từ/cụm từ thoả mãn điều kiện cho sẵn trong word

Liên hệ QC

doinho

Thành viên thường trực
Tham gia
22/8/08
Bài viết
234
Được thích
9
Chào các bạn

Trong file word, mình muốn tìm những từ thoả mãn những điều kiện sau
  • Chữ đỏ
  • Size 14
  • Có gạch chân
  • Font Arial

Những text không thoả mãn 4 điều kiện trên thì không cần can thiệp gì. Các bạn vui lòng xem file đính kèm.

Và khi tìm ra những từ này thì mình muốn là trên và dưới những từ này cách nhau bởi một đoạn mới. Mình có gửi kèm hình ảnh kết quả mong muốn kế bên để các bạn dễ hình dung.

Các bạn giúp mình tạo một VBA để làm nhanh những thao tác trên một cách nhanh chóng nha.

Cảm ơn các bạn nhiều
 

File đính kèm

  • Hoi GPE.docx
    24.4 KB · Đọc: 26
Có ai đi ngang không? Giúp mình với
 
Đăng bài chủ nhật, bài trôi.
Nhắc bài tối thứ 7 tuần sau, bài rồi cũng sẽ bị trôi.
 
Có ai đi ngang không? Giúp mình với
Tôi đang nhậu ở trước nhà đây.

Thao tác: mở tập tin -> nhấn tổ hợp Alt + F11 -> click đúp vào ThisDocument -> menu Insert -> Module -> dán code sau vào Module1
Mã:
Sub FindFormatedText()
Dim rngTemp As Range
    Set rngTemp = ThisDocument.Range
'    xoa cac thiet lap cu
    rngTemp.Find.ClearFormatting
    rngTemp.Find.Replacement.ClearFormatting
    With rngTemp.Find
'        tim cac doan thoa man 3 dieu kien: chu mau do, co 14, co gach chan.
'        Khong hieu sao tren may toi co the tim "Times New Roman" nhung khong tim duoc "Arial"
'        Moi nguoi nen thu tren may minh co tim thay "Arial" khong.
'        Hien thoi toi chi tim voi 3 dieu kien roi kiem tra xem ten phong chu co la Arial hay khong.
        .Font.Color = wdColorRed
        .Font.Size = 14
        .Font.Underline = wdUnderlineSingle
'        .Font.Name = "Arial"        '   "Times New Roman"
        Do While .Execute
'            neu co phong chu Arial thi them dong truoc va sau doan tim duoc
            If rngTemp.Font.Name = "Arial" And rngTemp.Text <> vbCr Then rngTemp.Text = vbCr & rngTemp.Text & vbCr
'            "khep" Range vao cuoi
'            rngTemp.Collapse wdCollapseEnd
        Loop
    End With
End Sub
-> chạy code
 
Chào các bạn
Trong file word, mình muốn tìm những từ thoả mãn những điều kiện sau
  • Chữ đỏ
  • Size 14
  • Có gạch chân
  • Font Arial
Những text không thoả mãn 4 điều kiện trên thì không cần can thiệp gì. Các bạn vui lòng xem file đính kèm.
Và khi tìm ra những từ này thì mình muốn là trên và dưới những từ này cách nhau bởi một đoạn mới. Mình có gửi kèm hình ảnh kết quả mong muốn kế bên để các bạn dễ hình dung.
Các bạn giúp mình tạo một VBA để làm nhanh những thao tác trên một cách nhanh chóng nha.

Cảm ơn các bạn nhiều
Chỉ giải thích thôi mà cũng không rõ ràng, theo tôi hiểu thì bạn muốn chọn tất cả các nội dung trong File word, nếu chỗ nào là I, II, III,.....V..V....(chỗ chữ màu đỏ có gạch chân) thì canh Paragraph với Before và After là 12 (nội dung khác bình thường là 6).
 
Tôi đang nhậu ở trước nhà đây.

Thao tác: mở tập tin -> nhấn tổ hợp Alt + F11 -> click đúp vào ThisDocument -> menu Insert -> Module -> dán code sau vào Module1
Mã:
Sub FindFormatedText()
Dim rngTemp As Range
    Set rngTemp = ThisDocument.Range
'    xoa cac thiet lap cu
    rngTemp.Find.ClearFormatting
    rngTemp.Find.Replacement.ClearFormatting
    With rngTemp.Find
'        tim cac doan thoa man 3 dieu kien: chu mau do, co 14, co gach chan.
'        Khong hieu sao tren may toi co the tim "Times New Roman" nhung khong tim duoc "Arial"
'        Moi nguoi nen thu tren may minh co tim thay "Arial" khong.
'        Hien thoi toi chi tim voi 3 dieu kien roi kiem tra xem ten phong chu co la Arial hay khong.
        .Font.Color = wdColorRed
        .Font.Size = 14
        .Font.Underline = wdUnderlineSingle
'        .Font.Name = "Arial"        '   "Times New Roman"
        Do While .Execute
'            neu co phong chu Arial thi them dong truoc va sau doan tim duoc
            If rngTemp.Font.Name = "Arial" And rngTemp.Text <> vbCr Then rngTemp.Text = vbCr & rngTemp.Text & vbCr
'            "khep" Range vao cuoi
'            rngTemp.Collapse wdCollapseEnd
        Loop
    End With
End Sub
-> chạy code

Cảm ơn bạn, mình làm được rồi

Mình có 2 vấn đề phát sinh muốn hỏi bạn

1/ Đoạn code này dùng để làm gì vậy bạn? Mình có thử nhưng không thấy sự khác biệt khi có và không có đoạn code này.
' "khep" Range vao cuoi
' rngTemp.Collapse wdCollapseEnd

2/ Và nếu như mình chỉ muốn "I. Lời mở đầu "
chỉ cách dưới thôi, không có cách trên thì làm như thế nào bạn? Các số la mã sau vẫn như cũ, chỉ có la mã đầu tiên là chỉ cách dưới, không cần cách trên.

Cảm ơn bạn nhiều nha
 
Mình có 2 vấn đề phát sinh muốn hỏi bạn

1/ Đoạn code này dùng để làm gì vậy bạn? Mình có thử nhưng không thấy sự khác biệt khi có và không có đoạn code này.
' "khep" Range vao cuoi
' rngTemp.Collapse wdCollapseEnd
Vì thế mà tôi chuyển thành chú thích mà.
Bạn nên đọc help.
Người ta cho bạn một code thì bạn có một code, làm một việc cụ thể. Nhưng trong code đó có nhiều đối tượng, nhiều phương thức và thuộc tính của đối tượng đó. Có tên các đối tượng, phương thức và thuộc tính rồi thì bạn nên tự đọc trong help về chúng. Chỉ khi đó bạn mới học thêm được rất nhiều điều, thấu hiểu những cái được dùng trong code ai đó cho.

Tôi cho ví dụ. Trong code có
Mã:
With rngTemp.Find
    .Font.Color = wdColorRed
    .Font.Size = 14
    .Font.Underline = wdUnderlineSingle
...
Tôi tìm với 3 điều kiện. Nhìn code bạn thấy tôi thiết lập thuộc tính Font (cũng là đối tượng) của đối tượng Find. Cả đối tượng Range lẫn đối tượng Selection đều có thuộc tính Find. Vậy thì: menu View -> Object Browser -> bạn nhìn thấy 2 ListBox -> bạn tìm và click Range (Selection) ở ListBox trái -> bên ListBox phải sẽ có những thuộc tính và phương thức của Range (Selection) -> bạn thấy nó có thuộc tính Find, bản thân cũng là đối tượng -> chọn Find -> F1 thì bạn sẽ có giải thích và cả ví dụ -> nếu tìm Find ở ListBox trái rồi chọn thì ở ListBox phải sẽ có các phương thức và thuộc tính của Find (nếu lúc trước thay vì nhấn F1 bạn click vào từ Find xanh ở dưới 2 ListBox thì bạn cũng có y chang như vậy) -> bạn thấy vd. ngoài thuộc tính Font thì bạn thấy nó còn có thuộc tính TEXT, vậy bạn chọn TEXT rồi F1 -> bạn sẽ có vd. về tìm kiếm theo điều kiện TEXT -> vậy thì thay cho tìm theo 3 điều kiện về Font thì bạn nhập vào code
Mã:
.text = "bong bay"
Rồi chạy code.

v...v

Cứ thư thế thì nhận được code của người khác bạn không chỉ học được 1 mà còn học thêm được 10, ít nhất là học thêm được 2, 3.

Bạn cũng có thể tìm đọc trên mạng.

Bạn chọn Range ở ListBox trái rồi Collapse ở ListBox phải rồi F1 thì bạn sẽ có như hinh đính kèm.

Thay vì giải thích về Collapse, tức cho con cá, thì tôi cho bạn cần câu. Hãy đọc help để hiểu về các đối tượng trong Word VBA. Mà trong help người ta cũng cho bạn hằng hà sa số ví dụ. Quá tốt rồi, đúng không?

Không có ai tự dưng biết tất cả. Phải đọc tài liệu thôi. Trước kia là đọc trong sách, hỏi lẫn nhau (rỉ tai), bây giờ trong cả sách, help đính kèm với ứng dụng, hoặc trên mạng.
2/ Và nếu như mình chỉ muốn "I. Lời mở đầu "
chỉ cách dưới thôi, không có cách trên thì làm như thế nào bạn? Các số la mã sau vẫn như cũ, chỉ có la mã đầu tiên là chỉ cách dưới, không cần cách trên.
Đơn giản nhất là bạn thêm một biến cờ (flag) k, tức thay khai báo thành
Mã:
Dim rngTemp As Range, k As Long
Và thay
Mã:
If rngTemp.Font.Name = "Arial" And rngTemp.Text <> vbCr Then rngTemp.Text = vbCr & rngTemp.Text & vbCr
thành
Mã:
If rngTemp.Font.Name = "Arial" And rngTemp.Text <> vbCr Then
    If k = 0 Then
        k = 1
        rngTemp.Text = rngTemp.Text & vbCr
    Else
        rngTemp.Text = vbCr & rngTemp.Text & vbCr
    End If
End If
 

File đính kèm

  • 1.JPG
    1.JPG
    67.7 KB · Đọc: 15
Vì thế mà tôi chuyển thành chú thích mà.
Bạn nên đọc help.
Người ta cho bạn một code thì bạn có một code, làm một việc cụ thể. Nhưng trong code đó có nhiều đối tượng, nhiều phương thức và thuộc tính của đối tượng đó. Có tên các đối tượng, phương thức và thuộc tính rồi thì bạn nên tự đọc trong help về chúng. Chỉ khi đó bạn mới học thêm được rất nhiều điều, thấu hiểu những cái được dùng trong code ai đó cho.

Tôi cho ví dụ. Trong code có
Mã:
With rngTemp.Find
    .Font.Color = wdColorRed
    .Font.Size = 14
    .Font.Underline = wdUnderlineSingle
...
Tôi tìm với 3 điều kiện. Nhìn code bạn thấy tôi thiết lập thuộc tính Font (cũng là đối tượng) của đối tượng Find. Cả đối tượng Range lẫn đối tượng Selection đều có thuộc tính Find. Vậy thì: menu View -> Object Browser -> bạn nhìn thấy 2 ListBox -> bạn tìm và click Range (Selection) ở ListBox trái -> bên ListBox phải sẽ có những thuộc tính và phương thức của Range (Selection) -> bạn thấy nó có thuộc tính Find, bản thân cũng là đối tượng -> chọn Find -> F1 thì bạn sẽ có giải thích và cả ví dụ -> nếu tìm Find ở ListBox trái rồi chọn thì ở ListBox phải sẽ có các phương thức và thuộc tính của Find (nếu lúc trước thay vì nhấn F1 bạn click vào từ Find xanh ở dưới 2 ListBox thì bạn cũng có y chang như vậy) -> bạn thấy vd. ngoài thuộc tính Font thì bạn thấy nó còn có thuộc tính TEXT, vậy bạn chọn TEXT rồi F1 -> bạn sẽ có vd. về tìm kiếm theo điều kiện TEXT -> vậy thì thay cho tìm theo 3 điều kiện về Font thì bạn nhập vào code
Mã:
.text = "bong bay"
Rồi chạy code.

v...v

Cứ thư thế thì nhận được code của người khác bạn không chỉ học được 1 mà còn học thêm được 10, ít nhất là học thêm được 2, 3.

Bạn cũng có thể tìm đọc trên mạng.

Bạn chọn Range ở ListBox trái rồi Collapse ở ListBox phải rồi F1 thì bạn sẽ có như hinh đính kèm.

Thay vì giải thích về Collapse, tức cho con cá, thì tôi cho bạn cần câu. Hãy đọc help để hiểu về các đối tượng trong Word VBA. Mà trong help người ta cũng cho bạn hằng hà sa số ví dụ. Quá tốt rồi, đúng không?

Không có ai tự dưng biết tất cả. Phải đọc tài liệu thôi. Trước kia là đọc trong sách, hỏi lẫn nhau (rỉ tai), bây giờ trong cả sách, help đính kèm với ứng dụng, hoặc trên mạng.

Đơn giản nhất là bạn thêm một biến cờ (flag) k, tức thay khai báo thành
Mã:
Dim rngTemp As Range, k As Long
Và thay
Mã:
If rngTemp.Font.Name = "Arial" And rngTemp.Text <> vbCr Then rngTemp.Text = vbCr & rngTemp.Text & vbCr
thành
Mã:
If rngTemp.Font.Name = "Arial" And rngTemp.Text <> vbCr Then
    If k = 0 Then
        k = 1
        rngTemp.Text = rngTemp.Text & vbCr
    Else
        rngTemp.Text = vbCr & rngTemp.Text & vbCr
    End If
End If


cảm ơn những lời góp ý của bạn nhé.
Trong trường hợp đoạn mã
' "khep" Range vao cuoi
' rngTemp.Collapse wdCollapseEnd

mình cũng nhận ra bạn chỉ để chú thích mà không cho chạy đoạn code này nên mình cũng muốn tò mò tìm hiểu xem nó có công dụng gì. Thực tình mình cũng bỏ dấu ' ở ' rngTemp.Collapse wdCollapseEnd xem nó là gì nhưng cũng không thấy có gì khác (chắc là có khác nhau nhưng mình chưa nhận ra) nên mới hỏi lại bạn xem là đoạn code này có công dụng gì (tò mò mà :D). Như lời bạn góp ý thì mình sẽ đọc help nhiều hơn.

Qua đoạn code của bạn mình học được khá nhiều điều hay để áp dụng cho những việc sau này. Cảm ơn bạn lần nữa nhé.
 
Tôi đang nhậu ở trước nhà đây.
"Người ta" thì cứ nghĩ có người ghé qua là làm giúp ngay, mà không biết rằng anh đã dành thời gian tìm hiểu (đọc help...), giải bài, chú thích chi tiết... Thật nể phục anh.
Em thấy anh đọc thớt này khoảng lúc hơn 1:00 AM, tới 4:00 AM thì anh gửi bài trả lời.
(Chỗ anh thì vào khoảng hơn 8:00 PM - 11:00 PM ngày hôm trước).
Tuần trước, em làm bài này được nửa, đọc tới lui không biết chèn thêm dòng nên bỏ cuộc.
(Đối tượng và phương thức trong Word khác với Excel nên phải đọc từ abc, tìm kiếm bài tương tự nên khá tốn thời gian).
Bạn nên đọc help.
Người ta cho bạn một code thì bạn có một code, làm một việc cụ thể. Nhưng trong code đó có nhiều đối tượng, nhiều phương thức và thuộc tính của đối tượng đó. Có tên các đối tượng, phương thức và thuộc tính rồi thì bạn nên tự đọc trong help về chúng. Chỉ khi đó bạn mới học thêm được rất nhiều điều, thấu hiểu những cái được dùng trong code ai đó cho.
...
Cứ thư thế thì nhận được code của người khác bạn không chỉ học được 1 mà còn học thêm được 10, ít nhất là học thêm được 2, 3.
Thật tiếc là không được nhiều người như anh nói, họ thường vào nhờ giải quyết công việc, có đáp án rồi thử... thấy trong đó có gì lạ lạ khó hiểu (tò mò) thì chỉ cần gõ bài kêu lên chứ chẳng dành thời gian tự tìm hiểu lại những thứ vừa nhận được. (Nó như một thói quen luôn, như kiểu khi sử dụng phần mềm - nói chung, xảy ra sự cố và có thông báo phản hồi của phần mềm, họ chẳng đọc cái thông báo đó và mặc nhiên lỗi gì đó và kêu lên...). Nếu mà ai tự đọc help thì chắc chẳng hỏi bài kiểu này.

(Chỉ là vài dòng muốn chia sẻ với anh).

Chúc anh và gia đình ngày vui! :)
 
Chào các bạn,
Nhân tiện hỏi về cách tìm và thay thế (replace) mình muốn hỏi giả sử trường hợp như thế này
Trong word mình có đoạn văn bản sau:
hello @
hello @
hello @
Mình muốn thực hiện replace (ctrl+H) thành số theo thứ tự (1, 2, 3....n, n+1):
hello 1
hello 2
hello 3
Rất mong các bạn giúp đỡ cách thực hiện. Cảm ơn các bạn rất nhiều!
 
Nhân tiện hỏi về cách tìm và thay thế (replace)
Một ví dụ: mở tập tin Word -> Alt + F11 -> click đúp vào ThisDocument -> chọn menu Insert -> Module -> dán vào Module1 code ở dưới
Mã:
Sub FindTextAndReplace()
Dim k As Long, sel As Selection
    ThisDocument.Content.Characters(1).Select
    Set sel = Application.Selection
    sel.Collapse wdCollapseStart
'    xoa cac thiet lap cu
    With sel.Find
        .ClearFormatting
        .Replacement.ClearFormatting
'    lap lai cho toi khi con tim thay
        k = 1
        Do While .Execute(findtext:="hello @", replacewith:="hello " & k)
            sel.Collapse wdCollapseEnd
            k = k + 1
        Loop
    End With
End Sub

HOẶC

Mã:
Sub FindTextAndReplace()
Dim k As Long, sel As Selection
    ThisDocument.Content.Characters(1).Select
    Set sel = Application.Selection
    sel.Collapse wdCollapseStart
'    xoa cac thiet lap cu
    With sel.Find
        .ClearFormatting
        .Replacement.ClearFormatting
'    tim "hello @"
        .Text = "hello @"
'    lap lai cho toi khi con tim thay
        Do While .Execute
            k = k + 1
            sel.Text = "hello " & k
            sel.Collapse wdCollapseEnd
        Loop
    End With
End Sub

-> chạy code
 
Lần chỉnh sửa cuối:
Cảm ơn bạn batman1 rất nhiều. Nó thực sự hữu ích với mình.
 
Một ví dụ: mở tập tin Word -> Alt + F11 -> click đúp vào ThisDocument -> chọn menu Insert -> Module -> dán vào Module1 code ở dưới
Mã:
Sub FindTextAndReplace()
Dim k As Long, sel As Selection
    ThisDocument.Content.Characters(1).Select
    Set sel = Application.Selection
    sel.Collapse wdCollapseStart
'    xoa cac thiet lap cu
    With sel.Find
        .ClearFormatting
        .Replacement.ClearFormatting
'    lap lai cho toi khi con tim thay
        k = 1
        Do While .Execute(findtext:="hello @", replacewith:="hello " & k)
            sel.Collapse wdCollapseEnd
            k = k + 1
        Loop
    End With
End Sub

HOẶC

Mã:
Sub FindTextAndReplace()
Dim k As Long, sel As Selection
    ThisDocument.Content.Characters(1).Select
    Set sel = Application.Selection
    sel.Collapse wdCollapseStart
'    xoa cac thiet lap cu
    With sel.Find
        .ClearFormatting
        .Replacement.ClearFormatting
'    tim "hello @"
        .Text = "hello @"
'    lap lai cho toi khi con tim thay
        Do While .Execute
            k = k + 1
            sel.Text = "hello " & k
            sel.Collapse wdCollapseEnd
        Loop
    End With
End Sub

-> chạy code
Bạn batman1 ơi! có thể giúp mình chuyển ký tự
@
@
@
thành số theo thứ tự (1, 2, 3....n, n+1):
1.
2.
3.
Nhưng ở dạng numbering (số tự động) được không?
Cảm ơn bạn rất nhiều!
 
Nhưng ở dạng numbering (số tự động) được không?
Tức tìm các @ và đánh số thành
1.
2.
...

?

Ví dụ
Mã:
Sub FindTextAndNumbering()
Dim tiep As Boolean, sel As Selection
    With ListGalleries(wdNumberGallery).ListTemplates(1).ListLevels(1)
        .NumberFormat = "%1."
        .TrailingCharacter = wdTrailingTab
        .NumberStyle = wdListNumberStyleArabic
        .NumberPosition = CentimetersToPoints(1)
        .Alignment = wdListLevelAlignLeft
        .TextPosition = CentimetersToPoints(1)
        .ResetOnHigher = 0
        .StartAt = 1
'        With .Font
'            .Bold = True
'            .Italic = True
'            .Underline = wdUnderlineSingle
'            .Size = 14
'            .Name = "Times New Roman"
'        End With
        .LinkedStyle = ""
    End With
    ListGalleries(wdNumberGallery).ListTemplates(1).Name = ""
   
    Set sel = Application.Selection
    Selection.GoTo What:=wdGoToLine, Which:=wdGoToAbsolute, Count:=1
    With sel.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        Do While .Execute(findtext:="@", replacewith:="")
            Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
                ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
                tiep, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
                wdWord10ListBehavior
            tiep = True
        Loop
    End With
End Sub
 
Tức tìm các @ và đánh số thành
1.
2.
Anh chỉ giúp em cách chuyển thành 1 vòng lặp với.

(Em chỉ thay thế thôi, không định dạng numbering).
PHP:
Sub ReplaceText_()
Const txtFind As String = "@"
Const txtReplace As String = ". "
Dim DC As Document, iCount As Long, i As Long
Set DC = ActiveDocument
With DC.Range.Find
    '.MatchCase = True
    .Text = txtFind
    Do While .Execute(Forward:=True) = True
        iCount = iCount + 1
1   ''
    Loop
End With
For i = 1 To iCount
2   ''
    DC.Range.Find.Execute FindText:=txtFind, MatchCase:=True, ReplaceWith:=i & txtReplace, Replace:=wdReplaceOne
Next i
End Sub
 
Anh chỉ giúp em cách chuyển thành 1 vòng lặp với.

(Em chỉ thay thế thôi, không định dạng numbering).
PHP:
Sub ReplaceText_()
Const txtFind As String = "@"
Const txtReplace As String = ". "
Dim DC As Document, iCount As Long, i As Long
Set DC = ActiveDocument
With DC.Range.Find
    '.MatchCase = True
    .Text = txtFind
    Do While .Execute(Forward:=True) = True
        iCount = iCount + 1
1   ''
    Loop
End With
For i = 1 To iCount
2   ''
    DC.Range.Find.Execute FindText:=txtFind, MatchCase:=True, ReplaceWith:=i & txtReplace, Replace:=wdReplaceOne
Next i
End Sub
Sửa vầy chắc được :)
PHP:
Sub ReplaceText_()
Const txtFind As String = "@"
Const txtReplace As String = ". "
Dim DC As Document, i As Long
Set DC = ActiveDocument
Do
    i = i + 1
Loop While DC.Range.Find.Execute(FindText:=txtFind, MatchCase:=True, ReplaceWith:=i & txtReplace, Replace:=wdReplaceOne)
End Sub
 
Sửa vầy chắc được :)
PHP:
Sub ReplaceText_()
Const txtFind As String = "@"
Const txtReplace As String = ". "
Dim DC As Document, i As Long
Set DC = ActiveDocument
Do
    i = i + 1
Loop While DC.Range.Find.Execute(FindText:=txtFind, MatchCase:=True, ReplaceWith:=i & txtReplace, Replace:=wdReplaceOne)
End Sub
Được rồi anh :) :)
 
Web KT
Back
Top Bottom