Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,911
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
-------------------
Gợi ý cho các bạn:
- Có 2 cái Context Menu được thiết kế riêng cho 2 chế độ Normal và PageBreak
- Cả 2 đều được gọi tên là Cell
- Nếu ta dùng CommandBars("Cell") thì mặc định Excel sẽ xem như ta đang nói đến cái Context Menu ở chế độ Normal
- Ở mọi version, 2 Context Menu này đều có 1 điểm chung:
Mã:
CommandBars("Cell ở chế độ PageBreak").Index = CommandBars("Cell ở chế độ Normal").Index + 3
-------------------
Phù... Mời các bác xơi!
Chính xác là như vậy. Microsoft cũng có nói vụ Index +3 này.

Tiếp một câu mới. Đang trong không khí mừng sinh nhật GPE lần 9 nên lấy số 9 đố luôn:
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.
 
Upvote 0
Chính xác là như vậy. Microsoft cũng có nói vụ Index +3 này.

Tiếp một câu mới. Đang trong không khí mừng sinh nhật GPE lần 9 nên lấy số 9 đố luôn:
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.

Cái vụ Context Menu kia chưa chắc có người làm ra đâu mà đã vội đố câu mới thế?
--------------------
Còn vụ "Sheet không ẩn thứ 9" nghĩa là sao ta? Tức sheet nào ẩn thì không tính? Số 9 là đang nói đến Index?
 
Upvote 0
Cái vụ Context Menu kia chưa chắc có người làm ra đâu mà đã vội đố câu mới thế?
Anh nói rõ thế rồi còn gì nữa mà làm không ra.
Còn vụ "Sheet không ẩn thứ 9" nghĩa là sao ta? Tức sheet nào ẩn thì không tính? Số 9 là đang nói đến Index?
Đúng vậy, ví dụ file có 10 sheet, sheet 1 ẩn thì "Sheet không ẩn thứ 9" là sheet có Index = 10 trong file.
 
Upvote 0
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
Em xin cảm ơn ạ.
Thực ra, em có đọc đoạn đó rồi.
Ngay trong link nguồn cũng trích dẫn: https://msdn.microsoft.com/en-us/library/office/gg469862(v=office.14).aspx
Note:
There are two Cell context menus in Microsoft Excel, One is the standard menu and the second one you see when you are in page break preview mode. Page break preview mode shows you what data appears on each page and enables you to quickly adjust the print area and page breaks. To activate page break preview mode, on the ribbon, click View, and then click Page Break Preview. If you want to change the second type of menu then use the following statement.
Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)
This information also applies to the Row and Column context menus.

p/s: Bạn nào muốn thử thì thay dòng:
Mã:
[COLOR=#000000][COLOR=#0000BB]Set ContextMenu [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]CommandBars[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Cell"[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
Bằng dòng:
Mã:
Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)
 
Upvote 0
Em xin cảm ơn ạ.
Thực ra, em có đọc đoạn đó rồi.
Ngay trong link nguồn cũng trích dẫn: https://msdn.microsoft.com/en-us/library/office/gg469862(v=office.14).aspx


p/s: Bạn nào muốn thử thì thay dòng:
Mã:
[COLOR=#000000][COLOR=#0000BB]Set ContextMenu [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]CommandBars[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Cell"[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
Bằng dòng:
Mã:
Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)
Vậy để lúc nào cũng hiện Menu dù ở Normal hay Pagebreak thì phải viết thế nào bạn ơi
 
Upvote 0
Tiếp một câu mới. Đang trong không khí mừng sinh nhật GPE lần 9 nên lấy số 9 đố luôn:
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.

Làm cách nào đó có thể Select All Sheets thì mọi chuyện xem như xong!
(Tuy nhiên không phải chuyện dễ! Bởi Select All Sheets bằng tay sẽ khác với Select All Sheets khi dùng code. Hic... Mình vẫn chưa làm ra)
 
Upvote 0
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
-------------------
Gợi ý cho các bạn:
- Có 2 cái Context Menu được thiết kế riêng cho 2 chế độ Normal và PageBreak
- Cả 2 đều được gọi tên là Cell
- Nếu ta dùng CommandBars("Cell") thì mặc định Excel sẽ xem như ta đang nói đến cái Context Menu ở chế độ Normal
- Ở mọi version, 2 Context Menu này đều có 1 điểm chung:
Mã:
CommandBars("Cell ở chế độ PageBreak").Index = CommandBars("Cell ở chế độ Normal").Index + 3
-------------------
Phù... Mời các bác xơi!
Cái này em thấy trên máy em không có đúng.

Dùng Sub sau để test index

Mã:
Sub Test()
    Dim ContextMenu As CommandBar
    Dim i As Long
    For Each ContextMenu In Application.CommandBars
        i = i + 1
        Cells(i, 1) = ContextMenu.Index
        Cells(i, 2) = ContextMenu.Name
    Next
End Sub

Trả về 2 context name "Cell" tương ứng 2 giá trí 11 và 40.
Vậy nếu đem 11+3 <> 40 và thực tế em cũng không thể chạy được trên máy mình với cách trên.
 
Upvote 0
Cái này em thấy trên máy em không có đúng.

Dùng Sub sau để test index

Mã:
Sub Test()
    Dim ContextMenu As CommandBar
    Dim i As Long
    For Each ContextMenu In Application.CommandBars
        i = i + 1
        Cells(i, 1) = ContextMenu.Index
        Cells(i, 2) = ContextMenu.Name
    Next
End Sub

Trả về 2 context name "Cell" tương ứng 2 giá trí 11 và 40.
Vậy nếu đem 11+3 <> 40 và thực tế em cũng không thể chạy được trên máy mình với cách trên.

