Chia sẻ một vài kinh nghiệm học VBA (1 người xem)

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

comet_1701

Thành viên tiêu biểu
Tham gia
24/5/14
Bài viết
632
Được thích
459
Em không biết bài viết này cho vào mục nào cho phù hợp trong diễn đàn. Mong các anh chị admin cho phép:
Hiện nay em thấy nhu cầu học VBA trên GPE là rất lớn. Nhưng em thấy việc học VBA trên GPE chưa phát huy được hết tác dụng với một số lý do khách quan sau đây:
Thứ nhất, về phía các anh chị đã có nhiều kinh nghiệm trong VBA:
- Các anh chị thường hay viết tắt câu lệnh. Điều này là dễ hiểu là vì do thói quen, mỗi người có phong cách viết khác nhau. Hơn nữa không phải ai trong giờ làm việc cũng có thể viết code nên viết tắt cũng là điều bình thường. Em có một số ví dụ như sau:

Viết đầy đủ:
Mã:
Range("A1").SpecialCells(xlCellTypeBlanks).Select
Viết tắt:
Mã:
 Range("A1").SpecialCells(4).Select

Viết đầy đủ:
Mã:
Range(“A65000”).end(xlup).offset(1,0).pastespecial
Viết tắt:
Mã:
    Range(“A65000”).end(3).offset(1,0).pastespecial

Viết đầy đủ:
Mã:
 Rng.Find(What:=”111*”, LookIn:=xlValues, LookAt:=xlWhole)
Viết tắt:
Mã:
  Rng.Find(”111*”, xlValues, xlWhole)
Thứ hai, về phía các bạn mới học VBA như em:
Mình cũng mới học được khoảng 2-3 tháng VBA nhưng mình cứ mạnh dạn chia sẻ kinh nghiệm của mình:
- Học cách khai báo biến ( vào diễn đàn gõ từ khóa Khai báo biến) thì mình dễ hiểu hơn khi anh chị viết tắt
- Học kỹ thuật Debug, cửa số Immediate (Ctrl+G). Tim từ khóa của Tác giả Kyo và Handung107
- Cửa sổ View/Local Windows
- Tập viết rất rất nhiều, vì nhiều code nhìn rất đơn giản nhưng không tập viết thì cũng rất khó
- Tất nhiên có điều kiện nên học bài bản có thầy giáo hướng dẫn
Em viết bài này cũng chỉ mong GPE ngày càng phát triển, có nhiều thành viên và là nơi để anh em chia sẻ, giao lưu, học hỏi kinh nghiệm.
Năm mới cũng đến rất gần, Comet_1701 chúc toàn thể anh chị em của GPE sức khỏe, hạnh phúc, thành công.
Trân trọng!
 
Chào bạn,
Mình thấy trân trọng chia sẻ của bạn, ít nhất đối với người mới hoc VBA sẽ có một số điều thú vị có thể học tập được.

Trong ví của bạn thì mình khuyên là không nên làm tắt bằng việc thay các hằng số bằng giá trị, ví dụ xlup thành 3. Chuyện như vầy không tiết kiệm thời gian mà ngược lại sẽ tốn thời gian nếu sau này trí nhớ có hạn đọc lại mấy cái hằng số này mệt lắm. Cứ viết tên nó ra, chuyện giá trị nó như thế nào để Excel lo, còn trong quá trình viết, công cụ gợi ý đoán từ của VB có thể giúp cải thiện tốt độ viết code lên đấy.

Mong nhận thêm chia sẻ của bạn,

Thân
OverAC
 
Upvote 0
Chào bạn,
Mình thấy trân trọng chia sẻ của bạn, ít nhất đối với người mới hoc VBA sẽ có một số điều thú vị có thể học tập được.

Trong ví của bạn thì mình khuyên là không nên làm tắt bằng việc thay các hằng số bằng giá trị, ví dụ xlup thành 3. Chuyện như vầy không tiết kiệm thời gian mà ngược lại sẽ tốn thời gian nếu sau này trí nhớ có hạn đọc lại mấy cái hằng số này mệt lắm. Cứ viết tên nó ra, chuyện giá trị nó như thế nào để Excel lo, còn trong quá trình viết, công cụ gợi ý đoán từ của VB có thể giúp cải thiện tốt độ viết code lên đấy.

Mong nhận thêm chia sẻ của bạn,

Thân
OverAC
Em cảm ơn anh, lúc tháng đầu em học cứ hoa hết cả mắt vì mỗi anh chị có một cách viết và hay viết tắt nữa--=0
 
Upvote 0
Em cảm ơn anh, lúc tháng đầu em học cứ hoa hết cả mắt vì mỗi anh chị có một cách viết và hay viết tắt nữa--=0

