Vấn đề chưa hiểu về Dim?

Liên hệ QC

hoatinhyeu862000

Thành viên hoạt động
Tham gia
19/7/13
Bài viết
135
Được thích
3
Chào Thầy Cô em có 1 vấn đề nho nhỏ về Dim chưa hiểu nên đưa lên diễn đan mong thầy cô giải đáp ạ.
như file em đưa lên nếu như em không thêm dòng "Option Explicit" ở đầu thì chạy rất tốt nhưng khi em cho dòng "Option Explicit" vào thì nó lại báo lỗi ở chuoitim dù em đã thêm chuoitim as Range trên đoạn code Dim nhưng vẫn lỗi mong thầy cô giải đáp cho em? Xin lỗi em gửi nhầm file dạng xlsx. Mong các thầy tải file dưới xlsm ạ
 

File đính kèm

  • aaaa.xlsx
    11.1 KB · Đọc: 7
Lần chỉnh sửa cuối:
Chào bạn,

Bạn lưu dưới dạng .xlsx là đã mất macro rồi, như vậy không ai có thể giúp được bạn cả. Bạn xem lại đưa file theo đuôi .xlsm hoặc .xls để có thể giữ lại macro, từ đó mọi người mới xem cho bạn được.

Thân,
kyo.
 
Upvote 0
Các thầy cô tải file này ạ
 

File đính kèm

  • aaaa.xlsm
    19.5 KB · Đọc: 14
Upvote 0
Vấn đề của bạn là chưa khai báo tường minh thôi!

Nếu là tôi, tôi sẽ fải luôn xài Option Explicit
& khai báo hết tất tần tật các biến sẽ xài đến
Như ví dụ sau:
PHP:
Option Explicit
Private Sub Textbox1_Change()
Dim Sarr(), J, iTem, ChuoiTim As String

Me.ListBox1.Clear
With Sheets("sheet1")
   Sarr = .Range(.[a2], .[a65536].End(3)).Value
End With
ChuoiTim = Me.TextBox1.Value
'    . . . . . . . . . .   '
'    . . . . . . . . . .    '
End Sub
 
Upvote 0
cảm ơn anh chị em đã làm xong em còn yếu nên cứ tưởng phải khai báo là range nên lỗi.
 
Upvote 0
cảm ơn anh chị em đã làm xong em còn yếu nên cứ tưởng phải khai báo là range nên lỗi.
Mình cũng đang nghiên cứu về VBA, việc khai báo biến tường minh sẽ giúp ta kiểm soát lỗi, và giúp người khác đọc code dễ hiểu hơn. Bạn nên cài sẵn kiểm tra việc khai báo biến ở bài #293 này.
 
Upvote 0
Khi một biến được đưa ra thì trong thủ tục phải khai báo, đó là nguyên tắc.

Khai báo trong thủ tục ta dùng Dim (có thể khai báo liên tục, cách nhau dấu phẩy lên đến 60 biến các loại).

Khi không khai báo biến thì mặc nhiên đó là một biến Variant, thủ tục vẫn chạy tốt theo cách mà biến nhận giá trị kiểu dữ liệu loại nào.

Option Explicit là thủ tục để kiểm tra các biến trong thủ tục có được khai báo hay không. Nếu không khai báo thì thủ tục đang 'Run' sẽ báo lỗi.

Trường hợp không có Option Explicit, nếu biến đó trùng tên với một hằng số của VBA (constant) thì thủ tục vẫn bị báo lỗi! ví dụ:

