Cách sử dụng MsgBox để kiểm tra các dòng lệnh trong VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

a.nguoidensau

Thành viên hoạt động
Tham gia
12/4/12
Bài viết
138
Được thích
28
Xin chào các thành viên của diễn đàn GPE.

Tôi đang tìm hiểu về VBA, nên có rất nhiều điều muốn được học hỏi từ các thành viên.
Chẳng hạn như việc sử dụng MsgBox để kiểm tra các dòng lệnh trong lập trình VBA.
Ai đó có thể giúp tôi hiểu được phần nào về vấn đề này.
Tôi xin cảm ơn trước.
 
Xin chào các thành viên của diễn đàn GPE.

Tôi đang tìm hiểu về VBA, nên có rất nhiều điều muốn được học hỏi từ các thành viên.
Chẳng hạn như việc sử dụng MsgBox để kiểm tra các dòng lệnh trong lập trình VBA.
Ai đó có thể giúp tôi hiểu được phần nào về vấn đề này.
Tôi xin cảm ơn trước.
Yêu cầu chung chung quá. Bạn lấy 1 ví dụ cụ thể rồi quăng file lên đây mới có thể giúp bạn được chứ.
 
Upvote 0
...
Chẳng hạn như việc sử dụng MsgBox để kiểm tra các dòng lệnh trong lập trình VBA.
...

Muốn hỏi về lý thuyết hay thực hành?
Thực hành: ở đây có vài trường phái viết code. Muốn tìm hiểu theo trường phải viết code nhanh hay theo trường phái code nhiều ứng dụng? theo kiểu chạy nhanh hay kiểu dễ kiểm soát?
 
Upvote 0
Muốn hỏi về lý thuyết hay thực hành?
Thực hành: ở đây có vài trường phái viết code. Muốn tìm hiểu theo trường phải viết code nhanh hay theo trường phái code nhiều ứng dụng? theo kiểu chạy nhanh hay kiểu dễ kiểm soát?

Cảm ơn bác VetMini.
Nếu bác rảnh, bác vui lòng chỉ giúp em vài "đường" về thực hành để em hiểu.
 
Upvote 0
CÁI MsgBox lợi hại lắm đó....ngày trước mình mới vọc code có một người Bạn nói với mình là mình giỏi code lên là nhờ một phần cái Msgbox....mình thoáng nghĩ trong đầu cái đó có gì đâu mà quan trọng vậy...Sau này mình bắt đầu biết viết code thì dùng nó để test code thấy đúng như lời Bạn Mình nói ... cảm ơn rất nhiều
 
Upvote 0
CÁI MsgBox lợi hại lắm đó....ngày trước mình mới vọc code có một người Bạn nói với mình là mình giỏi code lên là nhờ một phần cái Msgbox....mình thoáng nghĩ trong đầu cái đó có gì đâu mà quan trọng vậy...Sau này mình bắt đầu biết viết code thì dùng nó để test code thấy đúng như lời Bạn Mình nói ... cảm ơn rất nhiều
Vậy là kieumanh hiểu đúng ý tôi rồi đấy.
Xin vui lòng chỉ giúp tôi 1 ví dụ nho nhỏ để tôi thấy cái hay của nó.
Cảm ơn kieumanh.
 
