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:
Ở 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:
Ở ví dụ 2 này thì Sub nó nhảy đến Line1: và chạy bình thường
Ví dụ 3:
ở 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
ở 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
- <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.
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
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
Ở 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
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ý" ))
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
Đó 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,. . . .
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
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ế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.
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?
^^ 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 .
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"
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
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!
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 .