Lỗi end if without block if dù không thiếu

If ~ End IfNếu điều kiện logic thỏa mãn thì sẽ đi vào trong khối lệnh này. Ở bên trong có thể còn có rẽ nhánh Else, ElseIfTry ~ End TryNếu có lỗi xảy ra thì đi vào trong này. Bên trong có thể còn có rẽ nhánh Catch,Finally While ~ End WhileTrong khi điều kiện logic thỏa mãn thì...Using ~ End UsingMô tả quy trình đảm bảo rằng tài nguyên được giải phóng.SyncLock ~ End SyncLockMô tả một quá trình không thể được thực thi trong nhiều luồng.With ~ End WithMô tả quá trình tham chiếu ngầm đến đối tượng.Do ~ LoopVòng lặpFor ~ NextVòng lặpSelect ~ End SelectMô tả quá trình phân nhánh theo các điều kiện.

Các biến được khai báo trong các khối này có phạm vi khối chỉ có thể được sử dụng trong khối đó. Nếu bạn muốn sử dụng cùng một biến trên nhiều khối, bạn cần khai báo biến bên ngoài khối và nâng phạm vi của biến lên cao hơn một bậc. Hãy xem ví dụ dưới đây :

Bạn cần đăng nhập để thấy hình ảnh

Trong code trên tôi có ba khối block. Tôi khai báo biến userName ở khối đầu tiên. Và khi chạy code trên lập tức sẽ báo lỗi, thông báo biến userName chưa được khai báo. (còn nữa)

Lỗi end if without block if dù không thiếu

  • 3

Với biến string, trong VB.NET nếu không khai báo giá trị khởi tạo ban đầu, VB.NET thường sẽ có cảnh báo. Nếu như có lỗi xảy ra, biến string này nhận giá trị là Null, khi đó các hàm xử lý chuỗi ký tự ở phía sau, chẳng hạn như hàm Len(s) có khả năng sẽ có lỗi. Ngay khi khai báo biến, nếu ta gán giá trị khởi tạo cho biến, thì cảnh báo này sẽ biến mất. Chẳng hạn:

Hoặc:

Dim s as string = Nothing

  • 4

Ở đây tôi xin nêu một cách giải quyết khác :

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        Dim userName As String
        userName = InputBox("Hãy nhập tên")
        If Len(userName) > 0 Then
            MsgBox("Xin chào bạn " & userName)
        End If
    Catch ex As Exception
        'Xử lý lỗi ở đây
        MsgBox("Có lỗi xảy ra" & ex.Message)
    End Try
End Sub

Xử lý với biến userName được đưa vào giữa Try~ Catch . Đây là vị trí mà chương trình hoạt động bình thường. Phạm vi của biến này cũng được giới hạn ở bên trong khoảng nói trên mà thôi. Nếu như bên trong khối lệnh Try~ Catch này lại có các khối lệnh con bên trong thì nó vẫn có hiệu lực. Nhất là các khối lệnh With Me ~ End With thì lại càng vô hại. Nhân tiện, trong C #, bạn có thể sử dụng {} để tạo các khối không có chức năng đặc biệt và bạn chỉ có thể sử dụng nó cho mục đích giới hạn phạm vi của các biến. VB không có khả năng tạo phạm vi như thế. Nếu bạn muốn các khối vô hại, With Me ~ End With là vô hại nhất (mặc dù không phải ở khắp mọi nơi). Ban đầu, With chỉ làm giảm sự cố khi nhập chương trình mà không có chức năng cụ thể nào. Trong ví dụ dưới đây, hai khối được tạo bằng With ~ End With, nhưng bản thân các khối không có ý nghĩa gì, chúng chỉ tách biệt phạm vi của các biến bên trong.

With Me
    Dim count As Integer
    count = count + 111
    MsgBox(count) 'Ket qua : 111
End With
With Me
    Dim count As Integer 'Tao bien moi
    count = count + 222
    MsgBox(count) 'Ket qua: 222
End With

