Option Explicit (4 người xem)

Liên hệ QC

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

Mr Okebab

Ngon Ngất Ngây
Thành viên đã mất
Tham gia
6/8/06
Bài viết
3,260
Được thích
3,790
Trong VBA minhf thường thấy mọi người thường hay dùng
Option Explicit

Vậy dùng nó có tác dụng như thế nào ? Khi nào nên dùng, khi nào không nên dùng nhỉ ? Nhưng là chỉ trong VBA thôi, còn cái khác thì mình lại không biết. (mình không phải dân lập trình).

Mong giải đáp giúp.
 
If used, the Option Explicit statement must appear in a module before any procedures.
When Option Explicit appears in a module, you must explicitly declare all variables using the Dim, Private, Public, ReDim, or Static statements. If you attempt to use an undeclared variable name, an error occurs at compile time.
If you don't use the Option Explicit statement, all undeclared variables are of Variant type unless the default type is otherwise specified with a Deftype statement.
Note Use Option Explicit to avoid incorrectly typing the name of an existing variable or to avoid confusion in code where the scope of the variable is not clear.

I HOPE THAT MY POST WILL USEFUL WITH YOU !!!!!
HAPPY NEW YEAR !!
 
MrHieu đã viết:
Trong VBA minhf thường thấy mọi người thường hay dùng
Option Explicit

Vậy dùng nó có tác dụng như thế nào ? Khi nào nên dùng, khi nào không nên dùng nhỉ ? Nhưng là chỉ trong VBA thôi, còn cái khác thì mình lại không biết. (mình không phải dân lập trình).

Mong giải đáp giúp.

Tôi cũng không phải dân lập trình, nhưng thỉnh thoảng củng vọc vài code VB bên Access, VB6, VBA for Excel ...

Và tôi biết rằng dân lập trình 'chuyên nghiệp', 'chính thống' và 'có nguyên tắc' nên Khai báo tất cà các Variant sử dụng cho các thủ tục, hàm ..., và dòng Option Explicit dùng để ràng buộc việc khai báo này. Khi một biến chưa có 'giấy khai sinh' (bằng Dim) ... thì sẽ bị báo lỗi ngay lập tức!

Còn nếu bạ đâu tạo ra biến đó, rồi sử dụng theo kiểu lãng tữ Lệnh Hồ thì không cần statement này.

Bạn tham khảo thêm
Option Base statement
Option Compare statement
Option Private statement

@$@!^%
 
Lần chỉnh sửa cuối:
Cảm ơn cậu lachinhan nhiều. Cậu lại lấy anh Assitance ra nói chuyện giùm rồi. Mặc dù thế nhưng mình muốn biết cụ thể vì thấy không hiểu lắm.
Đành rằng :
If used, the Option Explicit statement must appear in a module before any procedures.
When Option Explicit appears in a module, you must explicitly declare all variables using the Dim, Private, Public, ReDim, or Static statements. If you attempt to use an undeclared variable name, an error occurs at compile time.

nhưng nếu không dùng OE (Option Explicit) thì có sao không ?

Mình thấy các trường hợp sau :
1. Không dùng OE : Trong sheet và Module
2. Dùng OE trong sheet, trong Module không có
3. Không dùng OE trong Sheet, chỉ dùng trong Module
4. Dùng trong cả Sheet và Module

Như vậy có tác dụng gì không ? Có cải thiện được điều gì không (Thì mới dùng chứ).
Mong các bạn chỉ giáo.
Thân!
 
Lần chỉnh sửa cuối:
... Bạn lachihan giúp mọi ngừời nâng cao trình độ tiếng anh ấy mà ...!
 
Davidsy đã viết:
... Bạn lachihan giúp mọi ngừời nâng cao trình độ tiếng anh ấy mà ...!

Không phải là đọc TA không hiểu mà những thuật ngữ đó không hiểu hết được, hơn nữa lại nói quá chung chung.

Davidsy hiểu khá rõ về nó, vậy thì hãy nói nhiều hơn về nó đi.

Thân!
 
Chào bác Hiếu. Trở lạii với vấn đề bác hỏi mình không phải là 1 lập trình viên chuyên nghiệp nhưng cũng có 1 số đóng góp sau đây.

OE được dùng để khai báo tường minh, thường được các lập trình viên đẳng cấp Pro sử dụng. Nó được sử dụng để tránh gõ nhầm tên biến, nếu có sự nhầm lẫn do gõ nhầm tên biến VB sẽ báo lỗi ngay.

Trước tiên ta tìm hiểu về khai báo biến nhé. Để khai báo ta dùng lệnh

Dim <tên biến> as <kiểu dữ liệu> => biến khai báo trong thủ tục chỉ tồn tại khi thủ tục thi hành, khi thủ tục chấm dứt nó sẽ biến mất
Public <tên biến> as <kiểu dữ liệu> biến sẽ tồn tại và có tầm hoạt động trên toàn ứng dụng
………………

VD : + cách khai báo ngầm, không cần khai báo tường minh.

Function MrHieu(Num)
MrNhan = Abs(num)
MrHieu = Sqr(MrNhan)
End Function

Cách này thuận tiện là ta không cần phải khai báo biến nhưng nó có thể gây lỗi do gõ nhầm tên biến như sau

Function MrHieu(Num)
MrNhan = Abs(num)
MrHieu = Sqr(MrNhn) => MrNhan mới đúng
End Function

Nếu không khai báo biến tường minh thì VB sẽ hiểu MrNhn sẽ là 1 biến nào đấy => hàm vẫn chạy được nhưng sẽ chạy sai không như ý muốn ( không tin Bác cứ thử xem giá trị trả về là 0 đấy) , nếu với một chương trình lớn với rất nhiều biến và hàm, 1 lỗi như thế này mà xảy ra thì biết đường đâu mà sửa phải không nào. Do đó với các nhà lập trình Pro họ thường khai báo như sau.

