Xác định worksheet nào đang được chọn

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

namvu230397

Thành viên hoạt động
Tham gia
12/10/21
Bài viết
173
Được thích
77
Nghề nghiệp
Kỹ sư công trình giao thông
Chào các anh chị diễn đàn GPE, cho em hỏi chút. Có cách nào để biết được worksheet đang được chọn không ạ. Em tìm và mới chỉ thấy có phương thức select. Mục đích cuối cùng là em muốn viết một chương trình để khi mình chọn sheet và chạy mã, các sheet không được chọn sẽ bị ẩn đi
 
Chào các anh chị diễn đàn GPE, cho em hỏi chút. Có cách nào để biết được worksheet đang được chọn không ạ. Em tìm và mới chỉ thấy có phương thức select. Mục đích cuối cùng là em muốn viết một chương trình để khi mình chọn sheet và chạy mã, các sheet không được chọn sẽ bị ẩn đi
Sheet đang chọn là ActiveSheet.
Các sheet khác thì so sánh tên sheet với ActiveSheet.Name
 
Upvote 0
Chào các anh chị diễn đàn GPE, cho em hỏi chút. Có cách nào để biết được worksheet đang được chọn không ạ. Em tìm và mới chỉ thấy có phương thức select. Mục đích cuối cùng là em muốn viết một chương trình để khi mình chọn sheet và chạy mã, các sheet không được chọn sẽ bị ẩn đi
mình muốn hỏi về " worksheet đang được chọn" theo như bạn nói nghĩa là như thế nào?
 
Upvote 0
Sheet đang chọn là ActiveSheet.
Các sheet khác thì so sánh tên sheet với ActiveSheet.Name
Nhưng trong trường hợp chọn nhiều sheet cùng một lúc thì sao bác
Bài đã được tự động gộp:

mình muốn hỏi về " worksheet đang được chọn" theo như bạn nói nghĩa là như thế nào?
Capture.PNG
Nó kiểu như này bác, thông thường sau khi chọn như này >> chuột phải >> hide là nó ẩn hết những sheet mình chọn, giờ em muốn làm ngược lại. Có một cách là cho vào form, dựa vào Control Checklistbox để chọn nhưng như vậy nó lại thêm nhiều bước rườm rà quá. Nên em muốn viết nó thành kiểu sub cho gọn
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải hiểu là:
ActiveSheet là đối tượng sheet hiện hành
Window.SelectedSheets là danh sách trang tính đang chọn.
Mã:
Dim ws
For Each ws In ActiveWindow.SelectedSheets
    debug.print ws.name
Next
 
Upvote 0
Nhưng trong trường hợp chọn nhiều sheet cùng một lúc thì sao bác
Nhiều sheets được chọn thì selected sheets. Có nhiều cách, sau đâu là 1 thí dụ:
- dùng 1 vòng lặp duyệt qua selected sheets, nối name lại với nhau kèm 1 separator thành 1 chuỗi dài
- Dùng vòng lặp tất cả sheet, nếu sheet nào không có tên trong chuỗi thì ẩn, có thì thôi.

TB
Trường hợp nhiều sheet thì hỏi ngay từ đầu đi, lát lại thêm, lát lại đẻ trường hợp.
 
Upvote 0
Nhiều sheets được chọn thì selected sheets. Có nhiều cách, sau đâu là 1 thí dụ:
- dùng 1 vòng lặp duyệt qua selected sheets, nối name lại với nhau kèm 1 separator thành 1 chuỗi dài
- Dùng vòng lặp tất cả sheet, nếu sheet nào không có tên trong chuỗi thì ẩn, có thì thôi.

TB
Trường hợp nhiều sheet thì hỏi ngay từ đầu đi, lát lại thêm, lát lại đẻ trường hợp.
Vì câu hỏi là "chọn" chứ không phải là "hiện hành" bác ơi. Mà đã là "chọn" thì có thể là một hoặc nhiều. Bỏ qua câu chuyện này thì em làm ra rồi, phương án bác đề ra chưa tối ưu cho lắm bởi vì sẽ xảy ra trường hợp sheet muốn ẩn có tên nằm trong tên của sheet giữ lại ("sheet1" và "sheet10"), lúc này sheet cần ẩn vẫn sẽ được giữ nguyên. Cách của em là truyền tất cả các sheet select vào một biến mảng, duyệt tất cả các sheet, sheet nào có tên trùng với một phần tử trong mảng thì giữ lại còn không thì ẩn
 