Tuy nhiên, tôi không khuyên bạn nên sử dụng nó theo cách này, vì With vô nghĩa có thể gây nhầm lẫn. Hãy coi đó là thông tin dành cho những người sử dụng nhiều {} trong các ngôn ngữ khác như C #.

Ngay cả người dùng đã có nhiều kinh nghiệm với mã VBA trong Excel đôi khi vẫn có sai sót, lỗi vẫn có thể xảy ra bình thường, bài viết dưới đây Taimienphi.vn sẽ hướng dẫn bạn tất tần tật cách sửa lỗi VBA trong Excel.

VBA trong Excel cho phép người dùng tự động hóa nhiệm vụ với các thao tác lặp đi lặp lại, giúp cải thiện hiệu suất công việc đáng kể. Tuy nhiên lỗi trong quá trình sử dụng VBA trong Excel là không thể tránh khỏi. Bạn đọc cùng tham khảo bài viết Tất tần tật cách sửa lỗi VBA trong Excel dưới đây của Taimienphi.vn để tìm hiểu các cách sửa lỗi VBA nhé.

Lỗi end if without block if dù không thiếu

1. Các loại lỗi VBA trong Excel

Trước khi đi sâu tìm hiểu các cách và các bước sửa lỗi VBA, trước hết bạn đọc cùng Taimienphi.vn tìm hiểu một số loại lỗi VBA phổ biến trong Excel.

Có 4 loại lỗi Excel VBA, bao gồm:

- Lỗi cú pháp (Syntax Error). - Lỗi biên dịch (Compile Error). - Lỗi Run-time Error. - Lỗi Logical Error.

1.1 Lỗi cú pháp (Syntax Error)

Đúng như tên gọi của nó, lỗi cú pháp (Syntax Error) xảy ra khi VBA phát hiện lỗi hoặc cú pháp sai trong mã.

Ví dụ, chẳng hạn nếu bạn quên một phần câu lệnh / cú pháp cần thiết, sau đó trên màn hình sẽ hiển thị lỗi biên dịch (Compile Error).

Trong đoạn mã dưới đây, sau khi nhấn Enter sau dòng lệnh thứ 2, trên màn hình sẽ hiển thị thông báo lỗi biên dịch. Nguyên nhân gây ra lỗi là do lệnh IF phải có lệnh Then đi cùng, tuy nhiên trong đoạn mã này lệnh Then bị thiếu.

Lỗi end if without block if dù không thiếu

Lưu ý: Khi nhập mã trong Excel VBA, nó sẽ kiểm tra từng câu lệnh một ngay sau khi chúng ta nhấn Enter. Nếu VBA phát hiện lệnh hoặc phần nào đó trong cú pháp bị thiếu, ngay lập tức nó sẽ hiển thị thông báo trên màn hình để chúng ta có thể biết được nguyên nhân là do đâu.

Để đảm bảo lỗi cú pháp hiển thị mỗi khi có lỗi hoặc sai sót nào xảy ra, cần đảm bảo bạn đã kích hoạt Autosyntax. Để làm được điều này, click chọn Tools, sau đó click chọn Options. Trong hộp thoại Options, đảm bảo tùy chọn Auto Syntax Check đã được kích hoạt.

Lỗi end if without block if dù không thiếu

Trường hợp nếu tùy chọn Auto Syntax Check bị vô hiệu hóa, bị tắt, VBA vẫn sẽ hiển thị dòng có cú pháp lỗi nhưng không hiển thị hộp thoại thông báo lỗi.

1.2 Lỗi biên dịch (Compile Error)

Lỗi biên dịch (Compile error) xảy ra khi thiếu thành phần cần thiết nào đó để chạy mã.

Cho ví dụ khi chạy đoạn mã dưới đây trên màn hình sẽ hiển thị thông báo lỗi. Nguyên nhân là sử dụng lệnh IF Then mà không có lệnh End If.

