Viết code để thực hiện quá trình Find and Replace (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

khanhcang2

Thành viên chính thức
Tham gia
5/6/12
Bài viết
89
Được thích
23
Em ghi lại quá trình thay đổi chuỗi sử dụng "Ctrl+H" được đoạn code sau:
Mã:
Sub CTRL_H()
    Columns("G:G").Select
    Selection.Replace What:="Subtotal(9;", Replacement:="Sum(", LookAt:= _
        xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 End Sub
Khi sử dụng đoạn code trên cho yêu cầu tương tự thì không thấy ra kết quả theo yêu cầu. Mong các anh chị giải đáp giúp em thắc mắc trên với ạ.
 
Em ghi lại quá trình thay đổi chuỗi sử dụng "Ctrl+H" được đoạn code sau:
Mã:
Sub CTRL_H()
    Columns("G:G").Select
    Selection.Replace What:="Subtotal(9;", Replacement:="Sum(", LookAt:= _
        xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 End Sub
yêu cầu tương tự là như thế nào vậy bạn?
 
Upvote 0
Anh xem giúp em ví dụ trong file này với ạ. Em có mấy ô màu vàng "Cột G" đang dùng công thức Subtotal em muốn đổi sang hàm Sum sử dụng đoạn Macro trên không được.
 

File đính kèm

Upvote 0
Mã:
Sub CTRL_H()
Dim Rng As Range
Const OldText = "SUBTOTAL(9,"
Const NewText = "Sum("
    On Error Resume Next
    For Each Rng In Range("G5:G" & Range("G5").End(xlDown).Row)
        Rng.FormulaR1C1 = Replace(Rng.FormulaR1C1, OldText, NewText)
    Next
 End Sub
Bạn thay code như thế này thử xem.
 
Upvote 0
Anh xem giúp em ví dụ trong file này với ạ. Em có mấy ô màu vàng "Cột G" đang dùng công thức Subtotal em muốn đổi sang hàm Sum sử dụng đoạn Macro trên không được.
Chạy code của bạn thấy ra kết quả bình thường. Tuy nhiên có thể rút gọn thành:
Mã:
Range("G4:G1000").Replace "Subtotal(9;", "Sum(", xlPart, , False
Hoặc:
Mã:
Range("G4:G1000").Replace "Subtotal(9,", "Sum(", xlPart, , False
Lưu ý chỗ "Subtotal(9;" ----> Dấu ; hay , là tùy theo máy nha
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub CTRL_H()
Dim Rng As Range
Const OldText = "SUBTOTAL(9,"
Const NewText = "Sum("
    On Error Resume Next
    For Each Rng In Range("G5:G" & Range("G5").End(xlDown).Row)
        Rng.FormulaR1C1 = Replace(Rng.FormulaR1C1, OldText, NewText)
    Next
 End Sub
Bạn thay code như thế này thử xem.
Cảm ơn bác. Em chạy code đã thay được tên hàm.
 
Upvote 0
Chạy code của bạn thấy ra kết quả bình thường. Tuy nhiên có thể rút gọn thành:
Mã:
Range("G4:G1000").Replace "Subtotal(9;", "Sum(", xlPart, , False
Hoặc:
Mã:
Range("G4:G1000").Replace "Subtotal(9,", "Sum(", xlPart, , False
Lưu ý chỗ "Subtotal(9;" ----> Dấu ; hay , là tùy theo máy nha
Thầy cho em hỏi. Có phải máy của em bị lỗi gì đó không ạ. Em giữ nguyên đoạn code chạy Macro trên , đồng thời sử dụng dòng code đầu tiên của thầy mà đều không được. Máy em dùng phân cách trong công thức là dấu ";" ạ
 
Upvote 0
Thầy cho em hỏi. Có phải máy của em bị lỗi gì đó không ạ. Em giữ nguyên đoạn code chạy Macro trên , đồng thời sử dụng dòng code đầu tiên của thầy mà đều không được. Máy em dùng phân cách trong công thức là dấu ";" ạ
Máy của bạn có vấn đề thật rồi, tôi thử Code trên hoàn toàn bình thường.
 
Upvote 0
Thầy cho em hỏi. Có phải máy của em bị lỗi gì đó không ạ. Em giữ nguyên đoạn code chạy Macro trên , đồng thời sử dụng dòng code đầu tiên của thầy mà đều không được. Máy em dùng phân cách trong công thức là dấu ";" ạ
Tôi vừa thay đổi Control Panel cho giống máy của bạn (thay phẩy thành chấm phẩy) thì đúng là code bị... trơ trơ không tác dung
Vậy thử tạm đoạn này xem sao
Mã:
Range("G4:G1000").Replace "Subtotal(9~;", "Sum(", xlPart, , False
 
Upvote 0
Máy em dùng phân cách trong công thức là dấu ";" ạ
Theo tôi bạn đừng nhìn CP làm gì. Nếu tôi đoán đúng thì bạn thay "Subtotal(9;" thành "Subtotal(9,"
Khi chạy được rồi thì bạn có thể kiểm tra bằng cách thay đổi trong CP thì nó vẫn luôn chạy mặc dù không thay đổi code.
Theo tôi hiểu thì không phụ thuộc vào CP. Bạn chạy code
Mã:
Debug.Print Range("G6").Formula
thấy trong kết quả dùng dấu gì thì nó phải là dấu đó. Thế thôi.

Dấu trong Range.Formula phụ thuộc vào ngôn ngữ của Macro - Phụ thuộc vào separator theo US English, không phụ thuộc vào thiết lập trong CP. Tức nếu tôi không lầm thì đó là dấu phẩy ","

Dấu trong Range("G6").FormulaLocal phụ thuộc vào thiết lập trong CP.

Trong code của mình bạn phải dùng dấu trong Range.Formula
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi bạn đừng nhìn CP làm gì. Nếu tôi đoán đúng thì bạn thay "Subtotal(9;" thành "Subtotal(9,"
Khi chạy được rồi thì bạn có thể kiểm tra bằng cách thay đổi trong CP thì nó vẫn luôn chạy mặc dù không thay đổi code.
Theo tôi hiểu thì không phụ thuộc vào CP. Bạn chạy code
Mã:
Debug.Print Range("G6").Formula
thấy trong kết quả dùng dấu gì thì nó phải là dấu đó. Thế thôi.

Dấu trong Range.Formula phụ thuộc vào ngôn ngữ của Macro - Phụ thuộc vào separator theo US English, không phụ thuộc vào thiết lập trong CP. Tức nếu tôi không lầm thì đó là dấu phẩy ","

Dấu trong Range("G6").FormulaLocal phụ thuộc vào thiết lập trong CP.

Trong code của mình bạn phải dùng dấu trong Range.Formula
Theo như em được biết, các thuộc tính là dính dáng tới CP thì thường có chữ local, ví dụ như FormulaLocal,NumberFormatLocal,.....
 
Upvote 0
Web KT

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

Back
Top Bottom