Đố 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,907
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
 
Trên diển đàn có rất nhiều bài viết về việc dùng Dictionary Object để lấy list duy nhất! Nay xin đưa lên 1 ví dụ nhỏ dùng làm câu đố vui
- Tôi có dữ liệu như hình:

View attachment 44160

- Tôi có đoạn code:
PHP:
Function UniqueList(SrcArray)
  Dim Item
  With CreateObject("Scripting.Dictionary")
    For Each Item In SrcArray
      If Not .Exists(Item) And Item <> "" Then .Add Item, ""
    Next
    UniqueList = .Keys
  End With
End Function
Nhìn sơ qua chưa thấy có gì không ổn cả, vậy mà khi kiểm tra thì:
a) Công thức =SUMPRODUCT(1/COUNTIF(A1:A6,A1:A6)) cho kết quả =3
b) Công thức =COUNTA(UniqueList(A1:A6)) lại cho kết quả = 6
c) Quét chọn đoạn UniqueList(A1:A6) trên thanh Formula rồi bấm F9 ta nhìn thấy kết quả {"a","b","c","a","b","c"}
d) Có vẽ như hàm trên chẳng lọc được danh sách duy nhất gì cả, có bao nhiêu nó lấy hết
------------------------------
Xin hỏi hàm trên cần sửa lại chổ nào?
Xin lưu ý rằng: Tôi muốn biến SrcArrayItem phải là Variant (để có thể làm việc được với Range và cả Array)
Nguyên nhân sai là do biến item kiểu variant và đầu vào là 1 range, vì khi đó mỗi item add vào đối tượng dictionary là 1 range, mà range A1 thì khác với range A4 mặc dù đều chứa giá trị là "a". Cách sửa có thể thêm 1 dòng sau dòng for each như sau: item = item & ""
 
Upvote 0
Nguyên nhân sai là do biến item kiểu variant và đầu vào là 1 range, vì khi đó mỗi item add vào đối tượng dictionary là 1 range, mà range A1 thì khác với range A4 mặc dù đều chứa giá trị là "a". Cách sửa có thể thêm 1 dòng sau dòng for each như sau: item = item & ""
Lý giải của rollover79 là hoàn toàn hợp lý, tuy nhiên về biện pháp khắc phục thì.. có vẽ chưa ổn lắm
Item = Item & "" vô tình đã biến mọi kiểu dữ liệu thành chuổi mất rồi
Tôi cũng có cách xử lý khác:
- Khai báo thêm 1 biến (Temp)
- Gán Temp = SrcArray
- Từ đoạn này sẽ làm việc với Temp thay vì SrcArray
PHP:
Function UniqueList(SrcArray)
  Dim Item, Temp
  Temp = SrcArray
  With CreateObject("Scripting.Dictionary")
    For Each Item In Temp
      If Not .Exists(Item) And Item <> "" Then .Add Item, ""
    Next
    UniqueList = .Keys
  End With
End Function
Động tác này có tác dụng:
- Nếu SrcArray là Array thì Temp đương nhiên cũng là Array
- Nếu SrcArray là Range thì động tác gán trên tương đương với Temp = SrcArray.Value
- Và nói chung thì cho dù SrcArray là cái gì, Temp vẫn cứ là 1 Array
(Cách khác gọn hơn: SrcArray = SrcArray... không cần thêm biến. Tuy nhiên vẩn cảm giác thiếu "an toàn" với cách này)
-------------------------------
Khả năng của tôi chỉ biết được đến đây. Duyệtrollover79 có góp ý thêm gì không?
 
Upvote 0
Ứng dụng chỉ chạy được khi Disable Macro

Giả sử tôi có:
- 1 file Excel có chứa code gì đó (không quan trọng là code gì, miễn có code)
- Đương nhiên nếu mở file thì sẽ có cảnh báo về Macros (nếu đặt security ở mức Medium)
- Trong file tôi xây dựng 1 ứng dụng
- Ứng dụng này chỉ chạy được nếu lúc mở file ta bấm vào nút Disable Macros (bấm Enable Macros sẽ làm tê liệt ứng dụng)
---------------------------------
Các bạn thử nghĩ xem ứng dụng ấy có thể là.. cái gì mà kỳ cục vậy?
 
