Đố 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
 
Cách của em là vào Properties --> Font -->Script Vietnamese mà sao chỉ đúng với unicode tổ hợp còn unicode dựng sẵn bị lỗi (test ở máy em)
Anh cài Script Vietnamese, sau đó mã hóa font cho chúng thành font CP 1258 bằng sự kiện Lost_Focus mà chúng mã hóa thành chữ quái quỷ gì đâu không à! Nhưng trong khi mình thử nhập nguồn bằng font VNI và định dạng font của nó cũng là font VNI thì nó lại hiển thị tiếng Việt mới ghê! Trong khi cái thuộc tính Text và Value của nó cũng là những chữ "quái quỷ"! Lạ thật, phải chi UNI lại xài được như VNI nhỉ!
 
Upvote 0
Với ComboBox trên Sheet (hay ActiveX controls nói chung) thì việc hiển thị tiếng Việt Unicode thật sự có vấn đề:
- Khi ta bấm mũi tên xổ xuống của ComboBox, ta nhìn thấy tiếng Việt Unicode hiển thị rất tốt:

- Nhưng ngay khi chọn xong 1 Item rồi click chuột vào đâu đó trên bảng tính thì lập tức những ký tự có dấu bị biến thành dấu ?

Xin hỏi các bạn: Dùng cách gì để khắc phục tình trạng này? Tức có thể hiển thị tiếng Việt Unicode trên ComboBox trong mọi lúc
Câu hỏi này tuy là đố vui nhưng ứng dụng thiết thực đây

Thầy iu, em chơi tiểu xảo được không?

Trong Module của Sheet1:
Mã:
Option Explicit

Private Sub ComboBox1_GotFocus()
    Sheet1.Shapes("Rectangle 1").Visible = msoFalse
End Sub

Private Sub ComboBox1_LostFocus()
    With Sheet1.Shapes("Rectangle 1")
        .TextFrame.Characters.Text = ComboBox1
        .Visible = msoTrue
    End With
End Sub

[COLOR=#008000]'Gan macro nay cho Shape:[/COLOR]
Sub HideShape()
    Sheet1.Shapes(Application.Caller).Visible = msoFalse
    Sheet1.ComboBox1.Activate
End Sub
 

File đính kèm

  • ComboBoxUni.xls
    36.1 KB · Đọc: 20
Lần chỉnh sửa cuối:
Upvote 0
Thầy iu, em chơi tiểu xảo được không?

Trong Module của Sheet1:
Mã:
Option Explicit

Private Sub ComboBox1_GotFocus()
    Sheet1.Shapes("Rectangle 1").Visible = msoFalse
End Sub

Private Sub ComboBox1_LostFocus()
    With Sheet1.Shapes("Rectangle 1")
        .TextFrame.Characters.Text = ComboBox1
        .Visible = msoTrue
    End With
End Sub

[COLOR=#008000]'Gan macro nay cho Shape:[/COLOR]
Sub HideShape()
    Sheet1.Shapes(Application.Caller).Visible = msoFalse
    Sheet1.ComboBox1.Activate
End Sub
Cách này thì đúng là... Ẹc... Ẹc...
Thôi, gợi ý luôn. Thật ra nó khá đơn giản: Hãy cho ComboBox vào trong 1 Frame. Xong!
 
Upvote 0
Cách này thì đúng là... Ẹc... Ẹc...
Thôi, gợi ý luôn. Thật ra nó khá đơn giản: Hãy cho ComboBox vào trong 1 Frame. Xong!
Hay! Tuyệt vời, mặc dù Thầy gợi ý, nhưng khá vất vã để được nó trong Frame đấy! Đúng là Thầy mình quái kiệt mà!
 
Upvote 0
Upvote 0
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Nếu là Thầy thì Thầy có dùng Class không?
Hỏi hay ghê hen!
"Nếu là thầy" thì thầy sẽ... hổng nói, cứ để cho "trò" tự nghiên cứu
Mà dùng gì chẳng được, miễn đạt được mục đích
Ẹc... Ẹc...
--------------------
cái anh nói ko biết có kèm theo cái này ko???
[video=facebook;555533051186290]https://www.facebook.com/photo.php?v=555533051186290&saved[/video]
CÁI NÀY là CÁI GÌ vậy?
 
Upvote 0
Hỏi hay ghê hen!
"Nếu là thầy" thì thầy sẽ... hổng nói, cứ để cho "trò" tự nghiên cứu
Mà dùng gì chẳng được, miễn đạt được mục đích
Ẹc... Ẹc...
--------------------

Tại Module của Sheet1:

Những dòng trên cùng:

[GPECODE=vb]
Option Explicit
Public WithEvents Frame1_ComboBox1 As MSForms.ComboBox
[/GPECODE]

Tạo sự kiện Active & DeActive cho Sheet1:

[GPECODE=vb]
Private Sub Worksheet_Activate()
Set Frame1_ComboBox1 = Sheet1.Frame1.Controls("ComboBox1")
End Sub
[/GPECODE]

[GPECODE=vb]
Private Sub Worksheet_Deactivate()
Set Frame1_ComboBox1 = Nothing
End Sub
[/GPECODE]

Và sự kiện Change của Combobox1:

[GPECODE=vb]
Private Sub Frame1_ComboBox1_Change()
MsgBox Frame1_ComboBox1.Text
End Sub
[/GPECODE]

OK chưa Thầy iu!
 
Upvote 0

Giải thuật thì được rồi nhưng nghĩ xem cách khởi tạo sự kiện đã ổn chưa? File của tôi chỉ có 1 sheet thôi thì sao?
 
Upvote 0
cái anh nói ko biết có kèm theo cái này ko???
[video=facebook;555533051186290]https://www.facebook.com/photo.php?v=555533051186290&saved[/video]
Đối tượng Combobox của bạn trong video này là đối tượng ở trên Userform, nhưng nó là một ActiveX Control, đặt trên Form thì không vấn đề gì rồi, nhưng bạn thử chèn nó lên Sheet xem nào. Lưu ý khi chèn trên Sheet có 2 loại đối tượng ComboBox đấy nhé, 1 cái thuộc Form Controls, 1 cái thuộc ActiveX Controls. Trong video trước của bạn tại bài #897 là ComboBox của Form Controls, mà với cái này thì cứ để thiết lập mặc định của Windows cũng hiển thị được tiếng Việt Unicode.
 
Upvote 0

File đính kèm

  • Combo.Uni.xlsm
    20.9 KB · Đọc: 24
Upvote 0
Giải thuật thì được rồi nhưng nghĩ xem cách khởi tạo sự kiện đã ổn chưa? File của tôi chỉ có 1 sheet thôi thì sao?

ThisWorkbook Module:

[GPECODE=vb]
Option Explicit


Private Sub Workbook_Open()
Sheet1.CreateFrameControlEvent
End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheet1.EraseFrameControlEvent
End Sub


[/GPECODE]

Sheet Module:

[GPECODE=vb]
Option Explicit
Public WithEvents Frame1_ComboBox1 As MSForms.ComboBox
Public WithEvents Frame1_CommandButton1 As MSForms.CommandButton


Sub CreateFrameControlEvent()
Set Frame1_ComboBox1 = Sheet1.Frame1.Controls("ComboBox1")
End Sub


Sub EraseFrameControlEvent()
Set Frame1_ComboBox1 = Nothing
End Sub


Private Sub Frame1_ComboBox1_Change()
MsgBox Frame1_ComboBox1.Text
End Sub
[/GPECODE]

Dễ ùm đó Thầy iu! Cái quan trọng là ta đã biết nó là gì, giải thuật là như thế nào, còn sắp xếp sao cho hợp lý với file của mình thì rất ẹc ... ẹc ...
 
Upvote 0
Là cái quỷ này:
https://www.facebook.com/photo.php?v=555533051186290&saved

Nhưng đó là form. Ndu đang nói trên sheet.
May quá! Máy em hổng vào được Facebook và em cũng không có ý định tìm cách để vào
Ẹc... Ẹc...


Có ý tưởng rồi thì không khó nữa.
Cái của sư phụ là CHƠI ĂN GIAN nha! Đó không phải là cách giải quyết vấn đề triệt để!
Nếu như cho ComboBox vào 1 Frame thì lại khác à nha: Nó hiện tiếng Việt Unicode trong mọi trường hợp luôn
 
Upvote 0
Cái của sư phụ là CHƠI ĂN GIAN nha! Đó không phải là cách giải quyết vấn đề triệt để!
Nếu như cho ComboBox vào 1 Frame thì lại khác à nha: Nó hiện tiếng Việt Unicode trong mọi trường hợp luôn

Vậy chớ frame là kí rì?
Với lại xài như vậy thì thiếu trường hợp nào?
 
Upvote 0
Dễ ùm đó Thầy iu! Cái quan trọng là ta đã biết nó là gì, giải thuật là như thế nào, còn sắp xếp sao cho hợp lý với file của mình thì rất ẹc ... ẹc ...

Ừ thì dễ! Nhưng code dài quá. Tôi làm bài này đúng 10 dòng code và chỉ gọn trong sheet1
Như thế này:
Mã:
Public WithEvents cbox As MSForms.ComboBox
Private Sub cbox_Click()
  Sheet1.Frame1.Controls("TextBox1").Text = cbox.Text
End Sub
Private Sub Frame1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  If TypeName(cbox) = "Nothing" Then
    Set cbox = Sheet1.Frame1.Controls("ComboBox1")
    cbox.List() = Sheet1.Range("A1:A10").Value
  End If
End Sub
Với Range("A1:A10") là dữ liệu và Frame có chứa TextBox1
Mục đích của Frame1_MouseMove là để phòng ngừa code bị lỗi sẽ dùng nó khởi tạo lại sự kiện
-----------------------
Với lại xài như vậy thì thiếu trường hợp nào?
Sư phụ đừng ẩn ComboBox thì sẽ thấy text trong đó bị mã hóa thành dấu ? hết
 

File đính kèm

  • UnicodeText_On_ComboBox.xlsm
    20.6 KB · Đọc: 43
Lần chỉnh sửa cuối:
Upvote 0
xin lổi các thầy, người ngoài tham gia được ko ạh,

nếu làm trên sheet, thì đây cách tui hay trốn combobox, bằng cách xuất thẳng ra sheet luôn
 

File đính kèm

  • Combo.Uni.rar
    18 KB · Đọc: 14
Upvote 0
xin lổi các thầy, người ngoài tham gia được ko ạh,

nếu làm trên sheet, thì đây cách tui hay trốn combobox, bằng cách xuất thẳng ra sheet luôn

Mình đâu có hỏi cái chuyện xuất ra sheet đâu! Đương nhiên khi xuất ra sheet thì dữ liệu được bảo toàn rồi (tiếng Việt vẫn là tiếng Việt)
Vấn đề ở đây là khi click chuột vào 1 cell, nhìn lại text trên ComboBox cảm thấy rất... ghét ---> Bạn tự nhìn vào cái ComboBox của mình đi
 
Upvote 0
Ừ thì dễ! Nhưng code dài quá. Tôi làm bài này đúng 10 dòng code và chỉ gọn trong sheet1

Mục đích của Frame1_MouseMove là để phòng ngừa code bị lỗi sẽ dùng nó khởi tạo lại sự kiện
-----------------------

Lúc đầu em cũng tính làm vậy, nhưng em lại định kích cỡ cho Frame bằng với Combobox cho không ai nhận ra có sự tồn tại của nó; nhưng làm vậy thì không chạy được sự kiện MouseMove của Frame!

Theo em nghĩ nha, em có cảm giác là một khi sử dụng sự kiện MouseMove thì y như rằng nó đang xài Do ... DoEvents ... Loop và như thế nó cứ chạy code liên tục vậy ạ!
 
Upvote 0
Lúc đầu em cũng tính làm vậy, nhưng em lại định kích cỡ cho Frame bằng với Combobox cho không ai nhận ra có sự tồn tại của nó; nhưng làm vậy thì không chạy được sự kiện MouseMove của Frame!
Thì cũng đúng! Vậy tùy trường hợp mà chọn lựa thôi


Theo em nghĩ nha, em có cảm giác là một khi sử dụng sự kiện MouseMove thì y như rằng nó đang xài Do ... DoEvents ... Loop và như thế nó cứ chạy code liên tục vậy ạ!
Chính vì sợ nó chạy liên tục nên tôi có đoạn If TypeName(cbox) = "Nothing" Then rồi đó. Bảo đảm chỉ chạy 1 lần
(không tin có thể dùng MsgBox đặt trong If để thử)
Vậy: Khi nào code gì đó bị lỗi thì cbox sẽ = Nothing và sự kiện MouseMove sẽ tự khởi tạo lại nó
------------------
Mà công nhận chú Nghĩa này tiếp cận vấn đề nhanh ghê! Gợi ý 1 chút đã làm trúng phốc!
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom