Replace với Within trong VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

htin1997

Dậm chân tại chỗ là đi lùi.
Tham gia
12/10/20
Bài viết
317
Được thích
272
Xin chào GPE,

Như tiêu đề, em có thử record macro nhưng không thấy vị trí nào trong code cho phép tùy chọn giửa Sheet và Workbook trong mục Within của hộp thoại Replace.
Nhờ GPE cho em xin đoạn code tùy chỉnh chỗ Within này, em có thử đánh thêm "," xem VBA có đề xuất không nhưng lại không thấy.

Mã:
    Range("D7:M35").Select
    Selection.Replace What:="2", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
1681876706352.png
 
Xin chào GPE,

Như tiêu đề, em có thử record macro nhưng không thấy vị trí nào trong code cho phép tùy chọn giửa Sheet và Workbook trong mục Within của hộp thoại Replace.
Nhờ GPE cho em xin đoạn code tùy chỉnh chỗ Within này, em có thử đánh thêm "," xem VBA có đề xuất không nhưng lại không thấy.

Mã:
    Range("D7:M35").Select
    Selection.Replace What:="2", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
View attachment 289203
Tùy thuộc vào vùng chọn
Range("D7:M35").Select
Vì nó chỉ là sheet hiện tại nên chỉ có 1 sheet

Nên trong VBA, người ta thường kết hợp lệnh lặp duyệt cho tất các sheets trong workbook, thì sẽ được mong muốn

xem ví dụ này, rồi tự sửa lại vùng chọn (code dưới là chọn toàn sheet cells), ứng dụng cho bạn
Mã:
Sub tam()
   
    Dim t
    For Each t In Sheets
        t.Cells.Replace What:="2", Replacement:="200", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Next
End Sub
 
Upvote 0
Tùy thuộc vào vùng chọn
Range("D7:M35").Select
Vì nó chỉ là sheet hiện tại nên chỉ có 1 sheet

Nên trong VBA, người ta thường kết hợp lệnh lặp duyệt cho tất các sheets trong workbook, thì sẽ được mong muốn

xem ví dụ này, rồi tự sửa lại vùng chọn (code dưới là chọn toàn sheet cells), ứng dụng cho bạn
Mã:
Sub tam()
 
    Dim t
    For Each t In Sheets
        t.Cells.Replace What:="2", Replacement:="200", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Next
End Sub
Cám ơn bác đã quan tâm, vấn đề của em thế này:
Em dùng lệnh thủ công Replace thay " " thành "" để xóa khoảng trắng tại 1 vùng D7:M35. Lúc này:
TH1: Chọn Within là Workbook thì nó sẽ xóa toàn bộ khoảng trắng của cả workbook.
TH2: Ngược lại chọn Sheet tại Within thì chỉ xóa khoảng trắng tại D7:M35.
Vậy mục đích em hỏi là gì? Em muốn chẳng may người chạy code, trước khi họ chạy code có chọn Within là Workbook thì code sẽ tự sửa thành Sheet để không replace nhầm cả Workbook.
 
Upvote 0
Cám ơn bác đã quan tâm, vấn đề của em thế này:
Em dùng lệnh thủ công Replace thay " " thành "" để xóa khoảng trắng tại 1 vùng D7:M35. Lúc này:
TH1: Chọn Within là Workbook thì nó sẽ xóa toàn bộ khoảng trắng của cả workbook.
TH2: Ngược lại chọn Sheet tại Within thì chỉ xóa khoảng trắng tại D7:M35.
Vậy mục đích em hỏi là gì? Em muốn chẳng may người chạy code, trước khi họ chạy code có chọn Within là Workbook thì code sẽ tự sửa thành Sheet để không replace nhầm cả Workbook.
Có chọn mà code không lặp các sheet, thì cũng chỉ là activesheet - sheet hiện tại
 
Upvote 0
Có chọn mà code không lặp các sheet, thì cũng chỉ là activesheet - sheet hiện tại
Tôi tạo file 3 sheet giả định. mỗi sheet có chứa 1 chuỗi trong đó có "aa". Sau đó record macro 3 lần việc replace.
Lần thứ nhất thay "aa" bằng "xx" tùy chọn workbook: kết quả thay cả 3, và đang có 3 chuỗi có "xx"
Lần thứ 2 đóng hộp thoại Find & Replace, nhấn Ctrl H mở lại hộp thoại, thấy đang workbook, chuyển thành Sheet, replace all chỉ được 1 "xx" thành "qq". Còn 2 chuỗi nằm ở 2 sheet khác.
Lần thứ 3: đóng hộp thoại Find & Replace, nhấn Ctrl H mở lại hộp thoại, thấy đang là sheet, chuyển thành workbook, replace all thì được 2 cái "xx" còn lại thành "qq"
Đóng hộp thoại mở lên lại, thấy đang workbook. Không replace mà stop recording. Nếu replace sẽ tác dụng lên tất cả sheet.
Xem code thì cú pháp 3 lần replace y hệt nhau.