Upvote 0
Bạn đến bài 14 tại đây: http://www.giaiphapexcel.com/forum/...m-vba-tự-động-tô-màu-dử-liệu-trùng-nhau/page2
& chạy code này trên file đó & tự rút ra kết luận:
PHP:
Option Explicit
Sub ToMàuTrùng()
 Dim Rng As Range, Cls As Range, sRng As Range, Rg0 As Range
 Dim J As Byte, Tmr As Double, MyColor As Byte, Col As Byte, Max_ As Integer
 Dim MyAdd As String
  
 Tmr = Timer():                             Randomize
 Col = 1:                                   MyColor = 30 + 9 * Rnd() \ 1
 Set Rng = Range([b1], [b2].End(xlDown))
 Rng.Resize(, 24).Interior.ColorIndex = 2
 For Each Cls In Range([AA2], [AA2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            If Rg0 Is Nothing Then
                Set Rg0 = sRng.Resize(, Col)
            Else
                Set Rg0 = Union(Rg0, sRng.Resize(, Col))
            End If
            J = J + 1
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    If Not Rg0 Is Nothing Then
        If J > 1 Then
            MyColor = MyColor + 1
            If MyColor > 55 Then
               MyColor = 30:                Col = Col + 1
            End If
            If Max_ < J Then
                Max_ = J
                MsgBox Max_, , Cls.Row       '<=|'
            End If
            Rg0.Interior.ColorIndex = MyColor
        Else
        End If
        Set Rg0 = Nothing:                  J = 0
    End If
 Next Cls
 [Ab1].Value = Timer() - Tmr
End Sub
 
Upvote 0
Nếu chỉ dùng để test bằng cách hiển thị trị của biến thì chỉ cần biết lệnh:
MsgBox tenBien
Muốn test chỗ nào thì nhét vào chỗ đó.

Nếu muốn dùng nó để debug code thì cần phải học thêm một chút. Chả nhẽ bỏ nó trong 1 cái vòng lặp chạy 1000 lần thì phải nhấn Enter 1000 lần?
Các phần cần biết thêm:
Các tham số. Ít nhất là tham số thứ 2 và 3 của nó
- Tham số thứ 2 dùng để điều khiển khả năng trị trả về của nó. Ví dụ như truonwgf hợp kể trên, sau khi vòng lặp chạy 1, 2 vòng, cảm thấy ổn - rồi thì nhấn nút khác, để code chạy hết 998 lượt vòng lặp còn lại.
Tham số thứ 3 dùng để cho biết ngữ cảnh hiện tại.
 
Upvote 0
Vậy là kieumanh hiểu đúng ý tôi rồi đấy.
Xin vui lòng chỉ giúp tôi 1 ví dụ nho nhỏ để tôi thấy cái hay của nó.
Cảm ơn kieumanh.
Ngâm cứu bài #7 đi..
Thử chép cái đơn giản này vào chạy xem
PHP:
Sub DemSheet()
    Dim Sh Worksheet
    For Each Sh In Worksheets
        MsgBox Sh.Name
    Next
End Sub
Thêm cái nữa đơn giản nè
PHP:
Sub SheetCodeName_SheetName()
Dim Sh As Worksheet
For Each Sh In Worksheets
    MsgBox "Day La Sheet Name :" & Space(1) & Sh.Name, 64, "Thông Báo"
    MsgBox "Day La Sheet CodeName :" & Space(1) & Sh.CodeName, 64, "Thông Báo"
Next Sh
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu chỉ dùng để test bằng cách hiển thị trị của biến thì chỉ cần biết lệnh:
MsgBox tenBien
Muốn test chỗ nào thì nhét vào chỗ đó.

Nếu muốn dùng nó để debug code thì cần phải học thêm một chút. Chả nhẽ bỏ nó trong 1 cái vòng lặp chạy 1000 lần thì phải nhấn Enter 1000 lần?
Các phần cần biết thêm:
Các tham số. Ít nhất là tham số thứ 2 và 3 của nó
- Tham số thứ 2 dùng để điều khiển khả năng trị trả về của nó. Ví dụ như truonwgf hợp kể trên, sau khi vòng lặp chạy 1, 2 vòng, cảm thấy ổn - rồi thì nhấn nút khác, để code chạy hết 998 lượt vòng lặp còn lại.
Tham số thứ 3 dùng để cho biết ngữ cảnh hiện tại.
Cảm ơn bác VetMini.
Những gì bác nói là cái mà em đang cần tìm hiểu.
Khi nào bác rảnh chỉ giúp em thêm về vấn đề này nhé.
Em cảm ơn bác.
 
Upvote 0
Tiêu đề của bạn có câu "để kiểm tra các dòng lệnh"
Bạn cần tự hỏi mình "kiểm tra các dòng lệnh" nghĩa là gì trước đã.

Test có ít nhất là 2 giai đoạn. Giai đoạn test đơn vị (unit test) và giai đoạn test hoà nhập (regression/integration test)
Ở giai đoạn 1, bạn test xem đạon code có thực hiện đúng nhiệm vụ mình đặt ra cho nó hay không.
Ở giai đoạn 2, bạn test xem cái nhiệm vụ bạn đặt ra đó có phù hợp với môi trường sửb dụng không (ví dụ cái sub/function mẹ, gọi sub/function này)
 
Upvote 0
Ngâm cứu bài #7 đi..
Thử chép cái đơn giản này vào chạy xem
PHP:
Sub DemSheet()
    Dim Sh Worksheet
    For Each Sh In Worksheets
        MsgBox Sh.Name
    Next
End Sub
Thêm cái nữa đơn giản nè
PHP:
Sub SheetCodeName_SheetName()
Dim Sh As Worksheet
For Each Sh In Worksheets
    MsgBox "Day La Sheet Name :" & Space(1) & Sh.Name, 64, "Thông Báo"
    MsgBox "Day La Sheet CodeName :" & Space(1) & Sh.CodeName, 64, "Thông Báo"
Next Sh
End Sub

Tôi thấy 2 Code bạn đưa ra có ăn nhập gì với lời bạn nói ở bài # 5 đâu?
Hơn nữa về MsgBox dùng để thông báo dạng này thì tôi cũng có biết.
Cảm ơn kieumanh
 
Upvote 0
Tôi thấy 2 Code bạn đưa ra có ăn nhập gì với lời bạn nói ở bài # 5 đâu?
Hơn nữa về MsgBox dùng để thông báo dạng này thì tôi cũng có biết.
Cảm ơn kieumanh
Thường mình thấy người ta thường sử dụng Msgbox để kiểm tra các biến của code ....còn cao hơn nữa mình không biết VD Dim i ...thì Msgbox i xem nó như thế nào thôi ....vậy thế nào là ăn nhậu và thế nào là không ăn nhậu Bạn...
Còn thuật ngữ cao siêu như thế nào mình ko biết
 
Upvote 0
Bạn đến bài 14 tại đây: http://www.giaiphapexcel.com/forum/...m-vba-tự-động-tô-màu-dử-liệu-trùng-nhau/page2
& chạy code này trên file đó & tự rút ra kết luận:
PHP:
Option Explicit
Sub ToMàuTrùng()
 Dim Rng As Range, Cls As Range, sRng As Range, Rg0 As Range
 Dim J As Byte, Tmr As Double, MyColor As Byte, Col As Byte, Max_ As Integer
 Dim MyAdd As String
  
 Tmr = Timer():                             Randomize
 Col = 1:                                   MyColor = 30 + 9 * Rnd() \ 1
 Set Rng = Range([b1], [b2].End(xlDown))
 Rng.Resize(, 24).Interior.ColorIndex = 2
 For Each Cls In Range([AA2], [AA2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            If Rg0 Is Nothing Then
                Set Rg0 = sRng.Resize(, Col)
            Else
                Set Rg0 = Union(Rg0, sRng.Resize(, Col))
            End If
            J = J + 1
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    If Not Rg0 Is Nothing Then
        If J > 1 Then
            MyColor = MyColor + 1
            If MyColor > 55 Then
               MyColor = 30:                Col = Col + 1
            End If
            If Max_ < J Then
                Max_ = J
                MsgBox Max_, , Cls.Row       '<=|'
            End If
            Rg0.Interior.ColorIndex = MyColor
        Else
        End If
        Set Rg0 = Nothing:                  J = 0
    End If
 Next Cls
 [Ab1].Value = Timer() - Tmr
End Sub
theo em biết thì code trên là tô màu với thao tác bằng mảng
nhưng sao trên máy em chạy chậm thế nhỉ. file ban đầu chạy là 3s. lên máy em chạy thì toàn trên 5s-7s (có phải cái kết luận đó là thời gian chạy code không anh)
 
Upvote 0
Hí hí.... Tôi cũng code tí tí mà có bao giờ dùng cái Ctr+G này đâu. Cứ MsgBox mà phan....thôi!!! Cách đơn giản và hiệu quả nhất quả đất...--=0--=0--=0
cứ vậy mà phang tới dễ sử dụng còn Ctr+G thì tùy tùng cái thôi

Còn Msgbox có cái gì cao siêu nữa đâu..........!!!!!!!!!!!!!!??????????????

Nếu có cái gì đó cao siêu hơn xin các thành viên chỉ dùm

dòng màu đỏ chữ to quá hay

Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Mỗi khi Msgbox thì phải nhấn ok, nếu làm biến thì có thể sử dụng cửa sổ Immediate để test
câu lệnh Debug.Print
cái này test để ghi lại quá trình code chạy ra kết quả bao nhiều rồi mới nhìn tổng thể được.
ví dụ
Debug.Print " Immediate"
 
Upvote 0
theo em biết thì code trên là tô màu với thao tác bằng mảng
nhưng sao trên máy em chạy chậm thế nhỉ. file ban đầu chạy là 3s. lên máy em chạy thì toàn trên 5s-7s (có phải cái kết luận đó là thời gian chạy code không anh)

Thứ nhất, code trên không thao tác trên mảng (Array)
Nó áp dụng fương thức FIND() để tìm tất cả những dữ liệu giống so với iêu cầu tìm;

Mỗi máy 1 tính năng khác nhau; Máy cà tàng chạy 3''; Máy bạn chạy tới 6'' thì nên làm fụ trội, ngõ hầu có tiền nâng cấp máy. (Nếu không đặng thì lâu nên dọn dẹp máy của mình!). Tốc độ còn fụ thuộc vô sự nhanh chậm khi bạn bâm nút 'OK' nữa!

Cái Msgbox đó giúp ta biết được có bao nhiêu mã có trùng 3 chữ cái đầu cao nhất.
 
Upvote 0
Thứ nhất, code trên không thao tác trên mảng (Array)
Nó áp dụng fương thức FIND() để tìm tất cả những dữ liệu giống so với iêu cầu tìm;

Mỗi máy 1 tính năng khác nhau; Máy cà tàng chạy 3''; Máy bạn chạy tới 6'' thì nên làm fụ trội, ngõ hầu có tiền nâng cấp máy. (Nếu không đặng thì lâu nên dọn dẹp máy của mình!). Tốc độ còn fụ thuộc vô sự nhanh chậm khi bạn bâm nút 'OK' nữa!

Cái Msgbox đó giúp ta biết được có bao nhiêu mã có trùng 3 chữ cái đầu cao nhất.
ak. em không xem kỹ
mới xem sơ thấy cái này
MyAdd = sRng.Address
nghĩ là mảng mà không xem khai báo biến ^^
thảo nào thấy là lạ sao thao tác trên mảng mà cũng tô màu được mà chạy chậm như vậy
mà em có thấy code có Msgbox nào đâu @@
ram thì đợi hết bảo hành rồi quất thanh 8Gb xem sao. 4Gb mà nó cứ quất 60-70% (máy cùi hỗ trợ mỗi 1 thanh ram-0-/.)
ý là quét bằng Advanced SystemCare 8
 
Lần chỉnh sửa cuối:
Upvote 0
cứ vậy mà phang tới dễ sử dụng còn Ctr+G thì tùy tùng cái thôi

Còn Msgbox có cái gì cao siêu nữa đâu..........!!!!!!!!!!!!!!??????????????

Nếu có cái gì đó cao siêu hơn xin các thành viên chỉ dùm

...

"cao siêu" thì không dám nhận. Ở đây là nơi học tập, tôi chỉ đưa ra các quan điểm khác cho các bạn mới học tham khảo.

Một trong những trường hợp điển hình, MsgBox có thể được dùng để xét qua thông số trước khi quyết định tiếp tục chạy code hay ngưng không chạy nữa. Trường hợp này, nó không hẳn là để kiểm chứng code, mà phải gọi là kiểm chứng môi trường thì đúng hơn.

Code sau đây là ví dụ:
Mã:
Sub t()
For i = 1 To 10
If MsgBox("chon ok de tiep tuc, hoac cancel de thoat", vbOKCancel, "luot thu " & i) = vbCancel Then Exit For
Next
MsgBox "ngung o luot thu " & i, , "tong ket"
End Sub

Ví dụ khác: nếu tôi dùng ADO để lấy dữ liệu từ một file nào đó. Trước khi kết nối, tôi cho msgbox hiển thị tên và đường dẫn file, và chọn Ok (tiếp tục) hoặc Cancel (nếu file không đúng).

Hí hí.... Tôi cũng code tí tí mà có bao giờ dùng cái Ctr+G này đâu. Cứ MsgBox mà phan....thôi!!! Cách đơn giản và hiệu quả nhất quả đất...--=0--=0--=0

1. Cửa sổ Immediate dùng để xem trị trong mảng rất hiệu nghiệm. Chả nhẽ mảng 20 dòng, bạn nhấn Enter 20 lần à?

2. Nếu tôi có một code gọi cỡ chừng chục modules, gọi hết sub này đến sub khác, chạy cỡ chừng 30 phút. Để theo dõi quá trình chạy code, tôi dùng lệnh Debug.Print time, modulename (hay subname) thì tiện dụng hơn msgbox nhiều.

Mỗi khi Msgbox thì phải nhấn ok, nếu làm biến thì có thể sử dụng cửa sổ Immediate để test
câu lệnh Debug.Print
cái này test để ghi lại quá trình code chạy ra kết quả bao nhiều rồi mới nhìn tổng thể được.
ví dụ
Debug.Print " Immediate"

Cửa sổ Immediate cũng có giới hạn của nó. Hệ thống của tôi chỉ cho in ra 100 dòng. Nếu tôi in ra 150 dòng thì thực sự kết quả là dòng 51-150
 
Upvote 0
Xin chào các thành viên của diễn đàn GPE.

Tôi đang tìm hiểu về VBA, nên có rất nhiều điều muốn được học hỏi từ các thành viên.
Chẳng hạn như việc sử dụng MsgBox để kiểm tra các dòng lệnh trong lập trình VBA.
Ai đó có thể giúp tôi hiểu được phần nào về vấn đề này.
Tôi xin cảm ơn trước.

Để học lập trình, kiểm tra giá trị các biến, tìm lỗi trong quá trình chạy code ít ai lại dùng MsgBox để hiển thị cả. Bạn cần học cách kỹ thuật DEBUG. Ai đó nói nhờ MsgBox mà đã giỏi VBA thì nếu biết Debug thì sẽ là quá giỏi luôn %#^#$. MsgBox dùng chuyên để tương tác của End User - Người dùng cuối để nhận thông báo hoặc quyết định cách thức chạy lệnh (như các nút bấm Yes/No).

Kỹ thuật Debug. Cách đây 7 năm tồi đã quay video kỹ thuật debug trong Excel và VB6 tại bài viết dưới đây bạn có thể học.
http://www.giaiphapexcel.com/forum/...p-trình-VB6-DLL-cho-Excel-Debugging-cho-Excel

Tổng thể phương pháp debug là:
1. In ra màn hình Immediate
+ Mở cửa sổ Immediate - CTRL+G
+ Dùng đối tượng Debug để hiển thị giá trị của biến hoặc biểu thức:
Debug.Print TenBienHoacBieuThuc
2. BreakPoint - Tạm ngưng dòng lệnh để kiểm tra
+ Đặt điểm ngưng, để con trỏ tại dòng muốn ngưng, nhấn F9 hoặc vào menu Insert->Toggle BreakPoint
+ Mở cửa sổ Local Windows (Menu View->Local Windows). Cửa sổ này cho phép bạn xem tổng thể các biến và đối tượng đang hoạt động, có thể xem giá trị của nó hoặc các Property của đối tượng.
+ Nếu cần dùng cửa sổ Immadiate (CTRL+G) để kiểm tra giá trị bằng cách:
?TenBienHoacBieuThuc
Với lệnh trên bạn sẽ nhận được giá trị của biến hoặc biểu thức ra cửa sổ Immediate.
 
Upvote 0
Web KT

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

Back
Top Bottom