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.
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à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.
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).
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
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.
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
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
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à ). 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é.
"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).
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à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!
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
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
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!
(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
(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
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
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