Hỏi về từ khóa "Error"

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị ^^
Hiện tại em đang có một chỗ chưa hiểu sau mong các anh chị giải thích giúp em .
!!!Các anh chị chạy tất cả các Sub ở các ví dụ sau bằng phím "F8" để hiểu vấn đề em đang nói

Ta có các ví dụ sau:

Ví dụ 1:
1652439634715.png
Ở ví dụ này thì Sub sẽ chạy từ đầu đến cuối mặc dù a1 đã được khai báo (Nó không quay lên chỗ Line1: để chạy tiếp)

Ví dụ 2:
1652439998618.png
Ở ví dụ 2 này thì Sub nó nhảy đến Line1: và chạy bình thường

Ví dụ 3:
1652440113226.png
ở ví dụ 4 này Sub nó chạy đến hết dòng thứ 4 thì nó quay lến ErrMsg: rồi chạy tiếp (Mâu thuẫn với ví dụ 1) . Em nghĩ nó bị sao sao ở chỗ từ khóa Error ấy ^^

Mong các anh chị hiểu ý của em muốn nói ^^ "Cái vấn đề này thật khó để diễn tả bằng lời mà" hic
 

File đính kèm

  • test.xlsb
    16.2 KB · Đọc: 3
Lần chỉnh sửa cuối:
ở ví dụ 4 này Sub nó chạy đến hết dòng thứ 4 thì nó quay lến ErrMsg: rồi chạy tiếp (Mâu thuẫn với ví dụ 1) . Em nghĩ nó bị sao sao ở chỗ từ khóa Error ấy ^^

Mong các anh chị hiểu ý của em muốn nói ^^ "Cái vấn đề này thật khó để diễn tả bằng lời mà" hic
On <biểu thức số> Goto <danh sách> (<danh sách>: liệt kê các chỉ số dòng hoặc các nhãn - label)

<biểu thức số>: a là biểu thức. (a+b), (a^+3a*b+b^2), (3a + sin(b)) ... cũng đều là biểu thức.

Đây là cấu trúc rất cũ của Visual Basic, dùng để phân nhánh tới những cụm dòng code khác nhau dựa trên giá trị của <biểu thức số>. Tuy cấu trúc này còn tồn tại nhưng ngày nay người ta dùng cấu trúc phân nhánh linh hoạt và đa dạng hơn, đó là SELECT CASE.

<biểu thức số> giá trị của biểu thức sẽ được làm tròn xuống tới số nguyên.

- <biểu thức số> trả về số âm hoặc số > 255: sẽ có lỗi.
- <biểu thức số> trả về 0 hoặc k với k > số nhãn trong <danh sách>: sẽ có bước nhẩy tới dòng ngay sau dòng On ... Goto ... (A)
- <biểu thức số> trả về giá trị k với 1 <= k <= 255: sẽ có bước nhẩy tới nhãn thứ k trong <danh sách>. (B)


Ta xét sub Test3.

Do a1 không được thiết lập nên ở dòng On ... thì a1 = 0. Theo như trên thì có bước nhẩy tới dòng ngay sau dòng On ... (A), tức tới dòng a2 = 2. Rồi code được thực hiện bình thường cho tới dòng cuối cùng.

Ta xét sub Test4.

Do a1 = 1, tức <biểu thức số> trả về 1, vậy có bước nhẩy tới nhãn thứ 1 của danh sách - (B). Danh sách có 1 nhãn duy nhất là Line1 nên sẽ có bước nhẩy tới Line1, tiếp theo chạy bình thường.

Ta xét On Error Goto ErrMsg

Đây là cấu trúc On Error Goto NHÃN

Triết lý của On Error Goto NHÃN: kể từ dòng On ... khi gặp lỗi thì sẽ thực hiện bước nhẩy tới dòng sau NHÃN.

Ta xét sub Test5.

Khi thực hiện dòng Y = 20 / 0 thì có lỗi chia hết cho 0 nên theo On ... sẽ có bước nhẩy tới dòng sau nhãn ErrMsg, tức tới dòng MsgBox ...

Không có mâu thuẫn với ví dụ 1. Chẳng qua ở ví dụ 1 bạn không hiểu ý nghĩa của cấu trúc On <biểu thức số> Goto <danh sách>

Ngày nay không ai dùng cấu trúc On <biểu thức số> Goto <danh sách>. Để phân nhánh thì người ta dùng Select ... Case
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub BayLoi()
 Dim AA As Long, BB As Double, J As Long
 Dim Rng As Range
 On Error GoTo LoiCT