Do có để ý nên rút ra kết luận là:
1. Không cần vòng lặp, cũng replace được trong tất cả sheet
2. Code như nhau, kết quả khác nhau. Mỗi lần thì code nhìn xem hộp thoại sử dụng lần trước là cái gì thì áp dụng lại như thế.
Trước đây tôi cũng từng thấy code "nhìn lại hộp thoại" như thế với những tùy chọn khác. Ví dụ tùy chọn by rows/ by columns, tùy chọn value/ formula, ...
Như vậy kết luận là muốn phòng tránh việc vô ý replace toàn bộ các sheets thì cú pháp code không có, mà lệ thuộc vào lần sử dụng trước đó.

Hình như có 1 câu lệnh VBA reset lại hộp thoại về mặc định tất cả tùy chọn, mà tôi quên rồi.
 
Upvote 0
Tôi tạo file 3 sheet giả định. mỗi sheet có chứa 1 chuỗi trong đó có "aa". Sau đó record macro 3 lần việc replace.
Lần thứ nhất thay "aa" bằng "xx" tùy chọn workbook: kết quả thay cả 3, và đang có 3 chuỗi có "xx"
Lần thứ 2 đóng hộp thoại Find & Replace, nhấn Ctrl H mở lại hộp thoại, thấy đang workbook, chuyển thành Sheet, replace all chỉ được 1 "xx" thành "qq". Còn 2 chuỗi nằm ở 2 sheet khác.
Lần thứ 3: đóng hộp thoại Find & Replace, nhấn Ctrl H mở lại hộp thoại, thấy đang là sheet, chuyển thành workbook, replace all thì được 2 cái "xx" còn lại thành "qq"
Đóng hộp thoại mở lên lại, thấy đang workbook. Không replace mà stop recording. Nếu replace sẽ tác dụng lên tất cả sheet.
Xem code thì cú pháp 3 lần replace y hệt nhau.

Do có để ý nên rút ra kết luận là:
1. Không cần vòng lặp, cũng replace được trong tất cả sheet
2. Code như nhau, kết quả khác nhau. Mỗi lần thì code nhìn xem hộp thoại sử dụng lần trước là cái gì thì áp dụng lại như thế.
Trước đây tôi cũng từng thấy code "nhìn lại hộp thoại" như thế với những tùy chọn khác. Ví dụ tùy chọn by rows/ by columns, tùy chọn value/ formula, ...
Như vậy kết luận là muốn phòng tránh việc vô ý replace toàn bộ các sheets thì cú pháp code không có, mà lệ thuộc vào lần sử dụng trước đó.

