Giúp khi nào nên đặt biến trong VBA (1 người xem)

Liên hệ QC

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

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chảo cả nhà GPE !
Mình mới học lớp mẫu giáo về môn VBA này. hơi mơ mơ màng màng xin cho em hỏi ngu 1 cái là khi nào là mình nên đặt biến khi nào là không đặt.

Mã:
Sub code1()
a = Range("a1000").End(xlUp).Row
Range("b2") = a
End Sub

Sub code2()
Dim i As Long
i = Range("a1000").End(xlUp).Row
Range("b2") = i
End Sub




Mình có test 2 đoạn trên thầy kết quả giống nhau. vậy khi nào mình nên Dim biến và khi nào không cần . Xin cảm ơn
 
dim.jpg

Check dòng đó rồi chạy 2 sub trên xem...

p/s: Tìm từ khóa với dòng đó để tìm hiểu...
 
Upvote 0
Chảo cả nhà GPE !
Mình mới học lớp mẫu giáo về môn VBA này. hơi mơ mơ màng màng xin cho em hỏi ngu 1 cái là khi nào là mình nên đặt biến khi nào là không đặt.

Mã:
Sub code1()
a = Range("a1000").End(xlUp).Row
Range("b2") = a
End Sub

Sub code2()
Dim i As Long
i = Range("a1000").End(xlUp).Row
Range("b2") = i
End Sub




Mình có test 2 đoạn trên thầy kết quả giống nhau. vậy khi nào mình nên Dim biến và khi nào không cần . Xin cảm ơn
Khi nào bạn chèn 1 module mới mà bạn thấy có dòng Option Explicit viết sẵn ngay đầu code như vầy:

Capture.JPG
















thì bắt buộc ban phải đặt biết (nếu có dùng tới). Nếu không nó sẽ báo lỗi
Ngược lại hổng thấy dòng đó thì đặt hay không cũng không việc gì xảy ra
 
Upvote 0
Mình có test 2 đoạn trên thầy kết quả giống nhau. vậy khi nào mình nên Dim biến và khi nào không cần . Xin cảm ơn

Range("b2") = Range("a1000").End(xlUp).Row

Gán cái gì thì nó ra kết quả cái nấy. Việc này đâu có liên quan gì đến Dim biến hay không.

Khi nào không cần? khi hội đủ các điều kiện sau:
1. hàm/sub đơn giản, khoảng dưới 20 dòng
2. hàm/sub không có tham số
3. sử dụng không trên 6 biến (thường thì người ta giới hạn 3 biến)
4. code chỉ dùng ở project hiện tại. Không có khả năng copy, để giành xài lại
5. Project chỉ có 1 module, không có module nào khác
6. module không có biến toàn cục
 
Upvote 0
Thêm một điều kiện nữa:

Nếu bạn không hiểu 1 rrong 6 điều kiện trên thì nên Dim tất cả các biến.
 
Upvote 0
Hiểu nôm na như thế này: Biến (variable) là một tên gọi đi kèm theo sau nó là 1 kiểu dữ liệu (Data Type) để máy tính lưu trữ tạm thời trong bộ nhớ khi sử dụng trong một thủ tục.

Bạn nên hiểu các kiểu dữ liệu (Data Type) gồm: Boolean, Integer, Long, Double, Currency, Date, String để dùng khi cần trong khai báo biến.

Trong hộp thoại Options nếu bạn đánh dấu vào Require variable Declaration (Yêu cầu Tuyên bố biến), nếu bạn sử dụng một biến trong một thủ tục mà không khai báo sẽ phát sinh lỗi.
 
Upvote 0
@chủ thớt: những điều tôi nói sau đây chỉ chuyên về lý thuyết, giành cho các bạn đã có kinh nghiệm nhiều về VBA. Như bạn tự nhận mình "mới học mẫu giáo về môn VBA này" thì không cần đọc tiếp. Bạn nên tìm các bài nói về biến và tầm vực biến mà đọc. Ở dễn đàn có mấy bài nói của các tay kỳ cựu giải thích rất rõ từ nhập môn tới nâng cao (không phải của tôi, vì tôi chỉ chuyên về ý thuyết).

Khi nào bạn chèn 1 module mới mà bạn thấy có dòng Option Explicit viết sẵn ngay đầu code như vầy:
...
thì bắt buộc ban phải đặt biết (nếu có dùng tới). Nếu không nó sẽ báo lỗi
Ngược lại hổng thấy dòng đó thì đặt hay không cũng không việc gì xảy ra

