Xin nhờ giúp đỡ về macro

Liên hệ QC

songngutn

Thành viên mới
Tham gia
16/5/11
Bài viết
32
Được thích
1
Xin chào các ace! Mình xin hỏi nếu muốn thay thế "&cụm từ bất kỳ &" thành "cụ từ bất kỳ" thì phải làm sao (tức là chỉ bỏ & &). Mình không biết trong phần .Replacement.Text = "?" phải thay dấu ? thành gì? Xin cảm ơn!
 
Xin chào các ace! Mình xin hỏi nếu muốn thay thế "&cụm từ bất kỳ &" thành "cụ từ bất kỳ" thì phải làm sao (tức là chỉ bỏ & &). Mình không biết trong phần .Replacement.Text = "?" phải thay dấu ? thành gì? Xin cảm ơn!
Thử:
PHP:
Sub abc()
    With Selection.Find
        .Text = "&"
        .Replacement.Text = ""
      End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
 
Thử:
PHP:
Sub abc()
    With Selection.Find
        .Text = "&"
        .Replacement.Text = ""
      End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Cảm ơn bạn nhưng nhiều chỗ có &..& mình cần giữ lại nên phải làm vậy. VD: &234& thành 234 và nhiều số khác nữa. Nhưng &xyz& thì mình vẫn giũa nguyên là &xyz&. Xin nhờ bạn giúp đỡ.
 
Cảm ơn bạn nhưng nhiều chỗ có &..& mình cần giữ lại nên phải làm vậy. VD: &234& thành 234 và nhiều số khác nữa. Nhưng &xyz& thì mình vẫn giũa nguyên là &xyz&. Xin nhờ bạn giúp đỡ.
Qui tắc luôn phải phát biểu và phải nói toẹt ra. Ví dụ chỉ là thêm vào nếu cần thiết, không thể thay cho mô tả.

Phát biểu: Ta tìm tất cả các đoạn có dạng "&một chuỗi chữ số, ít nhất là có 1 chữ số&" và thay bằng "một chuỗi chữ số, ít nhất là có 1 chữ số" - tức xóa & ở đầu và cuối.

Yêu cầu như tôi phát biểu? Nếu thế thì code
Mã:
Sub xoa()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
        .Text = "&([0-9]{1;})&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Nếu chỉ xét chuỗi có >= 1 và <= 5 chữ số thì .Text = "&([0-9]{1;5})&"

Nếu chỉ xét chuỗi có đúng 7 chữ số thì .Text = "&([0-9]{7})&"

Trên máy tôi trong ngoặc {} luôn là dấu ; - chấm phẩy. Tôi không biết luôn là thế hay không. Nếu cần thì thử thay bằng , - dấu phẩy.
 
Qui tắc luôn phải phát biểu và phải nói toẹt ra. Ví dụ chỉ là thêm vào nếu cần thiết, không thể thay cho mô tả.

Phát biểu: Ta tìm tất cả các đoạn có dạng "&một chuỗi chữ số, ít nhất là có 1 chữ số&" và thay bằng "một chuỗi chữ số, ít nhất là có 1 chữ số" - tức xóa & ở đầu và cuối.

Yêu cầu như tôi phát biểu? Nếu thế thì code
Mã:
Sub xoa()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
        .Text = "&([0-9]{1;})&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Nếu chỉ xét chuỗi có >= 1 và <= 5 chữ số thì .Text = "&([0-9]{1;5})&"

Nếu chỉ xét chuỗi có đúng 7 chữ số thì .Text = "&([0-9]{7})&"

Trên máy tôi trong ngoặc {} luôn là dấu ; - chấm phẩy. Tôi không biết luôn là thế hay không. Nếu cần thì thử thay bằng , - dấu phẩy.
Xin cảm ơn bạn tốt rất nhiều. Dấu phẩy là chính xác bạn à.
 
Xin hỏi thêm là mình có 7^3 và muốn đưa về đặng mũ bình thường trong các sách (ctrl shift +) thì câu lệnh là gì? Xin cảm ơn!
 