Upvote 0
Thử 1 trong 3 code này xem, nói chung là nhiều lắm. Khi enable macro 1 cái thì chả làm được cái giống gì, đừng nói là ứng dụng.

PHP:
Private Sub Workbook_Open()
Application.Quit
End Sub

PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Sheet1.Activate
End Sub

PHP:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveSheet.[a1].Select
End Sub
 
Upvote 0
Thử 1 trong 3 code này xem, nói chung là nhiều lắm. Khi enable macro 1 cái thì chả làm được cái giống gì, đừng nói là ứng dụng.

PHP:
Private Sub Workbook_Open()
Application.Quit
End Sub

PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Sheet1.Activate
End Sub

PHP:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveSheet.[a1].Select
End Sub
Hình như sư phụ hiểu lầm ý em!
Ý em hỏi: Liệu đấy có thể là ứng dụng gì? (không liên quan đến code)
Trong file có code chỉ với mục đích cho người dùng chọn Disable Macros hay Enable Macros mà thôi! (code ấy là gì không quan trọng)
 
Upvote 0
Hình trong ComboBox này ở đâu mà ra

- Các bạn hãy tải file đính kèm này về và mở lên
- Bấm nút Load Image để chạy code
- Bấm vào mũi tên xổ xuống trên ComboBox, các bạn sẽ thấy có.. hình trong đó


untitled.JPG


Câu hỏi: Hình này ở đâu ra?
(Hi... hi... thú vị đây! Nếu hiểu được thì từ bây giờ các bạn sẽ thấy việc đưa hình vào ComboBox dể hơn ăn cháo)
 

File đính kèm

  • PicCombo.xls
    60 KB · Đọc: 85
Upvote 0
Chắc là ở đây hén?

Combo.jpg
 
Upvote 0
Ẹc cái gì mà ẹc, trả lời nhanh quá, người khác lấy gì mà tìm hiểu và trả lời? Câu đố đoản thọ mất. Còn hông chịu nhấn cám ơn đi!
Mà chọc tức zậy mới "chết tiệt" chớ!
 
Lần chỉnh sửa cuối:
Upvote 0
Ẹc cái gì mà ẹc, trả lời nhanh quá, người khác lấy gì mà tìm hiểu và trả lời? Câu đố đoản thọ mất. Còn hông chịu nhấn cám ơn đi!
Mà chọc tức zậy mới "chết tiệt" chớ!

Biết mờ, thấy để cái "logo" cheettit là biết lão biết ở đâu ra rồi! Vào Thư mục Windows lục xem nó ở đâu cũng chẳng thấy, chuyển Fonts cũng chẳng tác dụng, Properties nó, rồi cho nó Linkcell, nó cũng chẳng cho kết quả! Ẹc ... Ẹc...
 
Upvote 0
Vào Thư mục Windows lục xem nó ở đâu cũng chẳng thấy, chuyển Fonts cũng chẳng tác dụng,
Chép về máy có mỗi 1 file Excel, mà nghĩ là có cái gì đó trong windows?
Mấy cái mặt cười còn nghĩ nó là Font phiếc, chứ cái avatar cheettit thì làm gì có trong font mà đổi!

Tìm sai hướng mất gồi!
Hướng tìm nằm trong code: trong code có câu .Add "pict" & i nghĩa là có trên đời 3 cái pict1, pict2 và pict3
 
Lần chỉnh sửa cuối:
Upvote 0
Chép về máy có mỗi 1 file Excel, mà nghĩ là có cái gì đó trong windows?
Mấy cái mặt cười còn nghĩ nó là Font phiếc, chứ cái avatar cheettit thì làm gì có trong font mà đổi!

Tìm sai hướng mất gồi!
Hướng tìm nằm trong code: trong code có câu .Add "pict" & i nghĩa là có trên đời 3 cái pict1, pict2 và pict3

Thầy ơi, em thấy trong File ẩn đâu đó một cái ImageList1 mà em chẳng thấy nó nằm ở đâu mới ghê!
 