Hiểu nôm na như thế này: Biến (variable) là một tên gọi đi kèm theo sau nó là 1 kiểu dữ liệu (Data Type) để máy tính lưu trữ tạm thời trong bộ nhớ khi sử dụng trong một thủ tục.

Bạn nên hiểu các kiểu dữ liệu (Data Type) gồm: Boolean, Integer, Long, Double, Currency, Date, String để dùng khi cần trong khai báo biến.

Trong hộp thoại Options nếu bạn đánh dấu vào Require variable Declaration (Yêu cầu Tuyên bố biến), nếu bạn sử dụng một biến trong một thủ tục mà không khai báo sẽ phát sinh lỗi.

Tôi xin giải thích trên quan điểm lý thuyết về cách làm việc cùa trình dịch VBA, vấn đề "lúc nào thì phải khai báo biến" và "khai báo như thế nào"

Option Explicit có tác dụng trong module. Nó bắt buộc các biến trong module phải được khai báo rõ rệt chứ không được mặc định. Mặc định là như thế nào thì xem bên dưới.

Options - Require Variable Declaration cũng giống như Option Explicit, nhưng có tác dụng cả project. Nói cách khác, ta có thể Option Explicit cho module1 và khong bắt buộc cho module2. Nhưng nếu "Options - Require Variable Declaration" thì mặc nhiên tất cả module đều coi như có "Option Explicit"

Biến mặc định như thế nào?
Các chỗ (1),(2),(3) là chỗ cần xem chú thích thuật ngữ.

Đầu tiên hết, định nghĩa tầm vực của biến gồm có:

Biến khai báo bên trong sub/function là biến nội bộ, chỉ hiện hữu trong sub/function đó và khi end/exit sub/fucntion nó sẽ được tiêu huỷ. Điều ngoại lệ là biến nọi bộ được khai báo với từ khoá Static, khi end/exit sub/function chúng khong bị tiêu huỷ; giá trị vẫn giữ để làm việc nếu sub/function được gọi lại.

Biến được khai báo trong code module, nhưng bên ngoài sub/function là biến toàn cục, hiện hữu trong suốt chương trình chạy. (1)

Biến được khai báo trong class module là biến thuộc về class. Muốn động đến chúng thì phải đi qua đối tượng của class. Cái này không thể bàn nhiều ở đây vì chúng thuộc về hướng đối tượng.

Cách VBA nhận dạng biến:

Khi VBA biên dịch đến đoạn thấy tên biến thì nó tìm về bảng địa chỉ. Nếu biến đã có ghi trong bảng địa chỉ của biến nội bộ, tức là đã được cấp phát vùng nhớ (2) rồi thì VBA cứ việc dùng vùng nhớ ấy.

Nếu biến không có sẵn trong bảng biến nội bộ thì VBA tìm qua bảng biến toàn cục. Nếu tìm được thì nó sử dụng luôn.
Nếu biến không tìm được trong bảng biến toàn cục. Vì lý do không hề được khai báo, hoặc được khai báo trong module khác dưới dạng private (3) thì VBA sẽ làm như sau:
- Nếu project hoặc module có điều kiện "bắt buộc khai báo trước" thì VBA sẽ báo lỗi "biến chưa được khai báo" (hay đại khái thế).
- Nếu khong có điều kiện "bắt buộc khai báo trước" thì VBA liệt biến vào trường hợp mặc định, và tự động khai báo ngay tại chỗ đó. Và đương nhiên vì khai báo tại chỗ cho nên biến là một biến nôi bộ, và kể từ sau đó, tên này coi như đã được khai báo rồi.

(1) bộ nhớ trong chương trình chia ra làm 2 phần, phần vùng nhớ chung (heap) dùng chung cho cả project, và vùng nhớ ngăn xếp (stack) dùng riêng bên trong hàm/sub

(2) lưu ý: vùng nhớ không nhất thiết phải trực tiếp chứa dữ liệu. Chỉ những loại biến đơn giản mới chứa dữ liệu trực tiếp. Các loại phức tạp thì vùng nhớ chỉ là con trỏ tới vùng dữ liệu thực thụ.

(3) các biến toàn cục được khai báo dưới điều kiện private thì chúng cũng nằm trong danh sách bảng biến toàn cục, nhưng chúng chỉ cho phép những sub/function trong cùng module sử dụng mà thôi. Nói theo tiếng chuyên môn là chúng được module che lại, các module khác không động đến được.

