Hỏi về lỗi Runtime error 438 khi chạy mã VBA

Liên hệ QC

harrybotboy

Thành viên mới
Tham gia
17/6/13
Bài viết
13
Được thích
4
Nghề nghiệp
Sinh viên
Các anh chị cho em hỏi, khi em chạy đoạn mã sau (đoạn mã ví dụ trong tập "Lập trình VBA trong Excel" của tác giả Phan Tự Hướng) thì xảy ra lỗi "Runtime error 438". Nhờ các anh chị giải thích hộ em.

Mã:
Sub guinhan()
    Dim truonghop As VbMsgBoxResult
    prompt = "Ban co muon thoat khoi chuong trinh khong?"
    Buttons = vbYesNoCancel + vbQuestion + vbDefaultButton1
    Title = "Chuong trinh tinh lun"
    truonghop = MsgBox(prompt, Buttons, Title)
    If truonghop = vbYes Then
        MsgBox "Ban vua chon nut Yes.", vbInformation, Title
        ElseIf truonghop = vbNo Then
            MsgBox "Ban vua chon nut No.", vbCritical, Title
        ElseIf truonghop = vbCancel Then
            MsgBox "Ban vua chon nut Cancel.", vbExclamation, Title
    End If
End Sub
 
Khả năng thiếu Controls, bạn thử làm như bài #5 này thử xem.
Code này chạy trên máy mình bình thường.
 
Upvote 0
Mình xin hướng dẫn bạn các bước tìm ra lỗi của chương trình này

B1: Đầu tiên bạn đánh số các dòng lệnh & thêm các câu lệnh thường dùng bẫy lỗi như sau:
PHP:
Sub guinhan()
    Dim truonghop As VbMsgBoxResult
 On Error GoTo LoiCT
1    prompt = "Ban co muon thoat khoi chuong trinh khong?"
    Buttons = vbYesNoCancel + vbQuestion + vbDefaultButton1
3    Title = "Chuong trinh tinh lun"
    truonghop = MsgBox(prompt, Buttons, Title)
5    If truonghop = vbYes Then
        MsgBox "Ban vua chon nut Yes.", vbInformation, Title
7        ElseIf truonghop = vbNo Then
            MsgBox "Ban vua chon nut No.", vbCritical, Title
9        ElseIf truonghop = vbCancel Then
            MsgBox "Ban vua chon nut Cancel.", vbExclamation, Title
11    End If
Err_:           Exit Sub
LoiCT:
    MsgBox Error(), , Erl()
    Resume Err_
End Sub

B2: Bạn cho chạy macro; Bạn sẽ nhận được hộp thoại, mà ở đâu đó trên hộp thoại ta thấy số 1.
Đó là VBE chỉ cho ta biết dòng đang gây lỗi!

Nhưng do cần tìm thô, nên trên kia ta đã đánh chỉ số dòng rất cách khoảng(thưa); Tuy nhiên ta biết rằng lỗi gây ra xung quanh dòng lệnh được đánh số 1

B3: Đánh lại số dòng xung quanh dòng lệnh trước dòng mang số 2:

PHP:
Sub guinhan()
0    Dim truonghop As VbMsgBoxResult
10 On Error GoTo LoiCT
1    prompt = "Ban co muon thoat khoi chuong trinh khong?"
2    Buttons = vbYesNoCancel + vbQuestion + vbDefaultButton1
3    Title = "Chuong trinh tinh lun"
    truonghop = MsgBox(prompt, Buttons, Title)
5    If truonghop = vbYes Then
        MsgBox "Ban vua chon nut Yes.", vbInformation, Title
7        ElseIf truonghop = vbNo Then
            MsgBox "Ban vua chon nut No.", vbCritical, Title
9        ElseIf truonghop = vbCancel Then
            MsgBox "Ban vua chon nut Cancel.", vbExclamation, Title
11    End If
Err_:           Exit Sub
LoiCT:
    MsgBox Error(), , Erl()
    Resume Err_
End Sub

B2.0: Lặp lại bước 2, ta sẽ nhận được hộp thoại. Cũng như ở B2, ta sẽ biết dòng lệnh đang có vấn đề!

B4: Soi kỹ dòng lệnh này ta sẽ thấy vấn đề như sau:
Các từ sau dấu "=" là các thông số của VBA; Khi đó ta tập trung nghi ngờ vô tham biến
Buttons

Tại sao nó có thể sai? (Là câu hỏi bạn & tôi fải có trong đầu)

Nếu bạn là người nhạy cảm, bạn sẽ thấy ngay rằng "Buttons" này là của VBA, ta không có quyền xài
Bạn có thể kiểm chứng vấn đề này bằng biện fáp rất chi là đơn giản như sau:

Bạn xóa chữ 'B' đi; & thay vì nhập 'B' ta nhập 'b';
Nhưng như là thằng cứng đầu, ta vừa {ENTER} thì nó lại biến thành Buttons
Dù bạn có cố thử hơn chục lần cũng vậy mà thôi. . .

B5: Thay Buttons bằng từ nào đó mà bạn thích;
Còn trong trường hợp này, sự lựa chọn của mình là:
Buttons_; GPE; Buts; Nut;. . . .

Chúc buổi sáng cuối tuần vui vẻ!
 
Upvote 0
Cảm ơn anh SA_DQ, cách bẫy lỗi này cũng rất hay. Hoặc sử dụng cách nhanh gọn hơn là ấn F8, VBA sẽ dịch từng dòng một cho tới dòng có lỗi sai.

Em đã làm theo cách của anh, đổi tên biến thành Tuttons, chạy rất mượt. Hoặc em thử khai báo biến
Mã:
Dim Buttons as Variant
thì chương trình cũng chạy rất Ok.
 
Upvote 0
Cảm ơn anh SA_DQ, cách bẫy lỗi này cũng rất hay. Hoặc sử dụng cách nhanh gọn hơn là ấn F8, VBA sẽ dịch từng dòng một cho tới dòng có lỗi sai.

Em đã làm theo cách của anh, đổi tên biến thành Tuttons, chạy rất mượt. Hoặc em thử khai báo biến
Mã:
Dim Buttons as Variant
thì chương trình cũng chạy rất Ok.

Khai báo đúng và đầy đủ phải thế này:
Mã:
Sub guinhan()
  Dim truonghop As VbMsgBoxResult
  Dim prompt As String, Title As String
  [B][COLOR=#ff0000]Dim Buttons As VbMsgBoxStyle[/COLOR][/B]
  prompt = "Ban co muon thoat khoi chuong trinh khong?"
  Buttons = vbYesNoCancel + vbQuestion + vbDefaultButton1
  Title = "Chuong trinh tinh lun"
  truonghop = MsgBox(prompt, Buttons, Title)
  If truonghop = vbYes Then
    MsgBox "Ban vua chon nut Yes.", vbInformation, Title
  ElseIf truonghop = vbNo Then
    MsgBox "Ban vua chon nut No.", vbCritical, Title
  ElseIf truonghop = vbCancel Then
    MsgBox "Ban vua chon nut Cancel.", vbExclamation, Title
  End If
End Sub
Chổ màu đỏ ấy
 
Upvote 0
Web KT
Back
Top Bottom