1 For J = 2 To 9
    If J Mod 4 <> 0 Then
        Set Rng = Cells(J, "c")
   Else
       Set Rng = Nothing
   End if
2    AA = Cells(J, "B").Value
3    MsgBox AA / Rng.Value
4 Next J
Err_:           Exit Sub
LoiCT:
    If Err = 13 Then
        Resume Next
    Else
        MsgBox Err & "  " & Erl & "  " & J, , Error
        Resume Err_
    End If
End Sub
 

File đính kèm

  • C0430.jpg
    C0430.jpg
    63 KB · Đọc: 2
Lần chỉnh sửa cuối:
Upvote 0
Dạ vâng ạ ^^ Em trả lời hơi muộn mong anh thông cảm chút vì hôm nay là thứ 7 mà ^^

Theo như anh nói:
- <biểu thức số> trả về 0 hoặc k với k > số nhãn trong <danh sách>: sẽ có bước nhẩy tới dòng ngay sau dòng On ... Goto ... (A)
Ở ví dụ 1:
Do a1 được khai báo kiểu biến là số mà a1 lại chưa được khai báo giá trị => a1 = 0
==> Nó sẽ nhảy tới ngay sau dòng "On ... Goto (A) " để chạy tiếp

Ở ví dụ 3:
Theo cấu trúc như anh nói
cấu trúc On Error Goto NHÃN

Triết lý của On Error Goto NHÃN: kể từ dòng On ... khi gặp lỗi thì sẽ thực hiện bước nhẩy tới dòng sau NHÃN.
Em thấy chắc hẳn giữa ví dụ 1 và ví dụ 3 phải có liên hệ gì với nhau . Do đều sử dụng cùng cấu trúc:
On ... Goto Nhãn(Label)

Vậy
Giả sử Cái Error ở ví dụ 3 có có kiểu số nó phải bằng một con số nào đó mà bắt buộc phải thỏa mãn điều kiện sau:
Điều kiện cần:
(1 <= Error <= 255) ' Thì nó mới thỏa mãn điều kiện Goto
Điều kiện đủ:
(And (Error <> 0) And (Error <= Số nhãn trong danh sách )) ' Thì nó mới nhảy được đến nhãn
(Or (Error = 1) ) ' Thì nó mới nhảy được đến nhãn thứ 1 trong danh sách
Nhưng mà đến khi em thử in giá trị Error ra màn hình thì nó lại trống trơn

Nếu:
Giả sử ở trên là không đúng thì Chắc nó phải là một cái đặc biệt thì anh mới nói là "Triết lý" :)))

Anh vào xác nhận giúp em với ^^
Bài đã được tự động gộp:

PHP:
Sub BayLoi()
 Dim AA As Long, BB As Double, J As Long
 Dim Rng As Range
 On Error GoTo LoiCT

1 For J = 2 To 9
    If J Mod 4 <> 0 Then
        Set Rng = Cells(J, "c")
   Else
       Set Rng = Nothing
   End if
2    AA = Cells(J, "B").Value
3    MsgBox AA / Rng.Value
4 Next J
Err_:           Exit Sub
LoiCT:
    If Err = 13 Then
        Resume Next
    Else
        MsgBox Err & "  " & Erl & "  " & J, , Error
        Resume Err_
    End If
End Sub
Em chào anh :))) . Anh có thể giải thích kĩ hơn câu trả lời của anh được không ạ . Em thật sự không hiểu ý của anh muốn nói là gì
 
Upvote 0
. . . . .
Em chào anh :))) . Anh có thể giải thích kĩ hơn câu trả lời của anh được không ạ . Em thật sự không hiểu ý của anh muốn nói là gì
Đó có lẽ chưa phải là câu trả lời; mà là mình đưa ra 1 hướng để bạn có thể tham khảo, nếu thích:
(Nội dung macro có lẽ bạn đã rõ, nên mình sẽ không phiên âm ra tiếng Việt làm chi nữa)
Ta có thể lấy 1 trang tính & nhập dữ liệu vô 9 dòng tại cột 'B' & 'C'; Sau đó cho chạy macro để xem nó làm việc như thế nào
Chú ý nhất là [B2:C4] ta có thể nhập kí số, ký tự , trị 0 & công thức đang lỗi,. . . .
 
Upvote 0
Dạ vâng ạ ^^ Em trả lời hơi muộn mong anh thông cảm chút vì hôm nay là thứ 7 mà ^^

Theo như anh nói:

Ở ví dụ 1:
Do a1 được khai báo kiểu biến là số mà a1 lại chưa được khai báo giá trị => a1 = 0
==> Nó sẽ nhảy tới ngay sau dòng "On ... Goto (A) " để chạy tiếp

Ở ví dụ 3:
Theo cấu trúc như anh nói

Em thấy chắc hẳn giữa ví dụ 1 và ví dụ 3 phải có liên hệ gì với nhau . Do đều sử dụng cùng cấu trúc:
On ... Goto Nhãn(Label)

Vậy
Giả sử Cái Error ở ví dụ 3 có có kiểu số nó phải bằng một con số nào đó mà bắt buộc phải thỏa mãn điều kiện sau:
Điều kiện cần:
(1 <= Error <= 255) ' Thì nó mới thỏa mãn điều kiện Goto
Điều kiện đủ:
(And (Error <> 0) And (Error <= Số nhãn trong danh sách )) ' Thì nó mới nhảy được đến nhãn
(Or (Error = 1) ) ' Thì nó mới nhảy được đến nhãn thứ 1 trong danh sách
Nhưng mà đến khi em thử in giá trị Error ra màn hình thì nó lại trống trơn

Nếu:
Giả sử ở trên là không đúng thì Chắc nó phải là một cái đặc biệt thì anh mới nói là "Triết lý" :)))
Tôi không trả lời thay cho tác giả bài #2, nhưng tôi thấy bạn hiểu sai Error nên giải thích 1 chút:
Error là lỗi và bạn không nên hiểu kiểu đánh đồng nó với biểu thức a, a1 kia. Error nghĩa của nó là lỗi bất kỳ mà VBA phát hiện ra, On error goto xxx nghĩa là khi có lỗi thì nhảy cóc đến sau cái nhãn xxx kia để chạy tiếp. Mã lỗi của error là gì thì bạn phải dùng lệnh Debug.Print Err.Number để xem trong cửa sổ Immediate
 
Upvote 0
Dạ vâng ạ ^^ Em trả lời hơi muộn mong anh thông cảm chút vì hôm nay là thứ 7 mà ^^

Theo như anh nói:

Ở ví dụ 1:
Do a1 được khai báo kiểu biến là số mà a1 lại chưa được khai báo giá trị => a1 = 0
==> Nó sẽ nhảy tới ngay sau dòng "On ... Goto (A) " để chạy tiếp

Ở ví dụ 3:
Theo cấu trúc như anh nói

Em thấy chắc hẳn giữa ví dụ 1 và ví dụ 3 phải có liên hệ gì với nhau . Do đều sử dụng cùng cấu trúc:
On ... Goto Nhãn(Label)

Vậy
Giả sử Cái Error ở ví dụ 3 có có kiểu số nó phải bằng một con số nào đó mà bắt buộc phải thỏa mãn điều kiện sau:
Điều kiện cần:
(1 <= Error <= 255) ' Thì nó mới thỏa mãn điều kiện Goto
Điều kiện đủ:
(And (Error <> 0) And (Error <= Số nhãn trong danh sách )) ' Thì nó mới nhảy được đến nhãn
(Or (Error = 1) ) ' Thì nó mới nhảy được đến nhãn thứ 1 trong danh sách
Nhưng mà đến khi em thử in giá trị Error ra màn hình thì nó lại trống trơn

Nếu:
Giả sử ở trên là không đúng thì Chắc nó phải là một cái đặc biệt thì anh mới nói là "Triết lý" :)))

Anh vào xác nhận giúp em với ^^
Bài đã được tự động gộp:


Em chào anh :))) . Anh có thể giải thích kĩ hơn câu trả lời của anh được không ạ . Em thật sự không hiểu ý của anh muốn nói là gì
Nói thế mà bạn cũng không hiểu thì bó tay.

On <biểu thức số> Goto <danh sách>

và

On Error Goto label

là 2 thứ hoàn toàn khác nhau, triết lý khác nhau.

Với On <biểu thức số> Goto <danh sách> thì sau On là biểu thức số. Và <danh sách> có thể chứa tới 255 thành phần, vd. 255 LABEL phân cách bởi dấu phẩy. Tùy <biểu thức số> trả về giá trị nào mà sẽ có những bước nhẩy khác nhau.