Thế bạn dùng Excel phiên bản nào?
Đã test trên Excel 2003, Excel 2007 và Excel 2010 hoàn toàn không có vấn đề. Nếu bạn dùng Excel 2013 thì... chả biết
 
Upvote 0
Thế bạn dùng Excel phiên bản nào?
Đã test trên Excel 2003, Excel 2007 và Excel 2010 hoàn toàn không có vấn đề. Nếu bạn dùng Excel 2013 thì... chả biết
Em dùng Excel 2010 như đã nói ở trên. Test trên Excel 2013 thì 2 index lần lượt là 15 va 41.
Đây là Excel có bản quyền. Em cũng không thể giải thích được điều này
 
Upvote 0
Em dùng Excel 2010 như đã nói ở trên. Test trên Excel 2013 thì 2 index lần lượt là 15 va 41.
Đây là Excel có bản quyền. Em cũng không thể giải thích được điều này

Thế thì tôi không biết! Bởi chỉ mình máy bạn nó.. hơi lạ
Bạn thử sang máy tính khác xem
 
Upvote 0
Làm cách nào đó có thể Select All Sheets thì mọi chuyện xem như xong!
(Tuy nhiên không phải chuyện dễ! Bởi Select All Sheets bằng tay sẽ khác với Select All Sheets khi dùng code. Hic... Mình vẫn chưa làm ra)
Cũng chưa chắc xong đâu anh.
Nếu muốn Select All Sheets thì gọi lệnh này
PHP:
Application.CommandBars("Ply").Controls("&Select All Sheets").Execute
Tuy nhiên, lệnh này nếu gọi từ Menu thì Excel sẽ chỉ chọn những sheet không ẩn nhưng nếu gọi bằng lệnh .Execute thì nó chọn tất tần tật, VeryHidden cũng chọn luôn :D
 
Upvote 0
Cũng chưa chắc xong đâu anh.
Nếu muốn Select All Sheets thì gọi lệnh này
PHP:
Application.CommandBars("Ply").Controls("&Select All Sheets").Execute
Tuy nhiên, lệnh này nếu gọi từ Menu thì Excel sẽ chỉ chọn những sheet không ẩn nhưng nếu gọi bằng lệnh .Execute thì nó chọn tất tần tật, VeryHidden cũng chọn luôn :D

Thì tôi đã nói rồi đấy:
(Tuy nhiên không phải chuyện dễ! Bởi Select All Sheets bằng tay sẽ khác với Select All Sheets khi dùng code. Hic... Mình vẫn chưa làm ra)
Nên vẫn đang.. khoai
Vì nếu dùng code mà chọn sheets được như ta chọn bằng tay thì.. xong liền
 
Upvote 0
Thì tôi đã nói rồi đấy:

Nên vẫn đang.. khoai
Vì nếu dùng code mà chọn sheets được như ta chọn bằng tay thì.. xong liền
SendKeys cũng không được luôn :D
PHP:
Application.CommandBars("Ply").Controls("&Select All Sheets").Execute
Application.SendKeys ("s")
 
Upvote 0
Thế thì tôi không biết! Bởi chỉ mình máy bạn nó.. hơi lạ
Bạn thử sang máy tính khác xem
Em đã tiến hành test trên 4 máy nữa ngoài 2 kết quả nêu trên, 3 máy dùng Excel 2010, 1 máy Excel 2013 và kết quả như sau:
Excel 2010: (37-39), (11-14), (13-40)
Excel 2013: (11-38)
Như vậy với kết quả test trên 6 máy dùng Office bản quyền có thể thấy trường hợp em đã làm thì nguyên tắc 2 “Cell” cách nhau 3 cũng chưa có đúng lắm.
 
Upvote 0
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.
Gợi ý: Excel có một CommandBar mà Caption của các Control trên đó là tên các Sheet không ẩn của file hiện hành.
 
Upvote 0
Gợi ý: Excel có một CommandBar mà Caption của các Control trên đó là tên các Sheet không ẩn của file hiện hành.
Hay!
Gợi ý thế xem như.. xong chuyện
Mấy vụ này đúng là xài hàng ngày mà ít khi để ý nên mò muốn lòi con mắt cũng không ra
Ẹc... Ẹc...
 
Upvote 0
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.

Trong câu hỏi này còn có vế thứ 2 (màu đỏ) thấy cũng.. cay
Cái thằng Control ấy hình như luôn chứa 16 phần tử (bất kể có bao nhiêu sheet). Trường hợp file tôi chỉ có 3 sheet thì vẫn tìm ra được phần tử thứ 9 (cái chuỗi tào lao gì đó). Như thế làm sao ĐẾM được số sheet không ẩn ta?
Chưa nghĩ ra vụ này
???
 
Upvote 0
Trong câu hỏi này còn có vế thứ 2 (màu đỏ) thấy cũng.. cay
Cái thằng Control ấy hình như luôn chứa 16 phần tử (bất kể có bao nhiêu sheet). Trường hợp file tôi chỉ có 3 sheet thì vẫn tìm ra được phần tử thứ 9 (cái chuỗi tào lao gì đó). Như thế làm sao ĐẾM được số sheet không ẩn ta?
Chưa nghĩ ra vụ này
???
Nếu số sheet không ẩn trong file bé hơn 16 thì trong 16 Control đó, cái nào không phải tên sheet thì đều là cái chuỗi tào lao đó.
Trong một hàng dài có một đám TÀO LAO, gọi TÀO LAO thì thằng TÀO LAO đứng trước sẽ nghe :D
 
Upvote 0
Web KT

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

Back
Top Bottom