Đố 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
 
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?

Tôi chỉ biết được có vầy:
PHP:
Private Sub ImageCombo1_Click()
  ImageCombo1.CopyPicture 1, 1
  Range("A1").PasteSpecial
End Sub
Bạn thử xem rồi cải tiến tiếp
 
Upvote 0
Đã biết chơi 100% chưa? Dám cá minhthien không tạo thành công ngay lập tức 1 file mới bắt đầu từ zero.

Dạ, em bắt đầu từ Zero ạ! Hehehehe. Hồi mới sinh ra em có biết đi đâu, giờ em muốn vợ rồi Thầy ơi! Khahakkahaahk
 
Upvote 0
Làm thử đưa file lên mới biết. Cái này tự giác, chứ không ai kiểm tra được nhe. Thay hình rồi Save As thì trời biết.
 
Upvote 0
Dạ, em bắt đầu từ Zero ạ! Hehehehe. Hồi mới sinh ra em có biết đi đâu, giờ em muốn vợ rồi Thầy ơi! Khahakkahaahk
Nếu làm mới từ đầu thì mấu chốt quan trọng nằm ở đây:


untitled.JPG





(Chổ tôi đánh dấu đỏ)

----------------------------------------------------------------------------------
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?

Vừa nghĩ ra cách khác hay hơn cách CopyPicture nhiều (hình sẽ đẹp hơn)

Code:
PHP:
Private Sub ImageCombo1_Click()
  Sheet1.Image1.Picture = Sheet1.ImageList1.ListImages.Item(ImageCombo1.SelectedItem.Index).Picture
End Sub
Trên sheet có chèn thêm 1 Image Control
 

File đính kèm

  • TakeImage_FormImageList.xls
    77 KB · Đọc: 63
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Chời chời, cái chỗ đánh dấu đỏ là cái chỗ lão chết tiệt căn cứ vào mà cá với minhthien đó. Hu hu!
Hihi, có thể minhthien đang đánh vật với nó mà chưa biết trên đời có cái đó đó.
 
Upvote 0
Chời chời, cái chỗ đánh dấu đỏ là cái chỗ lão chết tiệt căn cứ vào mà cá với minhthien đó. Hu hu!
Hihi, có thể minhthien đang đánh vật với nó mà chưa biết trên đời có cái đó đó.

Lúc xưa em sưu tầm được cái này:
Tạo hình vẽ trong combox
Khi ấy chỉ xài chứ thật sự chẳng hiểu gì
Giờ mang ra nghiên cứu và làm trên sheet mới thấy nó khác hoàn toàn so với trên UserForm... Em cũng đã "đánh vật" mất 1 tiếng đồng hồ mới tìm ra được chổ "đánh dấu đỏ" ở trên đấy sư phụ à!
Hi... Hi... Giờ thì có thể cải tiến "ngon lành" hơn cái thằng.. xưa nhiều
----------------------------------------------------------------------------
Các bạn hãy nghiên cứu file này trên UserForm xem! (hình phải được lấy từ ImageList)
 
Upvote 0
Lúc xưa em sưu tầm được cái này:
Tạo hình vẽ trong combox
Khi ấy chỉ xài chứ thật sự chẳng hiểu gì
Giờ mang ra nghiên cứu và làm trên sheet mới thấy nó khác hoàn toàn so với trên UserForm... Em cũng đã "đánh vật" mất 1 tiếng đồng hồ mới tìm ra được chổ "đánh dấu đỏ" ở trên đấy sư phụ à!
Hi... Hi... Giờ thì có thể cải tiến "ngon lành" hơn cái thằng.. xưa nhiều
----------------------------------------------------------------------------
Các bạn hãy nghiên cứu file này trên UserForm xem! (hình phải được lấy từ ImageList)

Em định từ cái Code độc đáo này của Thầy, em sẽ làm danh sách nhân viên và mỗi tên có một hình em add lên Form luôn cho sinh động.
Cám ơn Thầy!

Hic hic, Insert ảnh chụp nó chẳng có chịu cho, báo lỗi hoài! Hoặc ra cái combo trắng bóc!
 
Lần chỉnh sửa cuối:
Upvote 0
Làm trên form thì dùng ImageList ảo cũng được. Image thì insert trên form luôn. Chôm và cải tiến code trên file của đường link anhtuan giới thiệu.
 

File đính kèm

  • FormImageCombo.xls
    58 KB · Đọc: 53
Lần chỉnh sửa cuối:
Upvote 0
Hic hic, Insert ảnh chụp nó chẳng có chịu cho, báo lỗi hoài! Hoặc ra cái combo trắng bóc!