Chú thích: ở đây tôi chỉ nói về khai báo tên biến, tức là ghi danh/điểm danh thôi. Việc khai báo kiểu biến thì cũng có lý thuyết riêng, bàn ở đây dài quá.
 
Upvote 0
Trong VB, kể cả bạn không khai báo biến thì với một lệnh gán nào đó cho biến chưa khai báo thì VB sẽ tự đặt ra một biến và thực hiện phép gán đó. Có thể VB muốn cho người lập trình một cơ chế linh động? Tuy nhiên nếu lạm dụng thì có thể sinh ra lối viết code tùy hứng và đem bạn đến những tại nạn không tưởng (nhiều khi debug muốn lòi con mắt cũng chả hiểu tại sao chương trình hổng chạy đúng dù chả báo lỗi gì --=0).

"Option explicit" theo translate.google.com dịch (???) là "Lựa chọn rõ ràng" có nghĩa bắt buộc bạn phải tự khai báo biến nếu muốn sử dụng biến đó thay vì ỷ lại VB làm hộ cho bạn. Và với những người lập trình hơi bị ngu như tôi, thì đó là sự lựa chọn an toàn.
.
Nếu bạn viết mà tự tin rằng mình có thể kiểm soát tất cả những biến được khai báo ngẫu hứng thì bạn có thể bỏ qua cái từ "Dim" hoặc "Option Explicit" vốn có thể làm hao mòn tuổi thọ cái bàn phím của bạn chút ít.--=0
 
Upvote 0
Trong VB, kể cả bạn không khai báo biến thì với một lệnh gán (1) nào đó cho biến chưa khai báo thì VB sẽ tự đặt ra một biến và thực hiện phép gán đó. Có thể VB (2) muốn cho người lập trình một cơ chế linh động? (3) Tuy nhiên nếu lạm dụng thì có thể sinh ra lối viết code tùy hứng và đem bạn đến những tại nạn không tưởng (nhiều khi debug muốn lòi con mắt cũng chả hiểu tại sao chương trình hổng chạy đúng dù chả báo lỗi gì --=0).

"Option explicit" theo translate.google.com dịch (???) là "Lựa chọn rõ ràng" (4) có nghĩa bắt buộc bạn phải tự khai báo biến nếu muốn sử dụng biến đó thay vì ỷ lại VB làm hộ cho bạn. Và với những người lập trình hơi bị ngu như tôi, thì đó là sự lựa chọn an toàn.
.
Nếu bạn viết mà tự tin rằng mình có thể kiểm soát tất cả những biến được khai báo ngẫu hứng thì bạn có thể bỏ qua cái từ "Dim" (5) hoặc "Option Explicit" vốn có thể làm hao mòn tuổi thọ cái bàn phím của bạn chút ít.--=0

(1) không nhất thiết phải là phép gán. Cứ cái gì mà trình dịch token (phân tách) ra thành tiên biến thì coi như biến được bắt đầu.
ví dụ MsgBox a : nạp tham số a cho hàm MsgBox, a được trình dịch coi là 1 tên biến và bắt đầu công cuộc đi tìm xem đã khai báo hay chưa.

(2) Ở đây nới về VBA, VB có những cái mà VBA khong áp dụng, và ngược lại

(3) Đối với một ngôn ngữ có nguồn gốc xưa thì khong nên đoán lý do, dễ bị sai. Chả có linh động gì ở đây cả. Tại luật ngày xưa không bắt buộc phải khai báo, người ta bắt buộc phải lập ra những "Options" như thế để cho code cũ khong bị bắt buộc phải viết lại. Từ khóa Dim chính thức do BASIC lấy từ FORTRAN's Dimension, dùng để khai báo mảng.
Lưu ý là dù cho có Option Explicit hay khong thì mảng vẫn phải khai báo.
ví dụ: x = a(1) : bắt buộc phải khai báo; hoặc Function a(n), hoặc Dim a() bởi vì:
i. trình dịch khong thể biết lệnh trên muốn ngầm hiểu đó là biến hay hàm
ii. nếu là biến thì trình dịch khong thể đoán mảng bao lớn để lập vùng nhớ