À vâng là a^3 làm sao để thành a³ đó ạ. Tại mình nghĩ là nó sẽ giống nhau.
Tôi không thử nhưng bạn thử xem
Mã:
...
.Text = "([0-9]{1;})^3"
.Replacement.Text = "\1" & ChrW(179)
...

hoặc
Mã:
...
.Text = "(*)^3"
.Replacement.Text = "\1" & ChrW(179)
...
 
Tôi không thử nhưng bạn thử xem
Mã:
...
.Text = "([0-9]{1;})^3"
.Replacement.Text = "\1" & ChrW(179)
...

hoặc
Mã:
...
.Text = "(*)^3"
.Replacement.Text = "\1" & ChrW(179)
...
Máy nó không hiểu dòng lệnh .Text = "([0-9]{1;})^3" và dòng lệnh .Text = "(*)^3" thầy ơi :(
 
Máy nó không hiểu dòng lệnh .Text = "([0-9]{1;})^3" và dòng lệnh .Text = "(*)^3" thầy ơi :(
Hôm qua Word bị hỏng nên tôi không thử được.
Đọc thấy là ^ không thuộc tập ký tự đặc biệt nhưng lại không dùng được.
Có lẽ do Word dùng ^, vd. ^p, ^n, ^13 v...v

Thôi thì tạm đi đường vòng
Mã:
Sub chuyen()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "^"
        .Replacement.Text = "@"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "@3"
        .Replacement.Text = ChrW(179)
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
 
Hôm qua Word bị hỏng nên tôi không thử được.
Đọc thấy là ^ không thuộc tập ký tự đặc biệt nhưng lại không dùng được.
Có lẽ do Word dùng ^, vd. ^p, ^n, ^13 v...v

Thôi thì tạm đi đường vòng
Mã:
Sub chuyen()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "^"
        .Replacement.Text = "@"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "@3"
        .Replacement.Text = ChrW(179)
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Xin cảm ơn bạn rất nhiều :)
 
Thôi thì tạm đi đường vòng
[/code]
Eureka ...

Để tìm các ký tự đặc biệt, vd. @, ?, *, \, thì chỉ cần thêm trước ký tự đó ký tự \. Nhưng để tìm ký tự ^ thì không thể chỉ nhập ^ và cũng không thể nhập \^. Để tìm ^ thì phải nhập ^^

Code ở dưới thay cả ^2 thành ². Tức thay "Bán căn hộ 100 m^2 và 10 m^3 gỗ" bằng "Bán căn hộ 100 m² và 10 m³ gỗ". Nếu không cần đoạn nào thì xóa đi.
Mã:
Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = False
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "^^2"
        .Replacement.Text = ChrW(178)
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .MatchWildcards = False
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "^^3"
        .Replacement.Text = ChrW(179)
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
 
Eureka ...

Để tìm các ký tự đặc biệt, vd. @, ?, *, \, thì chỉ cần thêm trước ký tự đó ký tự \. Nhưng để tìm ký tự ^ thì không thể chỉ nhập ^ và cũng không thể nhập \^. Để tìm ^ thì phải nhập ^^

Code ở dưới thay cả ^2 thành ². Tức thay "Bán căn hộ 100 m^2 và 10 m^3 gỗ" bằng "Bán căn hộ 100 m² và 10 m³ gỗ". Nếu không cần đoạn nào thì xóa đi.
Mã:
Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = False
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "^^2"
        .Replacement.Text = ChrW(178)
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .MatchWildcards = False
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "^^3"
        .Replacement.Text = ChrW(179)
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Cảm ơn anh rất nhiều! câu lệnh lần trước chưa dùng được nhưng em chưa dám hỏi thêm. Hôm nay lên đã thấy câu trả lời mới. Em sẽ thử xem
Anh cho em hỏi bấy giờ em chỉ muốn chuyển đoan &chữ số bất kỳ = chữ số tùy ý$ thành chữ số bất kỳ = chữ số tùy ý thì phải làm thế nào ạ.
VD: &a=5& chuyển thành a=5 (tức là mất &&) nhưng những chỗ có && khác không bị ảnh hưởng ạ. Em đã thử replace nhưng không được, chắc là do dấu "=". Cảm ơn anh!
 
Cảm ơn anh rất nhiều! câu lệnh lần trước chưa dùng được nhưng em chưa dám hỏi thêm. Hôm nay lên đã thấy câu trả lời mới. Em sẽ thử xem
Anh cho em hỏi bấy giờ em chỉ muốn chuyển đoan &chữ số bất kỳ = chữ số tùy ý$ thành chữ số bất kỳ = chữ số tùy ý thì phải làm thế nào ạ.
VD: &a=5& chuyển thành a=5 (tức là mất &&) nhưng những chỗ có && khác không bị ảnh hưởng ạ. Em đã thử replace nhưng không được, chắc là do dấu "=". Cảm ơn anh!
a đâu có là chữ số???

Code ở bài #14 và #16 tôi kiểm tra đàng hoàng rồi mới gửi. Nếu bạn làm không được thì cũng chịu. Tôi dùng Office 2010.

Nhưng nhiều khi chạy thấy đúng, nhiều khi sau đó thử cái khác thấy chạy sai quay về cái chạy đúng thì lại thấy sai. Nhưng lúc đó lưu lại rồi đóng Word rồi mở lại tập tin và chạy thì lúc này lại đúng. Nói chung tôi không hiểu tính khí thất thường của Word. :D

Với bài này - trước và sau dấu = có dấu cách:
Mã:
Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "&([0-9] = [0-9])&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Nếu nhiều chữ số thì

Mã:
Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "&([0-9]{1;} = [0-9]{1;})&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

hoặc

Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "&([0-9]@ = [0-9]@)&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
 
a đâu có là chữ số???

Code ở bài #14 và #16 tôi kiểm tra đàng hoàng rồi mới gửi. Nếu bạn làm không được thì cũng chịu. Tôi dùng Office 2010.

Nhưng nhiều khi chạy thấy đúng, nhiều khi sau đó thử cái khác thấy chạy sai quay về cái chạy đúng thì lại thấy sai. Nhưng lúc đó lưu lại rồi đóng Word rồi mở lại tập tin và chạy thì lúc này lại đúng. Nói chung tôi không hiểu tính khí thất thường của Word. :D

Với bài này - trước và sau dấu = có dấu cách:
Mã:
Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "&([0-9] = [0-9])&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Nếu nhiều chữ số thì

Mã:
Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "&([0-9]{1;} = [0-9]{1;})&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

hoặc

Sub thaythe()
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Forward = True
        .Wrap = wdFindContinue
        .Text = "&([0-9]@ = [0-9]@)&"
        .Replacement.Text = "\1"
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Thực ra là "chữ" chứ không phải "chữ số " ạ. Nhưng em đã làm được rồi. Cảm ơn thầy nhiều :)
PS: Có lẽ là W2010 và 2013 khác nhau 1 chút ạ 1; là 1, mới chạy được
 
PS: Có lẽ là W2010 và 2013 khác nhau 1 chút ạ 1; là 1, mới chạy được
1; và 1, không phải là phụ thuộc vào office.

Nếu thiết lập mặc định trong Control Panel dấu phẩy là dấu thập phân thì phải dùng 1; còn nếu dấu chấm là dấu thập phân thì dùng 1,

Tương tự nếu trong CP dấu phẩy là dấu thập phân thì trong các công thức Excel dấu phân cách các parameter phải là dấu chấm phẩy, còn nếu dấu chấm là dấu thập phân thì dùng dấu phẩy để phân cách.

Tóm lại là phụ thuộc vào thiết lập CP, phiên bản office không quyết định.
 
Web KT

Bài viết mới nhất

Back
Top Bottom