Nếu a = WeekDay(Date) thì a chỉ có thể là 1, 2, ..., 7. Nếu code sau mỗi nàu bạn chạy thì ngày Chủ Nhật sẽ chỉ có 1 thông báo duy nhất là "Nhay toi line1", ngày thứ 2 sẽ chỉ có 1 thông báo duy nhất là "Nhay toi line2", Ngày thứ 3 sẽ chỉ có 1 thông báo duy nhất là "Nhay toi line3", ..., ngày thứ Bẩy sẽ chỉ có 1 thông báo duy nhất là "Nhay toi line7"
Mã:
Sub test()
Dim a As Long, text
    a = Weekday(Date)
    text = "Nhay toi line" & a
    On a GoTo line1, line2, line3, line4, line5, line6, line7
    MsgBox "Buon qua, toi khong duoc thuc thi"
    MsgBox "Buon qua, hang xom cung khong duoc thuc thi"
    MsgBox "Buon qua, cha ai duoc thuc thi"
line1:
    MsgBox text
    Exit Sub
line2:
    MsgBox text
    Exit Sub
line3:
    MsgBox text
    Exit Sub
line4:
    MsgBox text
    Exit Sub
line5:
    MsgBox text
    Exit Sub
line6:
    MsgBox text
    Exit Sub
line7:
    MsgBox text
    Exit Sub
End Sub

Sau khi chạy code bạn có thể thấy là tùy theo giá trị của a mà có những "cụm code" thích hợp được thực thi. Ở đây chỉ là 1 dòng và chỉ là MsgBox, nhưng tổng quát mỗi cụnm có thể có nhiều dòng code và làm những việc khác nhau: thứ 2 thì tổng hợp A, thứ 3 tổng hợp B, thứ 6 làm bao cáo ... Rõ ràng ở đây có sự phân nhánh. Ngày nay người ta thực hiện cũng từng "cụm code" đấy tùy theo giá trị của a theo cách khác - Select Case
Mã:
Sub test1()
Dim a As Long
    a = Weekday(Date)
    Select Case a
        Case 1: <cụm code kiểm tra giờ bay về nhà>
        Case 2: <cụm code tổng hợp A>
        Case 3: <cụm code tổng hợp B>
        Case 4: ...
        Case 5: ...
        Case 6: <cụm code làm báo cáo, kiểm tra giờ bay đi nghỉ ở Phú Quốc>
        Case 7: <cụm code ...>
    End Select
End Sub

Nên nhớ triết lý của On <biểu thức số> Goto <danh sách> là PHÂN NHÁNH, là BƯỚC NHẨY tới từng chỗ trong code tùy theo <biểu thức số>. Chuyện bạn chỉ có trong <danh sách> 1 label duy nhất, tức chỉ nhẩy tới 1 chỗ duy nhất, là do bạn có nhu cầu thế. Nhưng trong trường hợp tổng quát thì <danh sách> có thể có nhiều label và tùy theo <biểu thức số> mà có thể nhẩy tới NHIỀU chỗ khác nhau. Người ta gọi đó là sự PHÂN NHÁNH. Tất cả các code với On <biểu thức số> Goto <danh sách> đều có thể viết lại bằng cách dùng Select Case.

Cấu trúc On Error Goto label.
- Ở đây chỉ có 1 và luôn luôn chỉ có 1 label, không thể có danh sách label
- chỉ luôn luôn nhẩy tới 1 chỗ duy nhất là label, không thể nhẩy tới nhiều chỗ khác nhau.
- chỉ có bước nhẩy khi dòng code nào đó sau dòng On Error ... có lỗi. Nếu không có lỗi thì chả có bước nhẩy nào được thực hiện.
Trong trường hợp On <biểu thức số> thì LUÔN LUÔN có bước nhẩy. Bước nhẩy tới dòng sau On <biểu thức số> khi <biểu thức số> trả về 0 cũng là bước nhẩy.

Rõ ràng triết lý của On <biểu thức số> là phân nhánh, là thực hiện cụm code được chọn, chả dính dáng gì tới TÌNH HUỐNG LỖI khi thực hiện code, chả dính dáng gì tới XỬ LÝ LỖI. On Error Goto <chỗ nào đấy> LUÔN LUÔN dính dáng tới TÌNH HUỐNG LỖI khi thực hiện code, và <chỗ nào đấy> LUÔN LUÔN là nơi XỬ LÝ LỖI.

Tôi đã giải thích triết lý của On Error mà bạn không hiểu vì có cái bạn hiểu sai. Error trong On Error ... không dính dáng gì tới HÀM Error (một hàm rất rất cũ của Visual Basic) ***. On Error chẳng qua là cú pháp của cấu trúc phục vụ việc xử lý lỗi mà thôi. Trong On Error Goto label chả có một <biểu thức số> nào cả. Chẳng qua cú pháp có chứa Error nên bạn lầm tưởng là sau On là HÀM Error của VBA.