Đúng là mỗi người có phong cách viết code khác nhau. Riêng chuyện viết tắt thì cũng có lắm điều phải suy ngẫm:
- Có người viết tắt cho nhanh
- Có người viết tắt để cố tình tạo ra sự "bí hiểm"
Cá nhân tôi, nếu có viết tắt là có ý đồ riêng:
1> Muốn ứng dụng của mình chạy được trong môi trường ngoài Excel. Ví dụ xlUp thì chỉ có Excel mới hiểu nhưng con số 3 thì thằng ứng dụng nào cũng đều hiểu đó là số ba chứ hổng phải số một, số hai hay số gì khác
2> Muốn các hằng số này tham gia vào quá trình tùy biến code. Ví dụ:
Mã:
Private Sub CheckBox1_Click()
  With Range("A1:A10")
    .Sort .Cells(1, 1), [COLOR=#ff0000]CheckBox1.Value + 2[/COLOR], , , , , , xlYes
  End With
End Sub
Chỗ màu đỏ lý ra phải là xlAscending (=1) hoặc xlDescending (=2) nhưng do tôi muốn khi check vào CheckBox thì đổi chiều sort nên buộc phải biến chúng thành những con số. Trường hợp này nếu bạn không nhớ nỗi giá trị của hằng số, chẳng phải sẽ mệt cho bạn lắm sao? Dù viết code được nhưng sẽ dài dòng thế này:
Mã:
Private Sub CheckBox1_Click()
  With Range("A1:A10")
    If CheckBox1.Value = True Then
      .Sort .Cells(1, 1), [COLOR=#ff0000]xlAscending[/COLOR], , , , , , xlYes
    Else
      .Sort .Cells(1, 1), [COLOR=#ff0000]xlDescending[/COLOR], , , , , , xlYes
    End If
  End With
End Sub
-----------------------------
Kết luận: Đã học lập trình thì... thứ gì cũng phải biết. Ẹc... Ẹc...
 
Upvote 0
Em cảm ơn anh, lúc tháng đầu em học cứ hoa hết cả mắt vì mỗi anh chị có một cách viết và hay viết tắt nữa--=0
Các thành viên gạo cội hay viết tắt kiểu [], lâu lâu đọc sách của Kyo (Cuốn cải thiện và tăng tốc) thì mới biết đó là phương thức Evaluate !$@!!
 
Upvote 0
Đối với tôi, viết 3 thay vì xlUp không phải là viết tắt. Cái đáng lẽ bạn nên hỏi là tại sao xlUp có trị là -4162 lại tương đương với 3? Nhưng tôi tránh không tranh luận từ ngữ tiếng Việt để gây lạc đề.

Trường hợp nếu bạn nào đó hỏi dùng cái nào tốt hơn thì tôi trả lời là tuỳ trường hợp. Nếu bạn không có option explicit thì dùng 3 tốt hơn. Nhưng nếu bạn viết code cho môi trường chung thì nên dùng xlUp. Trường hợp điển hình "môi trường chung" là bạn có một project lớn, nhiều người code, mỗi người viết một vài modules. Theo tôi biết thì hầu hết các quản lý đồ án mà thấy loại code 3 thay vì xlUp thì họ sẽ bắt bạn viết lại.

Về phần tham số hàm Find, nó cần sự giải thích cặn kẽ hơn. Ngôn ngữ VBA có mặc định cách truyền tham số theo thứ tự đúng như khai báo. Tức là lúc gọi hàm thì tham số truyền đầu tiên ứng với tham được hàm khai báo đầu tiên, tham truyền kế đó ứng với tham khai báo thứ hai, và cứ tiếp tục.

Tuy nhiên, VBA cũng cho phép bạn đảo lộn thứ tự truyền với điều kiện là bạn nêu rõ tên của tham để compiler còn biết đuờng mà nối. Cú pháp nêu rõ tên tham là tenTham:=triDuocTruyen

vì vậy, nếu hàm chỉ có đôi ba tham, và bạn rất quen thuộc với nó thì viết kiểu "tắt" cũng được. Nhưng nếu hàm có nhiều tham và bạn ít dùng thì nên viết rõ tham ra cho nó khỏi nhầm lẫn. Hàm có cỡ 5,6 tham mà bạn nhầm nạp thiếu tham thứ 3 là 4,5,6 đều sai hết.
 
Upvote 0
Thầy ndu và anh Cá ngừ nói chuẩn ah. Em viết bài này cũng mong các anh chị có nhiều kinh nghiệm cùng phản hồi để chia sẻ kinh nghiệm với các anh chị em để các bạn mới có thể học hỏi thêm
 
Upvote 0
Đối với tôi, viết 3 thay vì xlUp không phải là viết tắt. Cái đáng lẽ bạn nên hỏi là tại sao xlUp có trị là -4162 lại tương đương với 3? Nhưng tôi tránh không tranh luận từ ngữ tiếng Việt để gây lạc đề.

Trường hợp nếu bạn nào đó hỏi dùng cái nào tốt hơn thì tôi trả lời là tuỳ trường hợp. Nếu bạn không có option explicit thì dùng 3 tốt hơn. Nhưng nếu bạn viết code cho môi trường chung thì nên dùng xlUp. Trường hợp điển hình "môi trường chung" là bạn có một project lớn, nhiều người code, mỗi người viết một vài modules. Theo tôi biết thì hầu hết các quản lý đồ án mà thấy loại code 3 thay vì xlUp thì họ sẽ bắt bạn viết lại.

Về phần tham số hàm Find, nó cần sự giải thích cặn kẽ hơn. Ngôn ngữ VBA có mặc định cách truyền tham số theo thứ tự đúng như khai báo. Tức là lúc gọi hàm thì tham số truyền đầu tiên ứng với tham được hàm khai báo đầu tiên, tham truyền kế đó ứng với tham khai báo thứ hai, và cứ tiếp tục.

Tuy nhiên, VBA cũng cho phép bạn đảo lộn thứ tự truyền với điều kiện là bạn nêu rõ tên của tham để compiler còn biết đuờng mà nối. Cú pháp nêu rõ tên tham là tenTham:=triDuocTruyen

vì vậy, nếu hàm chỉ có đôi ba tham, và bạn rất quen thuộc với nó thì viết kiểu "tắt" cũng được. Nhưng nếu hàm có nhiều tham và bạn ít dùng thì nên viết rõ tham ra cho nó khỏi nhầm lẫn. Hàm có cỡ 5,6 tham mà bạn nhầm nạp thiếu tham thứ 3 là 4,5,6 đều sai hết.
Kiến thức của anh rất rộng ah vì em theo dỗi các bài viết của anh. Nếu anh rỗi vào chia sẻ nhiều hơn cho em và các anh em khác học hỏi anh nhé
 
Upvote 0
Các thành viên gạo cội hay viết tắt kiểu [], lâu lâu đọc sách của Kyo (Cuốn cải thiện và tăng tốc) thì mới biết đó là phương thức Evaluate !$@!!

Bạn cần nói rõ hơn là "các thành viên gạo cội" ở đây có khuynh hướng dùng [] cho range.

[] còn có một vài công dụng khác nhưng ở đây bà con ít dùng đến.

Nói cho tổng quát hơn thì dân "gạo cội" ở đây có khuynh hướng dùng hằng đặc thù của họ ( lệnh evaluate [] chỉ dùng được cho hằng ).
 
Upvote 0
Bạn cần nói rõ hơn là "các thành viên gạo cội" ở đây có khuynh hướng dùng [] cho range.

[] còn có một vài công dụng khác nhưng ở đây bà con ít dùng đến.

Nói cho tổng quát hơn thì dân "gạo cội" ở đây có khuynh hướng dùng hằng đặc thù của họ ( lệnh evaluate [] chỉ dùng được cho hằng ).
Anh chia sẻ chỗ xanh xanh đi anh?
 
Upvote 0
Điển hình là cách lập mảng:

a = [ { 1, 2, 3, 4, 5 } ]
a là một mảng 5 phần tử.

(thử tìm hiểu xem viết như thế khác với dùng hàm Array(...) ra sao?)

Em xin trả lời câu hỏi của bác trong tầm kiến thức của em:

Dấu [] trong VBA có thể coi là shorthand ( cách viết tắt) của hàm EVALUATE. Lợi ích của cách viết [] là ngắn gọn hơn. Lợi ích của cách viết EVALUATE là chúng ta có thể đưa biến String vào trong hàm EVALUATE. Tuỳ chúng ta đưa cho evaluate cái gì, evaluate sẽ trả lại cho chúng ta 1 object hoặc 1 giá trị trong excel [1]. Có thể thử qua 1 vài ví dụ sau:

Mã:
Sub test() 
     
    Dim arr() As Variant 
     
     'lập mảng 1 chiều
    arr= [{1,2,3}] 
    Range("A1").Resize(1, UBound(arr)).Value = arr
     
     'lập mảng 2 chiều
    arr= [{1,2,"a";3,4,"b";5,6,"c"}] 
    Range("A5").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
     
     ' từ string sang mảng
    y = "{1,2;3,4;5,6}" 
    arr= Evaluate(y) ' trường hợp này phải dùng evaluate vì [] không chạy
    Range("A15").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
     
End Sub

Ngoài ra còn có thể viết công thức vào trong [] để thực hiện:

Mã:
[COUNTIFS(A1:A100000,"x",B1:B100000,"y")]

hoặc (chú ý dấu ngoặc kép)

Mã:
Evaluate("COUNTIFS(A1:A100000,"x",B1:B100000,"y")")


Và có thể thây qua các ví dụ trên thì sử dụng [] thật là tiện lợi.
==================================================================
Sau đây là 1 số chia sẻ về việc học VBA cho người mới bắt đầu: viết code đẹp, rõ ràng, dễ hiểu

0. Mở VBA Editor (VBE) với phím tắt trên ban phím : ALT + F11

1. Viết code đẹp tốt hơn viết code xấu: Viết code "thò ra thụt vào" (indentation) đúng khoảng cách. VD
Mã:
' không tốt
for i = 1 to 10 
Debug.print i
next i

' tốt hơn
for i = 1 to 10
    debug.print i
next i
2. Viết rõ ràng tốt hơn là viết ngầm định: option explicit ở đầu module

Mã:
option explicit
sub xyz()
...
end sub


3. Đặt tên biến dễ hiểu và theo quy luật.

Mã:
' không tốt
Dim [B][COLOR=#0000ff]a[/COLOR][/B] as long
' tốt hơn 
Dim [B][COLOR=#0000ff]wordCount [/COLOR][/B]as long   ' Camel case
' hoặc là
Dim [B][COLOR=#0000ff]word_count[/COLOR][/B] as long ' snake case
' tốt nhất
dim [COLOR=#0000ff][B]lngWordCount[/B][/COLOR] as long
' nhìn vào biến ta biết được kiểu của biến là long, chức năng của biến, ...

4. Chú ý chúng ta đang đếm từ 0 hay 1 bằng cách sử dụng option base 1 * , chúng ta sẽ đếm từ 1

5. Sử dụng method UBOUND hoặc LBOUND khi có thể


Mã:
' bình thường
dim arr(10) as Integer, i as Integer
for i = 1 to 10
    debug.print arr(i)
next i
' sử dụng ubound, lbound:

for i = [B]lbound[/B](arr) to [B]ubound[/B](arr)
    debug.print arr(i)
next i

6. Không viết nhiều code trên cùng 1 dòng vì khó nhìn, ngắt xuống dòng bằng dấu _

Mã:
Cells.Find(What:="Cat", After:=ActiveCell, LookIn:=xlValues, LookAt:= [COLOR=#ff0000][B]_[/B][/COLOR]

        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False [COLOR=#ff0000][B]_[/B][/COLOR]

        , SearchFormat:=False).Activate


7. Luôn khai báo biến trước khi sử dụng cùng với kiểu dữ liệu của biến, không lạm dùng kiểu dữ liệu Variant
8. Không khai báo biến với %,&,!,#,$,@.
Lý do:
http://www.fmsinc.com/tpapers/vbacode/
http://stackoverflow.com/questions/...entage-symbol-mean-as-part-of-a-variable-name
Mã:
          '%                 Integer
          '&                 Long
          '!                 Single
          '#                 Double
          '$                 String
          '@                 Currency

' không khai báo thế này:
dim someVariable$, someOtherVariable!, somethingElse@

' khai báo thế này:
dim someVariable as String
dim someOtherVariable as Single
dim somethingElse as Currency

9. Google is your friend

[còn tiếp ... ]

[1]: https://msdn.microsoft.com/en-us/library/office/aa223886(v=office.11).aspx
 
Lần chỉnh sửa cuối:
Upvote 0
Em xin trả lời câu hỏi của bác trong tầm kiến thức của em:

Dấu [] trong VBA có thể coi là shorthand ( cách viết tắt) của hàm EVALUATE. Lợi ích của cách viết [] là ngắn gọn hơn. Lợi ích của cách viết EVALUATE là chúng ta có thể đưa biến String vào trong hàm EVALUATE. Tuỳ chúng ta đưa cho evaluate cái gì, evaluate sẽ trả lại cho chúng ta 1 object hoặc 1 giá trị trong excel [1]. Có thể thử qua 1 vài ví dụ sau:

Mã:
Sub test() 
     
    Dim arr() As Variant 
     
     'lập mảng 1 chiều
    arr= [{1,2,3}] 
    Range("A1").Resize(1, UBound(arr)).Value = arr
     
     'lập mảng 2 chiều
    arr= [{1,2,"a";3,4,"b";5,6,"c"}] 
    Range("A5").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
     
     ' từ string sang mảng
    y = "{1,2;3,4;5,6}" 
    arr= Evaluate(y) ' trường hợp này phải dùng evaluate vì [] không chạy
    Range("A15").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
     
End Sub

Ngoài ra còn có thể viết công thức vào trong [] để thực hiện:

Mã:
[COUNTIFS(A1:A100000,"x",B1:B100000,"y")]

hoặc (chú ý dấu ngoặc kép)

Mã:
Evaluate("COUNTIFS(A1:A100000,"x",B1:B100000,"y")")


Và có thể thây qua các ví dụ trên thì sử dụng [] thật là tiện lợi.
==================================================================
Sau đây là 1 số chia sẻ về việc học VBA cho người mới bắt đầu: viết code đẹp, rõ ràng, dễ hiểu

0. Mở VBA Editor (VBE) với phím tắt trên ban phím : ALT + F11

1. Viết code đẹp tốt hơn viết code xấu: Viết code "thò ra thụt vào" (indentation) đúng khoảng cách. VD
Mã:
' không tốt
for i = 1 to 10 
Debug.print i
next i

' tốt hơn
for i = 1 to 10
    debug.print i
next i
2. Viết rõ ràng tốt hơn là viết ngầm định: option explicit ở đầu module

Mã:
option explicit
sub xyz()
...
end sub


3. Đặt tên biến dễ hiểu và theo quy luật.

Mã:
' không tốt
Dim [B][COLOR=#0000ff]a[/COLOR][/B] as long
' tốt hơn 
Dim [B][COLOR=#0000ff]wordCount [/COLOR][/B]as long   ' Camel case
' hoặc là
Dim [B][COLOR=#0000ff]word_count[/COLOR][/B] as long ' snake case
' tốt nhất
dim [COLOR=#0000ff][B]lngWordCount[/B][/COLOR] as long
' nhìn vào biến ta biết được kiểu của biến là long, chức năng của biến, ...

4. Chú ý chúng ta đang đếm từ 0 hay 1 bằng cách sử dụng option base 1 * , chúng ta sẽ đếm từ 1

5. Sử dụng method UBOUND hoặc LBOUND khi có thể


Mã:
' bình thường
dim arr(10) as Integer, i as Integer
for i = 1 to 10
    debug.print arr(i)
next i
' sử dụng ubound, lbound:

for i = [B]lbound[/B](arr) to [B]ubound[/B](arr)
    debug.print arr(i)
next i

6. Không viết nhiều code trên cùng 1 dòng vì khó nhìn, ngắt xuống dòng bằng dấu _

Mã:
Cells.Find(What:="Cat", After:=ActiveCell, LookIn:=xlValues, LookAt:= [COLOR=#ff0000][B]_[/B][/COLOR]

        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False [COLOR=#ff0000][B]_[/B][/COLOR]

        , SearchFormat:=False).Activate


7. Luôn khai báo biến trước khi sử dụng cùng với kiểu dữ liệu của biến, không lạm dùng kiểu dữ liệu Variant
8. Không khai báo biến với %,&,!,#,$,@. Lý do: http://support2.microsoft.com/default.aspx?scid=kb;en-us;191713
Mã:
          '%                 Integer
          '&                 Long
          '!                 Single
          '#                 Double
          '$                 String
          '@                 Currency

' không khai báo thế này:
dim someVariable$, someOtherVariable!, somethingElse@

' khai báo thế này:
dim someVariable as String
dim someOtherVariable as Single
dim somethingElse as Currency

9. Google is your friend

[còn tiếp ... ]

[1]: https://msdn.microsoft.com/en-us/library/office/aa223886(v=office.11).aspx
Cảm ơn bạn và phuyen89 nhé. Các bạn và anh chị em khác nhiệt tình tham gia nhé, vừa để giao lưu học hỏi thêm kinh nghiệm của nhau, vừa giúp những bạn đang cần học VBA.
 
Upvote 0
Em xin trả lời câu hỏi của bác trong tầm kiến thức của em:

Dấu [] trong VBA có thể coi là shorthand ( cách viết tắt) của hàm EVALUATE. Lợi ích của cách viết [] là ngắn gọn hơn. Lợi ích của cách viết EVALUATE là chúng ta có thể đưa biến String vào trong hàm EVALUATE. Tuỳ chúng ta đưa cho evaluate cái gì, evaluate sẽ trả lại cho chúng ta 1 object hoặc 1 giá trị trong excel [1]. Có thể thử qua 1 vài ví dụ sau:

Mã:
Sub test() 
     
    Dim arr() As Variant 
     
     'lập mảng 1 chiều
    arr= [{1,2,3}] 
    Range("A1").Resize(1, UBound(arr)).Value = arr
     
     'lập mảng 2 chiều
    arr= [{1,2,"a";3,4,"b";5,6,"c"}] 
    Range("A5").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
     
     ' từ string sang mảng
    y = "{1,2;3,4;5,6}" 
    arr= Evaluate(y) ' trường hợp này phải dùng evaluate vì [] không chạy
    Range("A15").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
     
End Sub
...

Nhiều quá, nhưng vẫn thiếu phần quan trọng nhất:

[ { 1, 2, 3 } ] khác với Array( 1, 2, 3 ) ra sao?
 
Upvote 0
Phần 8. của bác kuldokk mình thấy bài viết của MS không phải lý do, trong bài đó nói 2 cách viết là tương đương.
 
Upvote 0
Phần 8. của bác kuldokk mình thấy bài viết của MS không phải lý do, trong bài đó nói 2 cách viết là tương đương.
chính xác là như vậy mình cũng vừa đọc xong chắc tác giả lộn bài

Bảng dưới đây cho thấy các nhân vật khai báo kiểu và các kiểu dữ liệu tương ứng.
Loại Tuyên Loại vật liệu
-------------------------- ---------
<WWBLOCKQUOTE>
% Integer
& Long
! Độc thân
# Đúp
$ String
@ Tệ


Ngay cả khi sử dụng các ký tự khai báo kiểu, bạn vẫn cần phải khai báo các biến của bạn khi bạn có Option Explicit ở đầu của Module. Sử dụng Option Explicit được khuyến cáo để ngăn ngừa các vấn đề do tên biến sai chính tả. Khi "Yêu cầu Tuyên bố Biến" được chọn trong Tab Editor của hộp thoại Options từ Tools Menu, Option Explicit được thêm mới module tự động. Nếu bạn sử dụng Option Explicit, nhưng bạn không khai báo các biến của bạn, bạn sẽ nhận được thông báo lỗi sau tại thời gian chạy:Biên dịch lỗi
Variable Không định nghĩa



Để ngăn ngừa lỗi này xảy ra, bạn có thể loại bỏ một cách rõ ràng hoặc Option Explicit khai báo các biến của bạn. Sử dụng ký tự khai báo kiểu cho phép bạn rút ngắn các báo cáo này. Ví dụ, bạn có thể sử dụng này: Dim myVar $


thay vì điều này: Dim myVar As String
 
Lần chỉnh sửa cuối:
Upvote 0
Nhiều quá, nhưng vẫn thiếu phần quan trọng nhất:

[ { 1, 2, 3 } ] khác với Array( 1, 2, 3 ) ra sao?

Theo quan sát của em thì:

Nếu xét VD:

Mã:
Option Base 0
Sub test()
    Dim arr As Variant
    Dim arr1 As Variant
    arr = Array(1, 2, 3)
    arr1 = Evaluate("{1,2,3}")
'   arr1 = [{1,2,3}]
    
    Debug.Print TypeName(arr) = TypeName(arr1)
End Sub

Cuối cùng thì arr và arr1 đều thuộc kiểu array.

#1: Với Evaluate thì lbound(arr1) luôn = 1 (kể cả để option base 0 hay 1) . Array ( 1, 2, 3 ) thì có lbound phụ thuộc vào setting của option base.
#2: Với Evaluate hay [] : không evaluate tham số quá 256 kí tự nên ta không thể khai báo biến arr1 = [1,2,3,...,1,2,3] với quá nhiều phần tử. Với Array thì hoàn toàn có thể

Mong trả lời thêm từ bác :)
 
Upvote 0
Google translate thì bạn phải sửa chứ. Kiểu single mà dịch thành độc thân thì bostay.com
 
Upvote 0
chính xác là như vậy mình cũng vừa đọc xong chắc tác giả lộn bài

Bảng dưới đây cho thấy các nhân vật khai báo kiểu và các kiểu dữ liệu tương ứng.
Loại Tuyên Loại vật liệu
-------------------------- ---------
<WWBLOCKQUOTE>
% Integer
& Long
! Độc thân
# Đúp
$ String
@ Tệ


Ngay cả khi sử dụng các ký tự khai báo kiểu, bạn vẫn cần phải khai báo các biến của bạn khi bạn có Option Explicit ở đầu của Module. Sử dụng Option Explicit được khuyến cáo để ngăn ngừa các vấn đề do tên biến sai chính tả. Khi "Yêu cầu Tuyên bố Biến" được chọn trong Tab Editor của hộp thoại Options từ Tools Menu, Option Explicit được thêm mới module tự động. Nếu bạn sử dụng Option Explicit, nhưng bạn không khai báo các biến của bạn, bạn sẽ nhận được thông báo lỗi sau tại thời gian chạy:Biên dịch lỗi
Variable Không định nghĩa



Để ngăn ngừa lỗi này xảy ra, bạn có thể loại bỏ một cách rõ ràng hoặc Option Explicit khai báo các biến của bạn. Sử dụng ký tự khai báo kiểu cho phép bạn rút ngắn các báo cáo này. Ví dụ, bạn có thể sử dụng này: Dim myVar $


thay vì điều này: Dim myVar As String

Bạn copy hoàn toàn đúng, trên trang microsoft nói là như vậy. Mình nhầm link đó với 1 link khác (Mình đã update lại link trong bài viết). Cách viết biến với các kí tự đó, theo như mình đọc đó là cách cũ, và chỉ tồn tại vì lý do backward-compability ( tương thích ngược). Với người mới học viết rõ ràng ra không phải vừa tốt hơn vừa dễ hiểu hơn sao?

Dim myVar as String
 
Upvote 0
Evaluate là hàm bảng tính. Vì vậy:
array kết quả của nó có base 1.
nó có giới hạn số tham.
nó không hiểu bất cứ code nào của vba. Tham của nó phải là hằng hiển hiện (literals), ngay cả hằng const nó cũng không nhận.
 
Upvote 0
chính xác là như vậy mình cũng vừa đọc xong chắc tác giả lộn bài

Bảng dưới đây cho thấy các nhân vật khai báo kiểu và các kiểu dữ liệu tương ứng.
Loại Tuyên Loại vật liệu
-------------------------- ---------
<WWBLOCKQUOTE>
% Integer
& Long
! Độc thân
# Đúp
$ String
@ Tệ


Ngay cả khi sử dụng các ký tự khai báo kiểu, bạn vẫn cần phải khai báo các biến của bạn khi bạn có Option Explicit ở đầu của Module. Sử dụng Option Explicit được khuyến cáo để ngăn ngừa các vấn đề do tên biến sai chính tả. Khi "Yêu cầu Tuyên bố Biến" được chọn trong Tab Editor của hộp thoại Options từ Tools Menu, Option Explicit được thêm mới module tự động. Nếu bạn sử dụng Option Explicit, nhưng bạn không khai báo các biến của bạn, bạn sẽ nhận được thông báo lỗi sau tại thời gian chạy:Biên dịch lỗi
Variable Không định nghĩa



Để ngăn ngừa lỗi này xảy ra, bạn có thể loại bỏ một cách rõ ràng hoặc Option Explicit khai báo các biến của bạn. Sử dụng ký tự khai báo kiểu cho phép bạn rút ngắn các báo cáo này. Ví dụ, bạn có thể sử dụng này: Dim myVar $


thay vì điều này: Dim myVar As String

Bạn copy hoàn toàn đúng, trên trang microsoft nói là như vậy. Mình nhầm link đó với 1 link khác (Mình đã update lại link trong bài viết). Cách viết biến với các kí tự đó, theo như mình đọc đó là cách cũ (của BASIC, DOS-BASIC), và chỉ tồn tại vì lý do backward-compability ( tương thích ngược). Với người mới học viết rõ ràng ra không phải vừa tốt hơn vừa dễ hiểu hơn sao?

Dim myVar as String
 
Upvote 0
Bạn copy hoàn toàn đúng, trên trang microsoft nói là như vậy. Mình nhầm link đó với 1 link khác (Mình đã update lại link trong bài viết). Cách viết biến với các kí tự đó, theo như mình đọc đó là cách cũ (của BASIC, DOS-BASIC), và chỉ tồn tại vì lý do backward-compability ( tương thích ngược). Với người mới học viết rõ ràng ra không phải vừa tốt hơn vừa dễ hiểu hơn sao?

Dim myVar as String
Mình thì cứ xúc tích ngắn gọn , dễ nhớ và hiệu quả là mình chơi
VD: End(1) _ Bên trái màn hình ;End(2) _ Bên Phải màn hình ;End(3) _ Bên trên màn hình ;End(4) _ Bên dưới màn hình
học kiểu lúa như mình vậy nhưng dễ nhớ khỏi phải End(xlUp) ko nhớ nổi... tiếng việt mình viết còn sai chính tả nữa là tiếng Anh
 
Upvote 0
Evaluate là hàm bảng tính. Vì vậy:
array kết quả của nó có base 1.
nó có giới hạn số tham.
nó không hiểu bất cứ code nào của vba. Tham của nó phải là hằng hiển hiện (literals), ngay cả hằng const nó cũng không nhận.

OK, cảm ơn bác, em hiểu rồi.

Để nói lại cho các bạn đọc bài này hiểu thêm thì bacs VetMini nói Evaluate là hàm bảng tính bởi vì ta có thể gọi hàm này như sau:

Application.Evaluate()

hay

Worksheets(1).Evaluate() / Worksheet.Evaluate()

và tham số của evaluate không thể quá được 255 kí tự?

có phải không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thì nghĩ đúng là các ký tự định kiểu một phần dùng để tương thích ngược nhưng cũng để giống với C. Ngôn ngữ C dùng chủ yếu là ký hiệu. VB. NET và C# thông thường có thể chuyển đổi tương đương. Tóm lại nếu MS bảo đây là kiểu cũ không hỗ trợ (ví dụ các hàm pointer) thì ta mới cần cẩn thận.
 
Upvote 0
Mình thì cứ xúc tích ngắn gọn , dễ nhớ và hiệu quả là mình chơi
VD: End(1) _ Bên trái màn hình ;End(2) _ Bên Phải màn hình ;End(3) _ Bên trên màn hình ;End(4) _ Bên dưới màn hình
học kiểu lúa như mình vậy nhưng dễ nhớ khỏi phải End(xlUp) ko nhớ nổi... tiếng việt mình viết còn sai chính tả nữa là tiếng Anh

Điều đó đúng cho từng cá nhân và trong trường hợp này là đúng cho bạn. Cho người mới bắt đầu thì có thể là không nên. Sau khi ở trình độ cao hơn rồi thì tất nhiên mỗi người tuỳ vào mục đích của mình để chọn kiểu viết cho phù hợp. Code mà mỗi mình đọc thì không sao, nhưng cho người khác đọc, người mới học đọc thì nên viết rõ ràng, dễ hiểu :)
 
Upvote 0
Mình thì cứ xúc tích ngắn gọn , dễ nhớ và hiệu quả là mình chơi
VD: End(1) _ Bên trái màn hình ;End(2) _ Bên Phải màn hình ;End(3) _ Bên trên màn hình ;End(4) _ Bên dưới màn hình
học kiểu lúa như mình vậy nhưng dễ nhớ khỏi phải End(xlUp) ko nhớ nổi... tiếng việt mình viết còn sai chính tả nữa là tiếng Anh
Cái vụ 1,2 ,3,4 này của Mạnh , các bạn mới học rút được nhiêu kinh nghiệm lắm đó, vì mọi ngưới hay dùng vậy, ai mới học hiểu chết liền/-*+/
 
Upvote 0
Mình thì nghĩ đúng là các ký tự định kiểu một phần dùng để tương thích ngược nhưng cũng để giống với C. Ngôn ngữ C dùng chủ yếu là ký hiệu. VB. NET và C# thông thường có thể chuyển đổi tương đương. Tóm lại nếu MS bảo đây là kiểu cũ không hỗ trợ (ví dụ các hàm pointer) thì ta mới cần cẩn thận.

BASIC có trước C xa lắm. Nói "để cho giống" là sai.
 
Upvote 0
Đúng là Basic có trước C. Ý em muốn nói ở đây là MS sẽ không bỏ các ký tự xác định kiểu, một phần vì để những lập trình viên đã quen C có thể dễ dàng dùng VB.

Không đúng lắm, bởi vì C cũng không dùng ký tự xác định kiểu. Các kiểu căn bản của nó viết rõ ra là int, float, ... đàng hoàng. Chỉ riêng con trỏ thì dùng ký hiệu *. Đó là vì nó có lý do: kiểu này luôn luôn đi kèm với kiểu mà nó trỏ vào, vì vậy tác giả muốn tránh hai từ đi kề nhau -> giả sử nếu đặt kiểu con trỏ là ptr thì con trỏ integer là int ptr (từ int và tử ptr); trong khi đó dùng ký hiệu *, C khai báo nó là int*.

Nó chỉ giản dị là dùng kiểu $, #, % cũng chả chết ai cho nên MS sẽ chẳng buồn động vào.

So sánh C với VBA là gần như nước với lửa. Tác giả C từ đầu đã tự đặt điều kiện là ngôn ngữ chỉ dùng non 30 ký tự và từ khoá. Tác giả VBA không hề có ý định này, cho nên VBA có rất nhiều từ khoá.

So sánh với các đời FORTRAN cũ có thể gần hơn.
Thuở mới khai sinh, máy tính rất ít bộ nhớ cho nên các ngôn ngữ phải giảm thiểu độ dùng bộ nhớ. Đời đầu tiên của BASIC chỉ cho phép đặt tên biến là 1 ký tự, A, B, C, ... Muốn là string thì thêm $ ở sau. Đời kế đó đặt thêm dấu (thường là %) cho integer. Biến không cần phải khia báo. Từ khoá Dim giành cho khai báo mảng. Bởi vậy từ khoá ấy nó mới có cái tên vô duyên như thế. Dim bắt nguồn từ Dimension, tức là chiều của mảng. Về sau đem dùng chung cho mọi khai báo kiêur khác.
FORTRAN II và IV thì đặt ra luật tên biến bắt đầu bằng ký tự I đến N là integer, các ký tự khác là float. Muốn double thì báo cho compiler bằng lệnh Double Percision.

Khi tuyên bố rằng VB.NET có thể chuyển từng hàng qua C#, MS chủ yếu nói về cách sử dụng các class của dot net. Điều này tuonwg đối có thể tạm coi là đúng vì các kiểu căn bản (int, float, ...) của dot net là các class xác định, dùng trong VB.net và C# như nhau. Nhưng các điều khác thì phải coi chừng. C# là ngôn ngữ thuộc dòng họ C cho nên nó có cấu trúc của dòng họ C, khác hẳn với các dòng họ khác (tôi đã giải thích cái này một lần rồi). Ví dụ như vòng lặp For, dòng họ basic chỉ có một biến duyệt vòng lặp; nhưng dòng họ C muốn đặt bao nhiêu biến cũng được (kể cả không biến nào). Và điều quan trọng nhất là dòng họ Basic coi IF như một hàm, tất cả mọi biểu thức của lô gic IF đều được tính; dòng họ C không hẳn vậy, nó chỉ tính từ trái sang phải, đủ lô gic rồi thì không tính tiếp.

=== Bổ sung ===

Sẵn nói chuyện về các biểu thức trong lô gic IF, tôi ví dụ cho các bạn hiểu thêm về VBA.

Mã:
Dim a as integer ' đây là biến toàn cục, dùng để giải thích hàm nào có làm việc và hàm nào không

function x1() as boolean
a = a + 1
x1 = true
end function

function x2() as boolean
a = a + 1
x2 = true
end function

sub main()
IF x1() Or x2() Then
' chẳng làm gì cả
End IF
Debug.Print a
end sub

Chạy sub main trong code trên, sẽ thấy nó in ra trị của a là 2. Hàm x1 cộng 1 cho a, hàm x2 cộng thêm 1.
Nhưng nếu đổi trực tiếp code này sang C thì phải coi chừng. Đối với C, hàm x1 đã cho true rồi nên không cần phải chạy hàm x2. Cho nên sẽ thấy kết quả cuối cùng a là 1.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi xuất phát từ dân không chuyên lập trình, xin có 2 ý, cũng là 1 câu hỏi thế này:

1. Viết code có comment đầy đủ, vì bản thân mình viết code mà sau đọc lại chả hiểu dòng code có tác dụng gì.

2. Về Việc viết tắt, theo tôi thời buổi SỐ HÓA, nên đó cũng không phải là viết tắt, tôi ví dụ 1 tình huống thế này. Đơn giản chỉ là code Special Cells. Các lựa chọn đã được mã hóa từ 1 đến 15, theo đúng thứ tự của bảng Go To Special (trong File đính kèm), tương đương các mã đó gán vào code Special Cells rất hiệu quả:

---> (1): Tìm ô có chưa Comment
---> (2): Tìm ô có chứa nội dung
....... (3), (4), (5)...

Tôi có 1 file ví dụ với đoạn code tô mầu đơn giản thế này:
Mã:
Sub ToMau()
    With Sheet1
        .[E6:G8].ClearFormats
        .[E6:G8].SpecialCells(.[C3]).Interior.ColorIndex = 6
    End With
End Sub

Thay con số ừ 1 -> 15 tại ô C3 -> Click Tô Mầu.

Việc mã hóa này có lợi là dù phiên bản office có ngôn ngữ gì (Pháp, Đức, Nhật,...) code đều chạy tuốt. Tôi hiểu thế liệu có đúng?
 

File đính kèm

Upvote 0
Tôi xuất phát từ dân không chuyên lập trình, xin có 2 ý, cũng là 1 câu hỏi thế này:

1. Viết code có comment đầy đủ, vì bản thân mình viết code mà sau đọc lại chả hiểu dòng code có tác dụng gì.

2. Về Việc viết tắt, theo tôi thời buổi SỐ HÓA, nên đó cũng không phải là viết tắt, tôi ví dụ 1 tình huống thế này. Đơn giản chỉ là code Special Cells. Các lựa chọn đã được mã hóa từ 1 đến 15, theo đúng thứ tự của bảng Go To Special (trong File đính kèm), tương đương các mã đó gán vào code Special Cells rất hiệu quả:

---> (1): Tìm ô có chưa Comment
---> (2): Tìm ô có chứa nội dung
....... (3), (4), (5)...

Tôi có 1 file ví dụ với đoạn code tô mầu đơn giản thế này:
Mã:
Sub ToMau()
    With Sheet1
        .[E6:G8].ClearFormats
        .[E6:G8].SpecialCells(.[C3]).Interior.ColorIndex = 6
    End With
End Sub

Thay con số ừ 1 -> 15 tại ô C3 -> Click Tô Mầu.

Việc mã hóa này có lợi là dù phiên bản office có ngôn ngữ gì (Pháp, Đức, Nhật,...) code đều chạy tuốt. Tôi hiểu thế liệu có đúng?

Hai việc 1 và 2 của bạn mâu thuẫn nhau ở phần tô đỏ.
Code chạy tuốt hay không thì không biết chứ, đã nói chuyện phiên bản gì cũng được thì cũng phải xác định comment bằng tiếng gì?

Chú thích: việc dùng số thay cho tên hằng là đi ngược đường lối lập trình cơ bản. Trong luật lập trình người ta gọi những con số 2, 3 ... là magic numbers (dịch theo ngữ cảnh là dữ liệu trên trời rơi xuống). Tuy nhiên, theo luật rừng nào cọp nấy, ở đây nhiều người quen và thích kiểu này cho nên tôi không tranh cãi điểm này nữa.
Tôi chỉ lưu ý các bạn mới học lập trình rằng việc viết số 3 thay vì xlUp là do bạn quen tay thôi. Các lập luận thiên bên này hay bên kia rất có thể là lập luận chủ quan.
 
Upvote 0
Tôi xuất phát từ dân không chuyên lập trình, xin có 2 ý, cũng là 1 câu hỏi thế này:

1. Viết code có comment đầy đủ, vì bản thân mình viết code mà sau đọc lại chả hiểu dòng code có tác dụng gì.

2. Về Việc viết tắt, theo tôi thời buổi SỐ HÓA, nên đó cũng không phải là viết tắt, tôi ví dụ 1 tình huống thế này. Đơn giản chỉ là code Special Cells. Các lựa chọn đã được mã hóa từ 1 đến 15, theo đúng thứ tự của bảng Go To Special (trong File đính kèm), tương đương các mã đó gán vào code Special Cells rất hiệu quả:

---> (1): Tìm ô có chưa Comment
---> (2): Tìm ô có chứa nội dung
....... (3), (4), (5)...

Tôi có 1 file ví dụ với đoạn code tô mầu đơn giản thế này:
Mã:
Sub ToMau()
    With Sheet1
        .[E6:G8].ClearFormats
        .[E6:G8].SpecialCells(.[C3]).Interior.ColorIndex = 6
    End With
End Sub

Thay con số ừ 1 -> 15 tại ô C3 -> Click Tô Mầu.

Việc mã hóa này có lợi là dù phiên bản office có ngôn ngữ gì (Pháp, Đức, Nhật,...) code đều chạy tuốt. Tôi hiểu thế liệu có đúng?
Bạn vào link sau tham khảo thêm nè của Bác Bill đó
http://msdn.microsoft.com/en-us/library/office/ff196157(v=office.15).aspx
 
Upvote 0

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

Back
Top Bottom