Upvote 0
Hướng tìm nằm trong code: trong code có câu .Add "pict" & i nghĩa là có trên đời 3 cái pict1, pict2 và pict3
Thế nhưng đoạn code ấy sửa thành:
.ComboItems.Add i, "", "", i
Chẳng có cái Pic nào trên đời này cả ---> Nó vẫn chạy!
Ẹc... Ẹc...
------------------------------------------------------
Thầy ơi, em thấy trong File ẩn đâu đó một cái ImageList1 mà em chẳng thấy nó nằm ở đâu mới ghê!
Nó "lặn mất tăm" rồi, lấy đâu mà thấy
Tìm cách cho no "hiện ra" đi!
 
Lần chỉnh sửa cuối:
Upvote 0
Biết là thế, nhưng lỡ thấy pict1 rồi thì đi tìm pict1, tìm không ra pict1 biết đâu lại thấy cái khác. Khà khà khà!

Cái khác là cái ImageList1 mà minhthien tìm thấy đó! Đâu đó trong file!
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện lên rồi, nó nằm ở cột AZ đấy! Để tiếp tục xem tác dụng hiehiehie
 
Upvote 0
Không có ImageList1, nó không chạy code. Cho For i = 1 to (>) 3 Code lỗi.
=> Trong ImageList1 mặc định có 3 cái pict thôi.

Muốn insert pict chắc có lẽ dùng class thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Không có ImageList1, nó không chạy code. Cho For i = 1 to (>) 3 Code lỗi.
=> Trong ImageList1 mặc định có 3 cái pict thôi.

Muốn insert pict chắc có lẽ dùng class thôi.
Đâu có khó khăn thế! Class gì đó thì còn gì là ĐỐ VUI!
------------------------------------------------------------
- Bấm nút Design Mode
- Click phải vào ImageList1, chọn ImageList Ctrl Object\Properties
- Chuyển sang tab Images sẽ thấy ngay cách Insert Picture
------------------------------------------------------------
Nếu đã nghiên cứu và hiểu rõ cách làm trên file này, các bạn hãy cải tiến sao cho có thể dùng được ImageCombo trên UserForm nhé
(Lưu ý: Áp dụng y chang như file đã gữi)
 
Upvote 0
- Click phải vào ImageList1, chọn ImageList Ctrl Object\Properties

Đây chính là cái mà rất nhiều người không để ý đến. Các control vẽ lên sheet ngoài cái property chung còn có property riêng của nó nữa. Chính những properties này mới là đặc thù của chính cái control, mà ai không biết sẽ không dùng hết tính năng hoặc cho rằng control không hoạt động.

Thí dụ cái Date&Time Picker 6.0, nếu không biết sẽ cho rằng khi lọc ngày tháng bằng control này không chính xác, mà quên rằng ngay trong tên gọi của nó đã hàm chứa cái Time và mặc định cái Time này <>0.
(Kinh nghiệm xương máu đấy nhé)
 
Lần chỉnh sửa cuối:
Upvote 0
Đây chính là cái mà rất nhiều người không để ý đến. Các control vẽ lên sheet ngoài cái property chung còn có property riêng của nó nữa. Chính những properties này mới là đặc thù của chính cái control, mà ai không biết sẽ không dùng hết tính năng hoặc cho rằng control không hoạt động.
Và đây cũng chính là vấn đề em muốn đố khi đề nghị cải tiến ImageCombo đặt trên UserForm. Vì Control trên UserForm lại chẳng có property riêng kiểu này.
Vậy phải.. làm sao?
Hi... Hi...
 
Upvote 0
Đâu có khó khăn thế! Class gì đó thì còn gì là ĐỐ VUI!
------------------------------------------------------------
- Bấm nút Design Mode
- Click phải vào ImageList1, chọn ImageList Ctrl Object\Properties
- Chuyển sang tab Images sẽ thấy ngay cách Insert Picture
------------------------------------------------------------
Nếu đã nghiên cứu và hiểu rõ cách làm trên file này, các bạn hãy cải tiến sao cho có thể dùng được ImageCombo trên UserForm nhé
(Lưu ý: Áp dụng y chang như file đã gữi)

Hay thật, vậy từ nay đã có cái để "chơi" rồi! Thế muốn từ cái ImageCombo rồi chuyển cái hình ra ngoài sheet thì phải làm sao hả Thầy AnhTuan?
 
Upvote 0
Web KT
Back
Top Bottom