+ cách khai báo tường minh

Option Explicit

Dim MrNhan as Integer

Function MrHieu(Num)
MrNhan = Abs(num)
MrHieu = Sqr(MrNhan)
End Function

Với cách khai báo này nếu dòng lệnh MrHieu = Sqr(MrNhan) được gõ sai là MrHieu = Sqr(MrNhn) thì VB sẽ báo lỗi là biến MrNhn chưa được khai báo, lúc này bạn sẽ biết được mình sai gì để sửa.

Với các lập trình viên chuyên nghiệp được đào tạo bài bản thì họ luôn luôn khai báo biến. Ngoài ra người học lập trình chuyên nghiệp còn phải tuân thủ theo cách đặt tên biến, đặt tên cho đối tượng nữa đấy. 1 lý do các quy tắc đó phải được tuân thủ là do các chương trình lớn sẽ được phân ra cho mỗi người viết 1 module và ráp lại thành 1 chương trình hoàn chỉnh sau đó sẽ tiến hành sửa lỗi nếu có lỗi xảy ra. Lúc đó nếu với cách đặt tên của các lập trình viên nghiệp dư như chúng ta ( thích đặt sau chỉ mình hiểu là được) thì không biết đường mà sửa đâu.

Kiến thức nông cạn mong các tiền bối bỏ qua cho khakha.

Có gì ko rõ Bác cứ post bài hỏi tiếp nhé
 
Mã:
Function gtkhacnhau(vung As Range) As Integer
    Dim tht(100)
    Dim cottht As Range
    Dim B As Integer, trung As Boolean, a As Integer
    B = 0
    For Each [COLOR=#ff0000]clls[/COLOR] In vung
        trung = True
        For a = 0 To 100
            If tht(a) = clls Then
                trung = False
            Exit For
            End If
        Next a
        If trung = True Then
        tht(B) = clls
        B = B + 1
        End If
    Next clls
    gtkhacnhau = B
End Function
Mình sử dụng file excel có đoạn code như trên,khi thêm OPTION EXPLICIT thì báo cái tô đỏ chưa khai báo.Vậy theo các bác cái tô đỏ khai báo như thế nào mới đúng?Thanks.
 
Mã:
Function gtkhacnhau(vung As Range) As Integer
    Dim tht(100)
    Dim cottht As Range
    Dim B As Integer, trung As Boolean, a As Integer
    B = 0
    For Each [COLOR=#ff0000]clls[/COLOR] In vung
        trung = True
        For a = 0 To 100
            If tht(a) = clls Then
                trung = False
            Exit For
            End If
        Next a
        If trung = True Then
        tht(B) = clls
        B = B + 1
        End If
    Next clls
    gtkhacnhau = B
End Function
Mình sử dụng file excel có đoạn code như trên,khi thêm OPTION EXPLICIT thì báo cái tô đỏ chưa khai báo.Vậy theo các bác cái tô đỏ khai báo như thế nào mới đúng?Thanks.
Đôi khi bạn chỉ cần Dim clls là đủ nếu bạn không biết khai báo cái gì
 
Mã:
Function gtkhacnhau(vung As Range) As Integer
    Dim tht(100)
    Dim cottht As Range
    Dim B As Integer, trung As Boolean, a As Integer
    B = 0
    For Each [COLOR=#ff0000]clls[/COLOR] In vung
        trung = True
        For a = 0 To 100
            If tht(a) = clls Then
                trung = False
            Exit For
            End If
        Next a
        If trung = True Then
        tht(B) = clls
        B = B + 1
        End If
    Next clls
    gtkhacnhau = B
End Function
Mình sử dụng file excel có đoạn code như trên,khi thêm OPTION EXPLICIT thì báo cái tô đỏ chưa khai báo.Vậy theo các bác cái tô đỏ khai báo như thế nào mới đúng?Thanks.
Bạn đã khai báo vung as Range
Giờ ta có For Each clls in vung ---> Vậy chính xác clls là biến Range rồi: Dim clls as Range là được
Khai báo kiểu Dim clls không không vậy cũng được nhưng bạn sẽ bị thiệt thòi vì không khai thác được các thuộc tính và phương thức liên quan đến biến Range
 
Bạn đã khai báo vung as Range
Giờ ta có For Each clls in vung ---> Vậy chính xác clls là biến Range rồi: Dim clls as Range là được
Khai báo kiểu Dim clls không không vậy cũng được nhưng bạn sẽ bị thiệt thòi vì không khai thác được các thuộc tính và phương thức liên quan đến biến Range
Cảm ơn bác,tiện thể cho e hỏi,nếu e gán:
nhap ="sheet1"
thì nhap khai báo như thế nào ạ?
 
Cảm ơn bác,tiện thể cho e hỏi,nếu e gán:
nhap ="sheet1"
thì nhap khai báo như thế nào ạ?

Không rõ bạn muốn khai báo chuỗi hay khai báo đối tượng worksheet.

Nếu bạn khai báo chuỗi thì dùng Dim nhap as String
Nếu bạn khai báo đối tượng worksheet thì dùng Dim nhap as Worksheet

Còn câu lệnh Set không phải là câu lệnh khai báo, có thể hiểu nôm na đó là câu lệnh gán nhằm thu gọn câu lệnh.
Chẳng hạn nếu dùng Set Nhap = Sheets("Name") thì khi gán dữ liệu cho ô A1 đi, bình thường chúng ta dùng là:
Sheets("Name").Range("A1").Value = "abc"
thì chúng ta có thể dùng là
Nhap.Range("A1").Value = "abc"
 
Web KT

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

Back
Top Bottom