Hình như có 1 câu lệnh VBA reset lại hộp thoại về mặc định tất cả tùy chọn, mà tôi quên rồi.
Không rõ người chủ câu hỏi chủ đề này muốn gì?
hình như lo sợ là thay trong 1 sheet (bằng code VBA) mà lại thay thành toàn workbook (chuyện này không xảy ra với code bài 1 được <-- đó là ý đề cập ở bài #4)
Nên phải đợi người hỏi xác nhận vậy
 
Upvote 0
Không rõ người chủ câu hỏi chủ đề này muốn gì?
hình như lo sợ là thay trong 1 sheet (bằng code VBA) mà lại thay thành toàn workbook (chuyện này không xảy ra với code bài 1 được <-- đó là ý đề cập ở bài #4)
Nên phải đợi người hỏi xác nhận vậy
Có luôn đó nha. Tôi mới test như sau:
Ban đầu 2 sheet như sau:

1681896166404.png


tình trạng hộp thoại đang chọn Workbook, nhưng không chạy trên hộp thoại

1681896286876.png

Đứng tại sheet2, Chạy câu lệnh này trong immediate,
Mã:
Selection.Replace What:=2, Replacement:=8, LookAt:=xlpart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2

Kết quả thay thế cả 2 sheet:

1681896454768.png

Nghĩa là không cần vòng lặp như tôi viết ở bài #5. Đồng thời nó bất chấp Selection là nguyên vùng như hình, hay 1 nửa, hay selection không hề có số 2 nào. Thường tôi test kỹ mới phát biểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Như vậy kết luận là muốn phòng tránh việc vô ý replace toàn bộ các sheets thì cú pháp code không có, mà lệ thuộc vào lần sử dụng trước đó.
Em không biết có trình bày thiếu khiến thầy phải đoán không nhưng mà kết luận này của thầy đúng với ý ở bài #1 và #3. Và em đăng bài với mong muốn tìm ra cú pháp thay giữa sheet-workbook như thầy kết luận.
Bài đã được tự động gộp:

chuyện này không xảy ra với code bài 1 được
Xảy ra chứ bác. Nếu hộp thoại trước đó bác chọn Within là gì thì code chạy y như lần đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Em không biết có trình bày thiếu khiến thầy phải đoán không nhưng mà kết luận này của thầy đúng với ý ở bài #1 và #3. Và em đăng bài với mong muốn tìm ra cú pháp thay giữa sheet-workbook như thầy kết luận.
Rành rành ra như vậy thì cần gì đoán nữa?
Trong phần kết luận tôi cũng nói rằng "cú pháp code không có",
Và còn 1 câu nữa: "Hình như có 1 câu lệnh VBA reset lại hộp thoại về mặc định tất cả tùy chọn, mà tôi quên rồi." Sau khi tham khảo nhiều nơi thì câu lệnh reset nếu có cũng không reset được tùy chọn workbook/ sheet
Tất nhiên để xử lý cũng có cách dở dở là dùng Send Keys
Ctrl H
Alt H
mũi tên lên
Enter
Esc
 
Upvote 0
Trong phần kết luận tôi cũng nói rằng "cú pháp code không có",
Dạ, trường hợp Save as pictures cũng như ông within này, cái nút rành rành mà không có cú pháp.
[Vui] Em không biết đây là lỗ hổng hay tính năng --=0 hay chỉ là không thích thì ngôn ngữ không viết.

1681957813523.png
 
Upvote 0
Dạ, trường hợp Save as pictures cũng như ông within này, cái nút rành rành mà không có cú pháp.
[Vui] Em không biết đây là lỗ hổng hay tính năng --=0 hay chỉ là không thích thì ngôn ngữ không viết.

View attachment 289239
Có những tính năng, việc ghi macro không cho phép ghi lại
Và cũng như người lập trình thì phải xử lý theo cách khác: vì thuộc tính / phương thức ững với chức năng (nút / menu) đó không được public cho người dùng can thiệp

Có luôn đó nha. Tôi mới test như sau:
Ban đầu 2 sheet như sau:

View attachment 289216


tình trạng hộp thoại đang chọn Workbook, nhưng không chạy trên hộp thoại

View attachment 289217

Đứng tại sheet2, Chạy câu lệnh này trong immediate,
Mã:
Selection.Replace What:=2, Replacement:=8, LookAt:=xlpart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2

Kết quả thay thế cả 2 sheet:

View attachment 289218

Nghĩa là không cần vòng lặp như tôi viết ở bài #5. Đồng thời nó bất chấp Selection là nguyên vùng như hình, hay 1 nửa, hay selection không hề có số 2 nào. Thường tôi test kỹ mới phát biểu.
Thực ra nếu người hiểu VBA chút : thì người ta sẽ hạn chế (nếu không muốn nói nên tránh) dùng .select cũng như selection trong các câu lệnh vì cái này phụ thuộc người dùng chọn khó lường <-- mà phải chỉ ra vùng cụ thể , địa chỉ cụ thể (ít nhất cụ thể do code quản lý)
 
Upvote 0
Xin chào GPE,

Như tiêu đề, em có thử record macro nhưng không thấy vị trí nào trong code cho phép tùy chọn giửa Sheet và Workbook trong mục Within của hộp thoại Replace.
Nhờ GPE cho em xin đoạn code tùy chỉnh chỗ Within này, em có thử đánh thêm "," xem VBA có đề xuất không nhưng lại không thấy.

Mã:
    Range("D7:M35").Select
    Selection.Replace What:="2", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
View attachment 289203
Mình thường dùng đoạn code này để reset lại hộp thoại Find and Replace. Bạn thử xem có xài được chỗ nào không. Có thể thay tham số 2 thành 1 để thay đổi cách dò tìm. Code này còn hạn chế nhiều nhưng xài tạm cũng được vài chỗ
Mã:
Sub Reset_Find_Option()
Selection.Find , , , 2
End Sub
 
Upvote 0
Thực ra nếu người hiểu VBA chút : thì người ta sẽ hạn chế (nếu không muốn nói nên tránh) dùng .select cũng như selection trong các câu lệnh vì cái này phụ thuộc người dùng chọn khó lường <-- mà phải chỉ ra vùng cụ thể , địa chỉ cụ thể (ít nhất cụ thể do code quản lý)
Cũng vậy thôi. Tôi làm lại 2 sheet như sau:
1682002513927.png

Hộp thoại Find and replace trước đó chọn workbook.
Đứng tại Sheet1, không chạy cho selection, chạy câu lệnh cho vùng tô vàng C5:C16:
Mã:
range("C5:C16").Replace What:=2, Replacement:=8, LookAt:=xlpart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2

Kết quả cả 2 sheet đều bị thay thế 2 thành 8, tất tần tật. Tôi nghĩ bạn viết mấy bài trên mà chưa từng thử.
 
Upvote 0
Web KT

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

Back
Top Bottom