Tóm lại hiểu thế này cho nhanh:

On <biểu thức số> Goto <danh sách>: chỉ là sự phân nhánh, sẽ có một cụm code cụ thể được thực hiện tùy theo giá trị của <biểu thức số>. Hiểu nôm na là chọn cụm code để thực hiện. Cái này chả dính dáng gì tới XỬ LÝ LỖI.

On Error Goto label: luôn dính dáng tới XỬ LÝ LỖI. Và sẽ có bước nhẩy chỉ tới 1 vị trí vừa cố định vừa duy nhất KHI VÀ CHỈ KHI sảy ra LỖI. Triết lý nó là thế. Và cứ coi On Error là cú pháp, là "cụm 2 từ khóa không thể tách rời" thôi, đừng lầm tưởng Error là cái hàm rất xưa của Visual Basic.

------------------
***:

Error là HÀM rất rất cũ của Visual Basic. Ngày nay thay vì dùng HÀM Error thì người ta dùng Err.Description. Hàm Error chẳng qua trả về Err.Description mà thôi. Đây cũng là giá trị STRING.

Bàn chút về Error.

Ta xét code
Mã:
Sub Test()
Dim b As Long
    b = 1 / 0
End Sub
Sẽ có cửa sổ thông báo lỗi với nội dung:

Run-time error 11
Division by zero

Bây giờ chạy code
Mã:
Sub Test()
Dim b As Long
On Error Resume Next
    b = 1 / 0
End Sub
Lỗi đã bị bỏ qua. Không có một thông báo gì cả. Tức có lỗi nhưng lỗi bị bỏ qua, code thực thi các dòng tiếp theo.
Thế sau khi lỗi sảy ra mà không có cửa sổ thông báo (do On Error Resume Next) thì có thể xác định lỗi gì đã sảy ra không? Câu trả lời là có - đối tượng Err. Nếu trước thời điểm kiểm tra đã sảy ra lỗi thì lúc đó Err.Number sẽ <> 0, và trong Err.Description sẽ có mô tả lỗi. Nếu trước đó có lỗi thì hàm Error (không truyền đối số) sẽ trả về Err.Description.
Ta kiểm tra
Mã:
Sub Test()
Dim b As Long, text1 As String, text2 As String
On Error Resume Next
    b = 1 / 0
    If Err.Number <> 0 Then
        text1 = Err.Description
        text2 = Error
        MsgBox text1
        MsgBox text2
        MsgBox Err.Number
    End If
End Sub
Khi chạy code sẽ thấy text1 = text2 = "Division by zero", và err.Number trả về 11.
Tóm lại trong thuộc tính Number và Description của đối tượng Err sẽ là những giá trị mà bạn nhìn thấy ở cửa sổ thông báo khi không có phục vụ lỗi (khi On Error Resume Next).

Ở trên ta đã xét Error không có tham số. Thế nếu ta truyền tham số (là err.Number khi có lỗi) thì sao?

Ta thường thấy ai đó kêu là chạy code thấy lỗi:

Run-time error 13
Type mismatch

Ta xét code

Mã:
Sub Test()
Dim a As Long, b As Range
    If TypeName(a) <> TypeName(b) Then MsgBox Error(13)
End Sub

Ta thấy thông báo "Type mismatch". Thực ra chả có lỗi thực hiện code nào sảy ra ở đây, tự ta (giả lập) trả về mô tả lỗi thôi. Vậy Error(thông số) ta dùng khi nào? Tùy thôi. Có nhiều kiểu tùy nhu cầu. Giả sử ta viết Function trả về giá trị lỗi khi các tham số đầu vào có những giá trị nào đó. Thế thì ta xét xem chúng ... thế nào. Nếu thế thì trả về vd. Error(13), nếu ... thì trả về Error(1004), nếu ... thì ...

Bạn nên tìm đọc trên mạng. Chả nhẽ cái gì cũng đi hỏi?
 
Lần chỉnh sửa cuối:
Upvote 0
^^ Em cảm ơn các anh nhiều lắm . Em thấy mọi người trả lời từ chiều mà lúc ấy em đang đi chơi không đọc được . Bây giờ về mới đọc hi
:> . Em đã hiểu rồi ạ , em cảm ơn các anh rất nhiều vì đã dành thời gian đọc bài viết của em .

Bạn nên tìm đọc trên mạng. Chả nhẽ cái gì cũng đi hỏi?
Em cũng có tìm hiểu rồi ấy anh . Nếu anh để ý thì ở ví dụ 3 của em là một ví dụ ở trên mạng ^^ .
 