Chắc tại hình lớn quá chứ gì. Hình .jpg, size vừa vừa lên tuốt, cả trên sheet lẫn trên form.

Làm chơi thôi chứ làm thật vào DSNV mấy chục người thì file nặng đâu có chịu nổi.

PHP:
Private Sub ImageCombo1_Click()
Me.Image8.Picture = Me.Controls("Image" & ImageCombo1.SelectedItem.Index).Picture
End Sub
PHP:
Private Sub UserForm_Initialize()
    Dim imgLst As New ImageList
    Dim i As Long
    For i = 1 To 7
        imgLst.ListImages.Add i, "img" & i, Me.Controls("Image" & i).Object.Picture
    Next
    Set ImageCombo1.ImageList = imgLst
    For i = 1 To 7
        ImageCombo1.ComboItems.Add i, , , "img" & i, , 2
    Next
    Set imgLst = Nothing
End Sub

tải file
 
Lần chỉnh sửa cuối:
Upvote 0
Làm trên form thì dùng ImageList ảo cũng được. Image thì insert trên form luôn. Chôm và cải tiến code trên file của đường link anhtuan giới thiệu.

Không phải vậy sư phụ ơi! Vì nếu làm thế thì chẳng hóa ra giống y chang cái này sao: Tạo hình vẽ trong combox
Ý em là dùng 1 ImageList thật đàng hoàng và chèn hình vào đó (ImageList ấy có thể đặt trên form hay trên sheet tùy ý)
Vấn đề ở đây là ImageComboBox trên Form không có Properties riêng, vậy phải xử lý thế nào?
-------------------
Đố thêm:
Trên file cuối cùng của sư phụ, ta thấy rằng khi chọn vào ImageComboBox (trên Form) thì hình hiên ra không hết ---> Vậy phải chỉnh thế nào để có thể nhìn thấy toàn bộ hình?
 
Lần chỉnh sửa cuối:
Upvote 0
Mọi properties riêng hay chung đều có thể dùng VBA để set cả. Tra cứu properties bằng object browser là ra tuốt luốt.
Trên file cuối cùng của sư phụ, ta thấy rằng khi chọn vào ImageComboBox (trên Form) thì hình hiên ra không hết ---> Vậy phải chỉnh thế nào để có thể nhìn thấy toàn bộ hình?

Bờ i bi sắc bí!
 
Upvote 0
Câu 2: Sư phụ chỉnh font cho ImageComboBox = 150 thử xem!
Thương anhtuan nhất cái chỗ này: Ai bí cứ thừa nhận là bí, anhtuan sẽ dốc túi chỉ bảo tận tình. Ai biết thì thưa thốt, không biết chấp nhận dựa cột mà nghe, thì anhtuan nói cho nghe!
Spam 1 phát!
 
Lần chỉnh sửa cuối:
Upvote 0
Thương anhtuan nhất cái chỗ này: Ai bí cứ thừa nhận là bí, anhtuan sẽ dốc túi chỉ bảo tận tình. Ai biết thì thưa thốt, không biết chấp nhận dựa cột mà nghe, thì anhtuan nói cho nghe!
Spam 1 phát!
Học hỏi lẩn nhau mà sư phụ, vì có ai biết hết mọi vấn đề
Hi... Hi... Em cũng Spam theo 1 tí
-----------------------------------------
Em còn thắc mắc 1 vấn đề với ImageComboBox trên sheet (và nói chung tất cả các Control dạng này).. là dù ta có chỉnh kích thước cho nó = bao nhiêu thì khi lưu file rồi mở ra, nó vẫn trả về như củ! Là sao ta?
Thậm chí có đôi lúc còn không thể chỉnh kích thước cho nó to lên được
Sư phụ có ý kiến gì về vấn đề này không? (hỏng lẽ phải viết code trong sự kiện Workbook_Open để chỉnh sao?)
 
Lần chỉnh sửa cuối:
Upvote 0
Nạp list cho ComboBox không qua vòng lập

Nhân có bài viết này:
Liên kết các sheet thông qua combobox
Ở đó người ta nạp tên các sheet vào ComboBox thông qua 1 vòng lập (đương nhiên xưa nay vẫn vậy)
Xin mở thêm câu đố mới: Cũng với yêu cầu nạp tên các sheet vào 1 ComboBox, có cách nào không cần dùng đến vòng lập không?
(Nói chung là bất cứ cách gì miễn sao không phải là vòng lập. Cũng không dùng đến vùng phụ để tạo ListFillRange)
 