Mã:
Sub test()
    [COLOR=#ff0000]vbYes [/COLOR]= 100
End Sub


================================================

Vấn đề của bạn là chưa khai báo tường minh thôi!

Nếu là tôi, tôi sẽ fải luôn xài Option Explicit
& khai báo hết tất tần tật các biến sẽ xài đến
Như ví dụ sau:
PHP:
Option Explicit
Private Sub Textbox1_Change()
Dim Sarr(), J, iTem, ChuoiTim As String

Me.ListBox1.Clear
With Sheets("sheet1")
   Sarr = .Range(.[a2], .[a65536].End(3)).Value
End With
ChuoiTim = Me.TextBox1.Value
'    . . . . . . . . . .   '
'    . . . . . . . . . .    '
End Sub

Gọi là khai báo tường minh, nhưng như thế này thì tôi nghĩ chưa được tường minh cho lắm:

Mã:
Dim Sarr(), [COLOR=#ff0000][B]J, iTem, [/B][/COLOR]ChuoiTim As String

với J và iTem mà khai báo như thế thì chưa biết nó thuộc kiểu dữ liệu loại nào. Khi ta khai báo như thế, máy sẽ ngầm hiểu là các biến đó có kiểu dữ liệu là Variant, mà các biến dạng này thường phải tính toán lại kiểu dữ liệu nên ít nhiều cũng làm chậm đi quá trình tính toán.
 
Upvote 0
cảm ơn thầy nghĩa mong thầy tiếp tục giải đáp them vì e đang bập bẹ nên xin thầy cho 1 đoạn code theo ý tưởng của thầy để em đối chiếu và mở rộng.
 
Upvote 0
cảm ơn thầy nghĩa mong thầy tiếp tục giải đáp them vì e đang bập bẹ nên xin thầy cho 1 đoạn code theo ý tưởng của thầy để em đối chiếu và mở rộng.
Theo mình thì cứ viết code rồi chạy vô tư đi. Khi nào máy tính la lên " Ê chưa khai báo biến kìa." thì quất thêm cái Dim gì gì đó
Cứ thế mà code cho sướng tay. Khi qua được cơ bản rồi sẽ biết lúc nào là byte, lúc nào là Long.... và rồi 1 đống nữa
Theo kinh nghiệm bản thân, nếu là dân nghiệp dư thì đừng quá nặng về cơ bản, cứ viết được 1 thủ tục nào chạy ra được kết quả theo yêu cầu là sướng tê rồi.
Mưa lâu thấm đất mà. Học cái này cũng giống học tiếng Anh thôi. Cứ phang rầm rầm đi, riết rồi sẽ ngộ ra hết hà.
Muốn nhanh nữa thì tầm sư học đạo, thời gian học để vượt qua được cơ bản mất chừng 1 tháng là nhiều.

Cái này là quan điểm cá nhân thôi, các đại ca đừng ném đá tội nghiệp nha.
 
Upvote 0
cảm ơn thầy nghĩa mong thầy tiếp tục giải đáp them vì e đang bập bẹ nên xin thầy cho 1 đoạn code theo ý tưởng của thầy để em đối chiếu và mở rộng.
Tôi lấy bài trên file bạn làm mẫu, bạn xóa toàn bộ code của bạn và chép tất cả các code tôi viết lại dưới đây rồi chạy xem sao! Bạn ngẫm thử xem, các biến được khai báo nó có tác dụng như thế nào nhé!

Lưu ý, cách mà bạn Add Item lên ListBox khi lọc dữ liệu là không ổn đâu nha, vài ngàn dòng là bạn thấy "phê" liền à, đừng nói chi đến vài trăm ngàn dòng!

Có gì thắc mắc, cứ hỏi tiếp nhé!

Mã:
Private ListArray(), IsClick As Boolean


Private Sub UserForm_Initialize()
    With Sheets("sheet1")
       ListArray = Range(.Range("A2"), .Range("A65536").End(xlUp))
    End With
    ListBox1.List = ListArray
End Sub


Private Sub ListBox1_Click()
    IsClick = True
        With ListBox1
            TextBox1 = .Value
            .Selected(.ListIndex) = False
        End With
    IsClick = False
End Sub


Private Sub Textbox1_Change()


    If IsClick Then Exit Sub
    
    Dim ArrList(), ArrRow()
    Dim ChuoiTim As String
    Dim n As Long, r As Long, u As Long
    
    ChuoiTim = "*" & UCase(TextBox1) & "*"
    
    u = UBound(ListArray)
    
    ReDim ArrRow(1 To u)
    For r = 1 To u
        If UCase(ListArray(r, 1)) Like ChuoiTim Then
            n = n + 1
            ArrRow(n) = r
        End If
    Next
    
    If n Then
        ReDim ArrList(1 To n, 1 To 1)
        For r = 1 To n
            ArrList(r, 1) = ListArray(ArrRow(r), 1)
        Next
        ListBox1.List = ArrList
    Else
        ListBox1.Clear
    End If


End Sub
 
Upvote 0
Web KT
Back
Top Bottom