Upvote 0
^^ Em cảm ơn các anh nhiều lắm . Em thấy mọi người trả lời từ chiều mà lúc ấy em đang đi chơi không đọc được .
Một cấu trúc là việc thực hiện code bằng cách phân nhánh giống Select Case, một đằng là cấu trúc phục vụ xử lý lỗi. Rõ ràng 2 việc hoàn toàn khác nhau.

Ngay trong bài #2 tôi đã nêu rõ triết lý của On <biểu thức số> Goto <danh sách> và On Error Goto label, nhưng bạn cứ cố tình tìm một cái gì đó chung giữa chúng.
On <biểu thức số> Goto <danh sách> (<danh sách>: liệt kê các chỉ số dòng hoặc các nhãn - label)

<biểu thức số>: a là biểu thức. (a+b), (a^+3a*b+b^2), (3a + sin(b)) ... cũng đều là biểu thức.

Đây là cấu trúc rất cũ của Visual Basic, dùng để phân nhánh tới những cụm dòng code khác nhau dựa trên giá trị của <biểu thức số>. Tuy cấu trúc này còn tồn tại nhưng ngày nay người ta dùng cấu trúc phân nhánh linh hoạt và đa dạng hơn, đó là SELECT CASE.

<biểu thức số> giá trị của biểu thức sẽ được làm tròn xuống tới số nguyên.

- <biểu thức số> trả về số âm hoặc số > 255: sẽ có lỗi.
- <biểu thức số> trả về 0 hoặc k với k > số nhãn trong <danh sách>: sẽ có bước nhẩy tới dòng ngay sau dòng On ... Goto ... (A)
- <biểu thức số> trả về giá trị k với 1 <= k <= 255: sẽ có bước nhẩy tới nhãn thứ k trong <danh sách>. (B)

Đây là cấu trúc On Error Goto NHÃN

Triết lý của On Error Goto NHÃN: kể từ dòng On ... khi gặp lỗi thì sẽ thực hiện bước nhẩy tới dòng sau NHÃN.
 
Upvote 0
Một cấu trúc là việc thực hiện code bằng cách phân nhánh giống Select Case, một đằng là cấu trúc phục vụ xử lý lỗi. Rõ ràng 2 việc hoàn toàn khác nhau.

Ngay trong bài #2 tôi đã nêu rõ triết lý của On <biểu thức số> Goto <danh sách> và On Error Goto label, nhưng bạn cứ cố tình tìm một cái gì đó chung giữa chúng.
Anh ngủ muộn thật ấy . Nhờ tò mò mà em được anh thêm thông tin anh ^^ Em thấy cũng đáng hi . Mỗi tội hơi vất vả cho anh rồi ^^ Em cảm ơn anh nhiều lắm
 
Upvote 0
Tôi không trả lời thay cho tác giả bài #2, nhưng tôi thấy bạn hiểu sai Error nên giải thích 1 chút:
Error là lỗi và bạn không nên hiểu kiểu đánh đồng nó với biểu thức a, a1 kia. Error nghĩa của nó là lỗi bất kỳ mà VBA phát hiện ra, On error goto xxx nghĩa là khi có lỗi thì nhảy cóc đến sau cái nhãn xxx kia để chạy tiếp. Mã lỗi của error là gì thì bạn phải dùng lệnh Debug.Print Err.Number để xem trong cửa sổ Immediate
Khi nói chuyện ngữ pháp lập trình thì ngữ cảnh là điểm quan trọng.
VBA là loại ngôn ngữ tuần tự theo dòng. Thực hiện xong dòng này thì nó tiếp tục ở dòng kế đó.

1:
On <cái gì đó> GoTo/GoSub <nơi nào đó>
:
GoTo/GoSub xyz là một lệnh rẽ nhánh. Nó đơn giản có nghĩa là: không tiếp tục ở dòng kế tiếp, mà rẽ đi đến dòng được đánh dấu xyz. VBA có hai cách đánh dấu dòng: một là dùng nhãn (label), và hai là dùng chỉ số dòng.