Lỗi cú pháp (syntax error) cũng là một dạng lỗi biên dịch. Lỗi cú pháp xảy ra ngay sau khi chúng ta nhấn Enter và VBA phát hiện thiếu một phần hoặc cú pháp nào đó. Lỗi biên dịch cũng xảy ra khi VBA không tìm thấy thành phần nào đó khi nhập mã, nhưng xảy ra khi mã được biên dịch hoặc thực thi.

Lỗi end if without block if dù không thiếu

VBA kiểm tra từng dòng lệnh một khi chúng ta đang nhập mã là đánh dấu lỗi cú pháp ngay sau khi phát hiện có một dòng nào đó không đúng và khi chúng ta nhấn Enter. Ngược lại lỗi biên dịch chỉ được xác định khi VBA phân tích toàn bộ đoạn mã.

Dưới đây là một số trường hợp phổ biến hay xảy ra lỗi biên dịch:

- Sử dụng lệnh IF mà không có lệnh End IF.

- Sử dụng lệnh For với Next.

- Sử dụng lệnh Select mà không có lệnh End Select.

- Không khai báo biến (chỉ hoạt động khi tùy chọn Option Explicit được kích hoạt).

- Gọi một hàm không tồn tại (hoặc sai tham số).

Lưu ý: Khi thêm tùy chọn Option Explicit, chúng ta sẽ được yêu cầu khai báo tất cả các biến trước khi chạy mã. Nếu có biến chưa được khai báo, VBA sẽ hiển thị thông báo lỗi.

1.3 Lỗi Run-time Error

Lỗi run-time xảy ra khi mã đang chạy.

Ví dụ nếu chạy đoạn mã được sử dụng để mở workbook Excel nhưng workbook không khả dụng (đã bị xóa hoặc được đổi tên), mã sẽ trả về thông báo lỗi run-time.

Lỗi end if without block if dù không thiếu

Khi lỗi run-time xảy ra, mã sẽ dừng chạy và trên màn hình sẽ hiển thị hộp thoại thông báo lỗi giải thích nguyên nhân gây lỗi là do đâu.

Bằng cách click chọn nút Debug để làm nổi bật phần mã gây ra lỗi.

Lỗi end if without block if dù không thiếu

Sau khi sửa lỗi, bạn có thể click chọn nút Run trên thanh công cụ hoặc nhấn phím F5 để tiếp tục chạy mã. Hoặc có thể click chọn nút End để thoát khỏi mã.

Lưu ý quan trọng: Trong trường hợp nếu click chọn nút End trên hộp thoại, nó sẽ dừng lại ở đoạn mã bị lỗi. Tất cả các dòng mã trước đó sẽ được thực thi.

1.4 Lỗi Logical Error

Lỗi logic không làm cho mã dừng lại, nhưng có thể trả về các kết quả sai. Đây cũng là loại lỗi khó khắc phục nhất. Trình biên dịch không đánh dấu các lỗi này và chúng ta phải thực hiện theo cách thủ công.

Có một số cách để khắc phục lỗi logical trong Excel:

- Chèn Message Box vào các vị trí trong đó mã và các giá trị / dữ liệu được làm nổi bật.

- Thay vì chạy cả đoạn mã cùng một lúc, chúng ta chạy từng dòng mã một. Để làm được điều này, click chọn vị trí bất kỳ trong mã và nhấn phím F8 để thực thi từng dòng mã một. Điều này cho phép chúng ta có thể dễ dàng xác định các lỗi trong từng dòng mã.

2. Tất tần tật cách sửa lỗi VBA trong Excel

Cách 1: Sử dụng Debug để tìm lỗi biên dịch / lỗi cú pháp

Giải pháp lý tưởng là thực hiện biên dịch mã trước khi chạy. Để biên dịch mã, click chọn tùy chọn Debug trên thanh công cụ, sau đó click chọn Compile VBAProject.

Lỗi end if without block if dù không thiếu

Khi biên dịch VBA project, nó sẽ đi qua các mã và xác định các lỗi (nếu có).