Upvote 0
phương án bác đề ra chưa tối ưu cho lắm bởi vì sẽ xảy ra trường hợp sheet muốn ẩn có tên nằm trong tên của sheet giữ lại ("sheet1" và "sheet10"), lúc này sheet cần ẩn vẫn sẽ được giữ nguyên
Tối ưu thì mình không bàn tới, nhưng không đáp ứng nhu cầu thì do cách nghĩ của bạn chưa tới:
Sheets chọn = ":Sheet1:Sheet3:Sheet5:"
Tìm kiếm: instr(sheets chọn, ":" & ws.name & ":")
 
Upvote 0
phương án bác đề ra chưa tối ưu cho lắm
Bạn đã đọc kỹ và hiểu phương án của họ chưa?

dùng 1 vòng lặp duyệt qua selected sheets, nối name lại với nhau kèm 1 separator thành 1 chuỗi dài

Bài ngay trên dẫn chứng (nhanh quá).

sheetNameCheck = "Sheet10"
msgbox (vba.instr(1, "/Sheet1/Sheet11/Sheet111/Sheet100/Sheet101/", "/" & sheetNameCheck & "/") > 0)
 
Upvote 0
Vì câu hỏi là "chọn" chứ không phải là "hiện hành" bác ơi. Mà đã là "chọn" thì có thể là một hoặc nhiều. Bỏ qua câu chuyện này thì em làm ra rồi, phương án bác đề ra chưa tối ưu cho lắm bởi vì sẽ xảy ra trường hợp sheet muốn ẩn có tên nằm trong tên của sheet giữ lại ("sheet1" và "sheet10"), lúc này sheet cần ẩn vẫn sẽ được giữ nguyên. Cách của em là truyền tất cả các sheet select vào một biến mảng, duyệt tất cả các sheet, sheet nào có tên trùng với một phần tử trong mảng thì giữ lại còn không thì ẩn
Câu hỏi chữ sheet là số ít. Lại không có chữ "những" (những sheets chọn)
Cách của bạn là truyền các sheets đang chọn vào mảng là 1 vòng lặp, duyệt thêm 2 vòng lặp nữa.
sheet1 và sheet10 là khác nhau. Không thể lẫn lộn.
 
Upvote 0
Câu hỏi chữ sheet là số ít. Lại không có chữ "những" (những sheets chọn)
Cách của bạn là truyền các sheets đang chọn vào mảng là 1 vòng lặp, duyệt thêm 2 vòng lặp nữa.
sheet1 và sheet10 là khác nhau. Không thể lẫn lộn.
cách làm của em đúng là như thế đó bác, nói chung là nó hoạt động tốt
 
Upvote 0
Tay này vốn thích làm chuyện rườm rà mà viết code không chịu học căn bản. Code chạy thì "tối ưu" mà nhìn chỉ thấy toàn rác rưởi.
Nói chuyện thì tiền hậu bất nhất, sẵn sàng cãi cối.

Cách giản dị nhất là duyệt qua cái collection WorkSheets, cái nào Not Is ActiveSheet thì ẩn đi. Kết đó duyệt qua cái collection ActiveWindow.SelectedSheets, hiện chúng trở lại.
 
Upvote 0
Upvote 0
Không cần separator đầu tiên.
Với lại làm việc trên Excel mà để nguyên tên sheet mặc định là dở rồi.
Không cần separtor đầu tiên thì đâu đúng hết trường hợp đâu Thầy, vì chủ thớt cũng không có nói là để tên sheet theo mặc định. Chỉ là đang lấy ví dụ theo tên sheet mặc định mà thôi
 
Upvote 0
Web KT

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

Back
Top Bottom