(i) Nếu GoTo bắt đầu ở đầu dòng thì nó là lệnh rẽ nhánh vô điều kiện.
(ii) Nếu đầu dòng có tiền đề "On" thì đó là lệnh rẽ nhánh có chọn lựa. Từ "On" ở đây có thể hiểu là "dựa vào". Điển hình:
On a GoTo Nhan1, Nhan2, Nhan3
VBA sẽ chọn trị a (giống như Choose) và rẽ nhánh đến đúng chỗ. Lưu ý là nếu trị a nằm ngoài 1, 2, 3 thì VBA tự động coi như tiền đề "On" không thỏa, và không rẽ đi đâu hết, tức nó sẽ tiếp tục ở dòng kế như không hề có lệnh rẽ nhánh. Đây là điểm quan trọng quý vị cần nắm vững khi sử dụng lệnh rẽ nhánh.

2:
On Error <làm cái gì đó (GoTo/GoSub/Resume/Exit [nơi nào đó])> là một lệnh khác hoàn toàn.
Ở đây On là một lệnh dựng (set up) điều kiện, và Error là sự kiện lỗi. Nói cách khác, lệnh On Error bảo VBA dựng lên một tình huống để BẮT SỰ KIỆN LỖI. Và cái mệnh đề <làm cái gì đó> cho biết chuyện gì cần làm khi sự kiện (lỗi) xảy ra.
Lưu ý là tình huống "bắt sự kiện lỗi" này có cái tầm vực của nó (có hiệu lực và hết hiệu lực lúc nào?). Quý vị cần tìm hiểu thêm để nắm vững.

3:
Err không phải là một phần của On Error
.
Chính thức, Err là một đối tượng (Object) trong VBA, dùng để xem xét lỗi.
Mỗi lần lỗi xảy ra thì đối tượng này sẽ được VBA ghi chi tiết vào. Quý vị chỉ cần xét các thuộc tính của nó để biết lỗi. Và quý vị dùng các lệnh như Resume, Exit,... để reset nó lại. Chính nó cũng có một vài phương thức để set/reset nếu cần.

Chú thích: trong lập trình, bẫy lỗi run time được gán cho từ khóa "Exception Handling"
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ngủ muộn thật ấy . Nhờ tò mò mà em được anh thêm thông tin anh ^^ Em thấy cũng đáng hi . Mỗi tội hơi vất vả cho anh rồi ^^ Em cảm ơn anh nhiều lắm
Nếu bạn 19 tuổi thì Bác ấy chắc bằng tuổi ông của bạn.


Nếu bạn sử dụng On trong mã thì hiểu như sau:
-----------------------------------------------------------
1. On <Giá trị> Goto Label1, , ,Labelx
On a1 Goto L1, L2, L3, C5
A1 = 1 sẽ nhảy đến L1, 2 đến L2, 3 đến L3, 4 đến C5, cứ theo thứ tự
Goto thì chỉ nhảy đi, không nhảy về
không thể sử dụng Resume, Resume Next, Resume Label1 trong trường hợp này
Cũng không thể sử dụng từ khóa Return trong khối Label

2. On <Giá trị> Gosub Sub1, , ,Subx
Gosub nhảy đi rồi nhảy về lại do có cú pháp Return

3. On Error Goto Label1
Thì nó sẽ bắt lỗi trong khối có dòng mã này và nhảy đi
Nhảy về khi thêm Resume, Resume Next, Resume Label1
Không sử dụng được Gosub trong trường hợp bắt lỗi.


JavaScript:
Sub Test1()
  Dim a1%
  a1 = 1
  On a1 GoSub sub1, sub2, sub3
  On a1 GoTo line1, line2
line1:
  Debug.Print "line1"
  On Error GoTo Err
  a1 = 1 / 0
line2:
  Debug.Print "line2"
  Debug.Print "Finish"
Exit Sub
sub1:
  Debug.Print "sub1"
  Return
sub2:
  Debug.Print "sub2"
  Return
sub3:
  Debug.Print "sub3"
  Return
Err:
  Debug.Print "Err"
  Resume Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn 19 tuổi thì Bác ấy chắc bằng tuổi ông của bạn