Upvote 0
Nhân có bài viết này:
Liên kết các sheet thông qua combobox
Ở đó người ta nạp tên các sheet vào ComboBox thông qua 1 vòng lập (đương nhiên xưa nay vẫn vậy)
Xin mở thêm câu đố mới: Cũng với yêu cầu nạp tên các sheet vào 1 ComboBox, có cách nào không cần dùng đến vòng lập không?
(Nói chung là bất cứ cách gì miễn sao không phải là vòng lập. Cũng không dùng đến vùng phụ để tạo ListFillRange)
Giả sử ComboBox có tên là cboSheets, viết sự kiện cho Sheet chứa ComboBox như sau, không rõ có đúng với yêu cầu của tác giả không.
Mã:
Private Sub Worksheet_Activate()
    ThisWorkbook.Names.Add "AllSheetName", "=MID(GET.WORKBOOK(1+0*NOW()),FIND(""]"",GET.WORKBOOK(1+0*NOW()))+1,LEN(GET.WORKBOOK(1+0*NOW())))"
    cboSheets.Clear
    Dim arr
    arr = Evaluate("TRANSPOSE(""INDEX(AllSheetName,1,""&ROW(A1:A" & Sheets.Count & ")&"")"")")
    cboSheets.List = Split(Evaluate(Join(arr, "&""?""&")), "?")
    ThisWorkbook.Names("AllSheetName").Delete
End Sub
 
Upvote 0
Công nhận hay thiệt, tôi chưa bao giờ dùng dạng như vầy.
Tks rollover79.

Lê Văn Duyệt
 
Upvote 0
Giả sử ComboBox có tên là cboSheets, viết sự kiện cho Sheet chứa ComboBox như sau, không rõ có đúng với yêu cầu của tác giả không.
Mã:
Private Sub Worksheet_Activate()
ThisWorkbook.Names.Add "AllSheetName", "=MID(GET.WORKBOOK(1+0*NOW()),FIND(""]"",GET.WORKBOOK(1+0*NOW()))+1,LEN(GET.WORKBOOK(1+0*NOW())))"
cboSheets.Clear
Dim arr
arr = Evaluate("TRANSPOSE(""INDEX(AllSheetName,1,""&ROW(A1:A" & Sheets.Count & ")&"")"")")
cboSheets.List = Split(Evaluate(Join(arr, "&""?""&")), "?")
ThisWorkbook.Names("AllSheetName").Delete
End Sub
Công nhận giống đến 9/10 ý kiến của tôi!
Ý tôi là vầy:
PHP:
Function GetSh()
  Dim Temp()
  ThisWorkbook.Names.Add String(240, "z"), "=SUBSTITUTE(GET.WORKBOOK(1),""[""&GET.WORKBOOK(16)&""]"","""")"
  Temp = Evaluate("Transpose(" & String(240, "z") & ")")
  Temp = WorksheetFunction.Transpose(Temp)
  ThisWorkbook.Names(String(240, "z")).Delete
  GetSh = Temp
End Function
PHP:
Private Sub ComboBox1_DropButtonClick()
  If ComboBox1.ListCount = 0 Then ComboBox1.List() = GetSh
End Sub
(Tôi nghĩ không cần đến NOW() làm gì, đàng nào ta cũng xóa name sau khi hoàn tất)
Cảm ơn rollover79 nhé, bạn luôn có những ý tưởng đáng để tôi học hỏi thêm
 

File đính kèm

  • GetSheetName.xls
    45 KB · Đọc: 44
Upvote 0
Tạo nhiều Buttons cùng 1 lúc

Có tình huống thế này:
- Tôi vẽ 1 Buttons nằm gọn trong cell A1 (Buttons này thuộc thanh Forms)
- Chọn cell A1 và bấm Ctrl + C
- Quét chọn A2:A10 và bấm Ctrl + V
Với 3 bước thao tác tôi đã tạo được 10 Buttons
Và cho dù có tạo ra 100 Buttons hay nhiều hơn nữa, tôi cũng chỉ cần 3 thao tác (như trên)
Vậy xin hỏi các bạn: Chúng ta viết code thực hiện quá trình trên như thế nào?
(Thử record macro xem, nhưng e rằng khi xem xong code record sẽ làm các bạn thất vọng)
-------------------------------------------------------------------------------
Nếu viết được code vẽ 10 Buttons trên 1 sheet thì tôi nghĩ việc này cũng có thể thực hiện trên nhiều sheet trong cùng 1 lúc đấy nhỉ? Hi... Hi...
 
Upvote 0
Web KT
Back
Top Bottom