Trong trường hợp nếu phát hiện thấy lỗi, VBA sẽ hiển thị hộp thoại thông báo lỗi, sau khi đã sửa lỗi chúng ta sẽ phải chạy lại trình biên dịch lần nữa để tìm các lỗi khác (nếu có).

Nếu mã không có lỗi, tùy chọn Compile VBAProject sẽ chuyển sang màu xám.

Lưu ý: Biên dịch mã chỉ phát hiện được các lỗi cú pháp và lỗi biên dịch, không thể phát hiện các lỗi run-time.

Cách 2: Cấu hình các cài đặt lỗi (lỗi Handled và Unhandled)

Ngoài ra trước khi bắt đầu thực thi các mã, chúng ta nên kiểm tra cài đặt Excel VBA.

Truy cập thanh công cụ VBA, sau đó click chọn Tools =>Options.

Trên hộp thoại Options, click chọn tab General, đảm bảo tùy chọn Break on Unhandled Errors trong Error Trapping đã được chọn.

- Tùy chọn Break on All Errors: dừng thực thi mã trên tất cả các loại lỗi, ngay cả khi bạn đã áp dụng các kỹ thuật để xử lý các lỗi này.

- Tùy chọn Break in Class Module: Dừng thực thi mã trên tất cả các lỗi chưa được xử lý (Unhandled), đồng thời nếu sử dụng các đối tượng như Userforms, nó cũng sẽ phá vỡ các đối tượng này và đánh dấu chính xác dòng gây ra lỗi.

- Tùy chọn Break on Unhandled Errors: Chỉ dừng mã đối với các lỗi không được xử lý. Đây là cài đặt mặc định để đảm bảo các lỗi chưa được xử lý chưa được hiển thị trên thông báo. Nếu sử dụng các đối tượng như Userforms, tùy chọn này không đánh dấu dòng gây ra lỗi trong đối tượng mà chỉ đánh dấu dòng tham chiếu đến đối tượng đó.

Lưu ý: Nếu làm việc với các đối tượng như Userforms, bạn có thể thay đổi cài đặt này thành Break on Class Modules. Ngoài ra bạn cũng có thể sử dụng tùy chọn thứ 2, nó sẽ hiển thị dòng cụ thể trong đối tượng là nguyên nhân gây lỗi.

3. Xử lý lỗi VBA bằng các lệnh On Error

Xem chi tiết cách xử lý lỗi VBA bằng cách lệnh Error tại đây

4. Tìm hiểu thuộc tính và phương thức Err Object (đối tượng Err)

Xem bài viết tìm hiểu thuộc tính và phương thức đối tượng Err Object tại đây.

5. Tổng kết

Dưới đây là tổng hợp một số cách để xử lý lỗi VBA trong Excel:

1. Sử dụng lệnh On Error Go [Label] ở đầu mã để đảm bảo có bất lỳ lỗi nào xảy ra cũng được xử lý.

2. Chỉ sử dụng lệnh On Error Resume Next khi biết chắc chắn các lỗi có thể xảy ra. Trong trường hợp nếu sử dụng lệnh với các lỗi phát sinh, lệnh sẽ bỏ qua lỗi và mã tiếp tục chạy. Ngoài ra chúng ta có thể sử dụng kết hợp lệnh On Error Resume Next với Err.Raise nếu muốn bỏ qua loại lỗi cụ thể.

3. Khi sử dụng trình xử lý lỗi, cần đảm bảo sử dụng Exit Sub trước khi xử lý. Điều này để đảm bảo trình xử lý mã lỗi chỉ được thực thi khi có lỗi xảy ra, nếu không nó sẽ luôn được thực thi.

4. Sử dụng nhiều trình xử lý để bẫy các loại lỗi khác nhau.

Bài viết trên đây Taimienphi.vn vừa hướng dẫn bạn tất tần tật cách sửa lỗi VBA trong Excel. Nếu có bất kỳ thắc mắc hoặc câu hỏi nào cần giải đáp, bạn đọc có thể để lại ý kiến của mình trong phần bình luận bên dưới bài viết nhé.