Oh bảo sao bác ấy có kiến thức thật sâu sắc như vậy!!. Em cũng đoán được một phần mà ^^ . Mọi người trên này ai cũng chững tuổi hết rồi^^ .
Thật là em cũng không biết xưng hô làm sao nữa . Với mục đích em lên đây là để lĩnh hội kiến thức nên là em cũng sẽ dùng cách xưng hô nào để làm sao tiện nhất cho công cuộc lĩnh hội tri thức này . Không phải là em không tôn trọng những người lớn tuổi mà mình cũng đang giao tiếp qua môi trường trung gian đó là môi trường mạng . Mỗi người đều có một lớp mặt nạ che đậy con người thật sự của mình! Em cũng vậy! Làm sao mọi người có thể biết tính cách của em như thế nào chứ trừ khi là gặp ngoài đời thực . Mà gặp ngoài đời thực cũng không hề biết được do sự kết nối ở thời nay dường như không còn được sâu sắc như xưa nữa . Có quá nhiều thứ gây mất tập trung , sao nhãng . Sự kết nối với bản thể và con người xung quay đã bị lu mờ đi phần nào bởi công nghệ . Giao tiếp trên môi trường mạng đã trở thành một thứ không thể thiếu đối với cuộc sống . Mọi người có thể fake thông tin của mình một cách rất dễ dàng và nhanh chóng chỉ với một vài thao tác . Có thể mọi người lên mạng tung hô , chửi bới , la ó gì đó nhưng ở ngoài đời chưa chắc đã dám làm vậy mà chỉ là một "cô" , "cậu" nhút nhát không dám nói lên suy nghĩ thực , quan điểm của mình . Có thể em ở trên này hỏi nhiều nhưng ở ngoài đời chắc gì em đã dám hỏi nhiều như vậy . Có thể thấy môi trường này đã góp phần như một chiếc kiên bảo vệ mình khỏi những thứ xung quanh . Do có "chiếc kiên" đó nên mình đã dũng cảm hơn trước mọi thứ . Con gái thì không sợ bị mọi người đời nhận xét hay chế giễu , con trai thì thỏa sức thể hiện bản thân (Facebook là một thứ như vậy). Không phủ nhận và cũng không bác bỏ thứ gì cả vì em cũng đang phụ thuộc vào nó . Em lợi dụng nó để hỏi bài , để kết nối với mọi người trên này mà em tin đây cũng là mục đích thực sự của facebook nhưng chỉ tại mỗi cá nhân góp phần làm nên sự biến chất của nó mà thôi ^^ .
Mục đích em viết bài trên không phải em đang biện minh cho sự "Thiếu văn hóa" của mình nhưng đích thực môi trường mạng nó là như vậy , nó rất khác đời thường thế nên em vẫn sẽ gữi cách xưng hô như vậy đối với mọi người trên này , đối với môi trường mạng chỉ vì lý do thuận tiện . Mong các anh thông cảm giúp em . Em đang lợi dụng mọi người để phát triển bản thân đấy :< . Nhưng sự lợi dụng này là hai mặt . GPE tại sao có thể tồn tại được đến bây giờ ? Làm sao để duy trì nó ? Liệu có ai không muốn sự có lợi cho bản thân không ?
Em không ám chỉ tất cả tại vì hiện tại em cũng đang thấy trên này có người như vậy . Họ dành tất cả cái tâm của mình để đi giúp người khác. Họ làm vậy rất nhiều năm mà không đòi hỏi bất cứ thứ gì . Nói không quá thì những người đó đã góp phần làm nên GPE ngày hôm nay . Em thật sự biết ơn họ .Cảm ơn mọi người rất nhiều . Em có thể thất sự tiến bộ rõ rệt từ khi lên GPE . Thật hạnh phúc!
 
Upvote 0
Oh bảo sao bác ấy có kiến thức thật sâu sắc như vậy!!. Em cũng đoán được một phần mà ^^ . Mọi người trên này ai cũng chững tuổi hết rồi^^ .
Thật là em cũng không biết xưng hô làm sao nữa . Với mục đích em lên đây là để lĩnh hội kiến thức nên là em cũng sẽ dùng cách xưng hô nào để làm sao tiện nhất cho công cuộc lĩnh hội tri thức này . Không phải là em không tôn trọng những người lớn tuổi mà mình cũng đang giao tiếp qua môi trường trung gian đó là môi trường mạng .
Giao tiếp qua môi trường mạng nên không thể biết tuổi, vì thế anh, chị, em đã là có văn hóa rồi. Nhưng một khi đã biết tuổi thì lại phải cẩn thận. Khi đã biết người ta thuộc hàng cha chú thì không thể anh em được nữa vì như thế người Việt Nam cho là hỗn. Có thể chú bác. Nhưng hoàn toàn có thể dùng tôi bạn. Đi nước ngoài không biết nói tiếng của người bản xứ mà phải nói bằng tiếng Việt để người ta dịch thì cũng tôi ... bạn / các bạn, dù trong số những người nghe có người đáng tuổi con, có người đáng tuổi chú bác của mình. Tôi bạn hoàn toàn có văn hóa. Với tôi bạn cứ "tôi bạn" là được. Tôi cũng không thích chú bác lắm.
 
Upvote 0
Web KT
Back
Top Bottom