(4) đối với ngôn ngữ lập trình thì đâu có dùng Google translate được. Option là một trong những lệnh chỉ dẫn trình dịch (compiler directives). Option Explicit ra lệnh cho trình dịch không được dùng lối khai báo ngầm (khai báo tự động khi gặp cái có thể coi là tên biến). Từ Explicit ở đây có nghĩa là "phải nêu rõ ra, không được ngầm hiểu"

(5) nhiều người viết code kiểm soát biến dễ dàng. Nhưng người ta vẫn khai báo biến là vì muốn cái code đó có thể gói trọn (self contained) và lưu động (portable). Điểm tai hại nhất của khong khai báo biến là khi copy code sang chỗ khác sẽ có khả năng bị trùng với biến toàn cục
 
Upvote 0
(1) không nhất thiết phải là phép gán. Cứ cái gì mà trình dịch token (phân tách) ra thành tiên biến thì coi như biến được bắt đầu.
ví dụ MsgBox a : nạp tham số a cho hàm MsgBox, a được trình dịch coi là 1 tên biến và bắt đầu công cuộc đi tìm xem đã khai báo hay chưa.
Họ hỏi phép gán thì mình nói về phép gán thôi. Nói theo nhu cầu người hỏi thôi. Tự lượng sức mà nói chứ biết tý chữ nói lan man lại bị bắt bẻ thì khổ.

(2) Ở đây nới về VBA, VB có những cái mà VBA khong áp dụng, và ngược lại
Người ta hỏi biến thì mình nói về biến. Có phải đem phân tích tất tần tật cú pháp VB đâu mà lo áp với chả dụng.

Chả có linh động gì ở đây cả. Tại luật ngày xưa không bắt buộc phải khai báo
"Không bắt buộc phải khai báo" không phải là linh động à? Thế "bắt buộc phải khai báo" mới là linh động sao? --=0 Với lại tôi cũng để lại dấu chấm hỏi cho giả thuyết của mình vì tôi không phải viết cái trình biên dịch ngày xưa đó. Còn nếu ai đã từng viết ra nó thì cho tôi lý giải nhé.

(4) đối với ngôn ngữ lập trình thì đâu có dùng Google translate được. Option là một trong những lệnh chỉ dẫn trình dịch (compiler directives). Option Explicit ra lệnh cho trình dịch không được dùng lối khai báo ngầm (khai báo tự động khi gặp cái có thể coi là tên biến). Từ Explicit ở đây có nghĩa là "phải nêu rõ ra, không được ngầm hiểu"
Vốn chả được may mắn giỏi tiếng Anh như thế này nên người dốt tiếng anh như tôi chỉ còn biết bấu víu vào google thôi dù rằng phải mở ngoặc (???) vì không chắc lắm. Làm thế ít ra thì cũng đỡ mang cái tiếng đã dốt chữ lại còn hay nói chữ. Có gì sai đổ thừa cho google tất.+-+-+-+

(5) nhiều người viết code kiểm soát biến dễ dàng. Nhưng người ta vẫn khai báo biến là vì muốn cái code đó có thể gói trọn (self contained) và lưu động (portable). Điểm tai hại nhất của khong khai báo biến là khi copy code sang chỗ khác sẽ có khả năng bị trùng với biến toàn cục
Người giỏi mở mồm là thuật ngữ tây ta tuôn trào chứ tôi vốn dốt nát thì chỉ có mấy lời ngô nghê thế này thôi.
nếu lạm dụng thì có thể sinh ra lối viết code tùy hứng và đem bạn đến những tại nạn không tưởng (nhiều khi debug muốn lòi con mắt cũng chả hiểu tại sao chương trình hổng chạy đúng dù chả báo lỗi gì
a01.gif
)......
Và với những người lập trình hơi bị ngu như tôi, thì đó là sự lựa chọn an toàn.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi có thể nhận xét một tiện ích trình dịch VB/VBA không hoặc cần khai báo biến là thứ NGU nhất. Những bạn có thói quen hoặc tùy tiện không khai báo biến thường phải "trả giá" sau này hết vì lỗi tính toán do giá trị không đúng biến chỉ định. Bằng nhiều năm kinh nghiệm, nhiều dự án tôi làm trên VB/VBA tôi khuyên các bạn hãy luôn khai báo biến dù mất thêm một công đoạn.

Về lý thuyết lập trình tôi thấy bạn VetMini là một trong rất ít người trên GPE hiểu biết ngôn ngữ lập trình thực sự vì thế các bạn nên tham khảo ý kiến của bạn ấy!
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom