Đố 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,906
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
 
Nói đùa hay nói chơi vậy trời?

Thử làm cho một lố UserForm hiện lên đi, sau đó click vào sub này:

Mã:
Sub StopAnyCode()
    End
End Sub

Giả ngô giả nghê kinh quá!

trời ơi , em đâu có biết lệnh End này đâu
bài này nếu mà ép phải làm cho được thì em xài cách là viết lệnh
1/0
để có bảng báo lỗi hiện ra , code nó ngưng lại , Form cũng tiêu luôn =)) chứ đâu biết lệnh End gì
 
Upvote 0
trời ơi , em đâu có biết lệnh End này đâu
bài này nếu mà ép phải làm cho được thì em xài cách là viết lệnh
1/0
để có bảng báo lỗi hiện ra , code nó ngưng lại , Form cũng tiêu luôn =)) chứ đâu biết lệnh End gì
Lệnh End là giải phóng bộ nhớ toàn bộ, code nào đang thực thi nó cũng hốt tuốt! Nó cũng tương đương với em này nè:

Mã:
Sub Test2()
     Application.VBE.CommandBars(1).Controls("&Run").Controls("&Reset").Execute
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
các đại gia cho em ké tí với
em google thấy có đoạn code này có thể show một form được nhiều lần, ko biết có đúng ko
Sao phải xóa hết thế? Bài này cũng hay mà! Cũng có nhiều ứng dụng xài được! Không dùng cho việc này nhưng có thể dùng cho việc khác.;;;;;;;;;;;
 
Upvote 0
Sao phải xóa hết thế? Bài này cũng hay mà! Cũng có nhiều ứng dụng xài được! Không dùng cho việc này nhưng có thể dùng cho việc khác.;;;;;;;;;;;

thêm code vào chạy nó bị đụng cái gì đó, đang xem lại.......hihihih
cái này tải lâu rùi.......hôm nay làm 5s thấy nó.........hihihiih
 
Upvote 0
End là lệnh chấm dứt chương trình.
Tôi lười set forms lên để thử nên tôi không chắc. Nhưng nếu dựa theo lý thuyết để nói thì dùng lệnh End để đóng tất cả các Forms không đúng.
Nếu Form có các sự kiện liên quan đến đóng thì lúc đóng Form, câc sự kiện này sẽ được chạy. Nếu End thì không chạy gì nữa cả.

Ý kiến của tôi là vậy thôi. Bạn nào rảnh thì thử xem rồi cho bà con cùng biết.
 
Upvote 0
End là lệnh chấm dứt chương trình.
Tôi lười set forms lên để thử nên tôi không chắc. Nhưng nếu dựa theo lý thuyết để nói thì dùng lệnh End để đóng tất cả các Forms không đúng.
Nếu Form có các sự kiện liên quan đến đóng thì lúc đóng Form, câc sự kiện này sẽ được chạy. Nếu End thì không chạy gì nữa cả.

Ý kiến của tôi là vậy thôi. Bạn nào rảnh thì thử xem rồi cho bà con cùng biết.

Ở bài này em đã nói rất rõ vấn đề này rồi:

Lệnh End là giải phóng bộ nhớ toàn bộ, code nào đang thực thi nó cũng hốt tuốt! Nó cũng tương đương với em này nè:

Mã:
Sub Test2()
     Application.VBE.CommandBars(1).Controls("&Run").Controls("&Reset").Execute
End Sub

Dĩ nhiên là khi ta làm việc, tùy theo phương thức mà ta sử dụng code thế nào để chúng ta định hướng cho code làm việc hiệu quả.

Như bài của Hai Lúa Miền Tây chẳng hạn, ta cũng thấy rằng nếu có một form khác đang thực thi thì sẽ unload luôn:

Không biết như sau được không:
Mã:
Sub Dong()
    Dim frm As [COLOR=#ff0000][B]UserForm[/B][/COLOR]
    For Each frm In UserForms
        Unload frm
    Next
End Sub

Vì thế, ta chỉ việc hiệu chỉnh một chút lại là OK:

Mã:
Sub Dong()
    Dim frm As [COLOR=#0000cd][B]Object [/B][/COLOR]
    For Each frm In UserForms
[COLOR=#0000cd]        If frm.Name = "UserForm1" Then[/COLOR]
            Unload frm
[COLOR=#0000cd]        End If[/COLOR]
    Next
End Sub
 
Upvote 0
Hiệu quả là định nghĩa có tính chất chủ quan.
Đối với nhiều người ở đây, hiệu quả có nghĩa là chạy nhanh. Đối với tôi, hiệu quả có nghĩa là tránh được phản ứng phụ.

Lệnh End là lệnh có phản ứng phụ. Một khi gọi nó là chấm dứt code, tất cả những code dùng để dọn dẹp đều mất hiệu quả.
Trước mắt tôi thì một lệnh có phản ứng phụ như vậy không thể được dùng để thay thế một vòng lặp unload forms.
 
Upvote 0
Hiệu quả là định nghĩa có tính chất chủ quan.
Đối với nhiều người ở đây, hiệu quả có nghĩa là chạy nhanh. Đối với tôi, hiệu quả có nghĩa là tránh được phản ứng phụ.

Lệnh End là lệnh có phản ứng phụ. Một khi gọi nó là chấm dứt code, tất cả những code dùng để dọn dẹp đều mất hiệu quả.
Trước mắt tôi thì một lệnh có phản ứng phụ như vậy không thể được dùng để thay thế một vòng lặp unload forms.
Vậy thì tùy à, nếu quá nguy hiểm vậy anh Bill sẽ không cho ra sản phẩm End này rồi!
 
Upvote 0
Nguy hiểm hay không là do sử dụng.
Đại khái cũng gần như lệnh GOTO. Khi sử dụng, người viết code cần phải biết mình làm gì. Tôi không hề muốn biện luận "không nên dùng END". Xin nhấn mạnh lại 1 lần nữa, tôi chỉ muốn nêu ra "việc dùng END để kết thúc gọn gàng là quan điểm riêng của bạn. Nhưng bảo End có thể thay một vòng lặp đóng Forms là qua phần quan điểm chuing, và nó không đúng. Bởi vì code sự kiện đóng form có thể còn làm 1 vài công việc khác"

Chú thích: VBA có lệnh END để làm gì? Hầu hết các trường hợp, END dùng để gỡ rối, khi mọi thứ rối rắm quá, không còn đường rút lui. Gọi END môt phát, chấm dứt.
Tôi cũng có 1 vài lần phải nhét cái này vào code rồi. Nhưng trong các code này, tôi có cẩn thận dùng một hàm đặc biệt để báo là code bị End giữa chừng. Khi gặp cảnh báo, tôi dò lại dữ liệu xem sức mẻ ra sao. Nói chung, mõi lần gặp cái này mất cả buổi.
Lưu ý chú thích này là quan điểm riêng của tôi. Tôi làm việc trên môi trường dữ liệu là cơm ăn áo mặc cho nên tôi không đùa với chúng.
 
Upvote 0
Chắc có lẽ mình "điếc nên không sợ súng", nên End cũng xài, Goto cũng xài, Quit cũng xài tuốt và càng xài thấy càng tự tin. Bởi mình biết chắc rằng khi nào thì xài đến chúng, khi nào không.+-+-+-++-+-+-+
 
Upvote 0
VBA ko phải là managed code, dữ liệu bạn tạo ra, bạn phải tự xóa lấy, nếu ko xóa mà kết thúc chương trình đột ngột ( dùng lệnh End ) sẽ gây dò dỉ bộ nhớ ( leak memory ). :)
 
Upvote 0
Chắc có lẽ mình "điếc nên không sợ súng", nên End cũng xài, Goto cũng xài, Quit cũng xài tuốt và càng xài thấy càng tự tin. Bởi mình biết chắc rằng khi nào thì xài đến chúng, khi nào không.

Biết chắc thỉ cứ việc xài thôi!

E rằng hôm nay thấy "chắc", vài bữa nữa có thể thấy khác, kha kha,. . . . . với những chương trình đồ sộ hơn chẳng hạn!
 
Upvote 0
Tìm ra sự khác biệt giữa sự kiện Click và Change của ListBox!

thêm các câu hỏi hay đi các bác
Không biết câu hỏi này có "hay" hay là không, nhưng lâu quá không thấy đề tài nào khác nên đố chơi.

Với các dòng code trong UserForm:

Mã:
Option Explicit


Private Sub UserForm_Initialize()
    Dim i As Byte
    For i = 1 To 10
        ListBox1.AddItem i
    Next
End Sub


Private Sub ListBox1_Change()
    MsgBox "CHANGE"
End Sub


Private Sub ListBox1_Click()
    MsgBox "CLICK"
End Sub

Khi tôi dùng chuột hay dùng phím mũi tên lên xuống, chúng đều xảy ra 2 sự kiện như trên, tức cả 2 đều cho thông báo bằng MsgBox.

Vậy điều gì hoặc khi nào chúng mới khác đi? Chỉ xảy ra đúng một sự kiện?
 

File đính kèm

  • Change_Click.xlsm
    12.3 KB · Đọc: 11
Upvote 0
đặt gạch để đó cái đã . Đang xem Euro hay , mai suy nghĩ sau . ha ha --=0--=0--=0
 
Upvote 0
Không biết câu hỏi này có "hay" hay là không, nhưng lâu quá không thấy đề tài nào khác nên đố chơi.

Với các dòng code trong UserForm:

Mã:
Option Explicit


Private Sub UserForm_Initialize()
    Dim i As Byte
    For i = 1 To 10
        ListBox1.AddItem i
    Next
End Sub


Private Sub ListBox1_Change()
    MsgBox "CHANGE"
End Sub


Private Sub ListBox1_Click()
    MsgBox "CLICK"
End Sub

Khi tôi dùng chuột hay dùng phím mũi tên lên xuống, chúng đều xảy ra 2 sự kiện như trên, tức cả 2 đều cho thông báo bằng MsgBox.

Vậy điều gì hoặc khi nào chúng mới khác đi? Chỉ xảy ra đúng một sự kiện?
Em nghĩ sẽ xảy ra đúng một sự kiện có lẻ mấu chốt ngay chổ Multiselect của ListBox
 
Upvote 0
Em nghĩ sẽ xảy ra đúng một sự kiện có lẻ mấu chốt ngay chổ Multiselect của ListBox
OK, đây là một đáp án, khi chọn chế độ này nó sẽ không xảy ra sự kiện click.

Thử tìm tiếp xem nó còn cái nào nữa không ta?
 
Upvote 0
Web KT
Back
Top Bottom