Lỗi Variable not defined trong code VBA

Liên hệ QC

DMQ

Thành viên dốt
Tham gia
21/3/12
Bài viết
713
Được thích
54
Giới tính
Nam
Em có viết đoạn code đê Lưu dữ liệu từ Form vào sheet nhung bị lỗi "Variable not Defined". Code đây ah:
Mã:
Private Sub Luu1_Click()Dim i As Integer, N As Long
    If tb_ngay1 = "" Or tb_spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation: Exit Sub
Application.ScreenUpdating = False 'giup code chay. nhanh hon
   [B][COLOR=#ff0000] iRow[/COLOR][/B] = Cells(Rows.Count, "F").End(xlUp).Offset(1, 0).Row [B][COLOR=#0000ff]bị lỗi chổ iRowm (đỏ)[/COLOR][/B]


    For i = 0 To ListBox1.ListCount - 1
        Cells(iRow + N, 6) = tb_ngay1
        Cells(iRow + N, 8) = tb_spn1
        
        With ListBox1
            Cells(iRow + N, 9) = .List(i, 1)      'ma so
            Cells(iRow + N, 10) = .List(i, 2)      'ten hang hoa
            Cells(iRow + N, 11) = .List(i, 3)      'don vi tinh
            Cells(iRow + N, 12) = .List(i, 4)     'So luong
        End With
        
        N = N + 1
    Next
    
Application.ScreenUpdating = True
MsgBox ("cap nhat xong")
    
End Sub
Mong các AC xem giúp!!!!
 
Em có viết đoạn code đê Lưu dữ liệu từ Form vào sheet nhung bị lỗi "Variable not Defined". Code đây ah:
Mã:
Private Sub Luu1_Click()Dim i As Integer, N As Long
    If tb_ngay1 = "" Or tb_spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation: Exit Sub
Application.ScreenUpdating = False 'giup code chay. nhanh hon
   [B][COLOR=#ff0000] iRow[/COLOR][/B] = Cells(Rows.Count, "F").End(xlUp).Offset(1, 0).Row [B][COLOR=#0000ff]bị lỗi chổ iRowm (đỏ)[/COLOR][/B]


    For i = 0 To ListBox1.ListCount - 1
        Cells(iRow + N, 6) = tb_ngay1
        Cells(iRow + N, 8) = tb_spn1
        
        With ListBox1
            Cells(iRow + N, 9) = .List(i, 1)      'ma so
            Cells(iRow + N, 10) = .List(i, 2)      'ten hang hoa
            Cells(iRow + N, 11) = .List(i, 3)      'don vi tinh
            Cells(iRow + N, 12) = .List(i, 4)     'So luong
        End With
        
        N = N + 1
    Next
    
Application.ScreenUpdating = True
MsgBox ("cap nhat xong")
    
End Sub
Mong các AC xem giúp!!!!

complie đã miêu tả rõ ràng lỗi rồi mà " Variable not defined" tức là biến này chưa được khải báo !
Bạn thử thêm 1 dòng lệnh Dim irow as integer ở trước irow =........... xem kết quả như thế nào
 
Upvote 0
Cám ơn bạn nhe!!!!! Mình cũng bị đoạn code này nữa(Khi xóa hàng hóa trong ListBox) Code đây Ah:
Mã:
Private Sub XoaHH1_Click()    'neu xoa o row tren cung` thi chon lai gia tri tren cung`
    On Error Resume Next 'neu row cuoi cung`
    If ListBox1.ListIndex = 0 Then
        ListBox1.ListIndex = 1
    End If
    
    Dim lItem As Long, lRows As Long
    Dim bSelected As Boolean
    lRows = ListBox1.ListCount - 1
        For lItem = 0 To lRows
            If ListBox1.Selected(lItem) = True Then 'Row selected
                
                With ListBox1
                    If .ListIndex > -1 Then
                        [B][COLOR=#b22222] lngIndex[/COLOR][/B] = .ListIndex  ->>>Bị lỗi Variable not Defined ngay chổ này [B][COLOR=#0000cd]"lngIndex"[/COLOR][/B]
                        .RemoveItem .ListIndex
                        If lngIndex > .ListCount - 1 Then lngIndex = .ListCount
                        .ListIndex = lngIndex - 1
                    End If
                End With
            End If
        Next


    'dieu chinh STT
    For i = 1 To ListBox1.ListCount
        With ListBox1
            .List(i - 1, 0) = i
        End With
    Next i
    
    stt1 = "" 'neu co


End Sub
Mong bạn chỉ giáo!!!!!
 
Upvote 0
Em có viết đoạn code đê Lưu dữ liệu từ Form vào sheet nhung bị lỗi "Variable not Defined". Code đây ah:
Mã:
Private Sub Luu1_Click()Dim i As Integer, N As Long
    If tb_ngay1 = "" Or tb_spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation: Exit Sub
Application.ScreenUpdating = False 'giup code chay. nhanh hon
   [B][COLOR=#ff0000] iRow[/COLOR][/B] = Cells(Rows.Count, "F").End(xlUp).Offset(1, 0).Row [B][COLOR=#0000ff]bị lỗi chổ iRowm (đỏ)[/COLOR][/B]


    For i = 0 To ListBox1.ListCount - 1
        Cells(iRow + N, 6) = tb_ngay1
        Cells(iRow + N, 8) = tb_spn1
        
        With ListBox1
            Cells(iRow + N, 9) = .List(i, 1)      'ma so
            Cells(iRow + N, 10) = .List(i, 2)      'ten hang hoa
            Cells(iRow + N, 11) = .List(i, 3)      'don vi tinh
            Cells(iRow + N, 12) = .List(i, 4)     'So luong
        End With
        
        N = N + 1
    Next
    
Application.ScreenUpdating = True
MsgBox ("cap nhat xong")
    
End Sub
Mong các AC xem giúp!!!!
Tìm dòng lệnh đầu tiên trong Module: Option Explicit và xóa nó đi là xong.
1 đao giết sạch sẽ
 
Upvote 0
Code này bạn lấy ở đâu vậy?
Người viết code đặt tên biến theo luật Hungarian - đầu tên biến có vài ký tự cho biết kiểu/loại. Điều này chứng tỏ người viết có trường phái đàng hoàng. Việc thiếu sót Dim tên biến có thể coi như hiện tượng lạ.

Biến khai báo toàn cục có đôi khi được thiết kế theo kiểu có một module riêng để khai báo chúng. Khi copy các modules mà thiếu module này thì sẽ bị lỗi biến không khai báo.
Tuy nhiên, như tôi đã nói ở trên, người viết code dùng luật Hungarian, biến toàn cục có những ký tự cho biết chúng là toàn cục. Tóm lại là khá khó hiểu.
 
Upvote 0
Đâu khó hiểu đâu bạn. Chỉ cần bỏ "Option Eplicit" "Một đao giết sạch sẽ" như Anh quanghai1969 chỉ đó.
 
Upvote 0
Đâu khó hiểu đâu bạn. Chỉ cần bỏ "Option Eplicit" "Một đao giết sạch sẽ" như Anh quanghai1969 chỉ đó.

Lời khuyên là không nên bỏ dòng "Option Explicit" ---> Cái lợi chẳng đáng bao nhiêu so với những cái mà bạn bị mất
Ví du sơ sơ:
- Bạn bỏ dòng "Option Explicit" và bỏ luôn khai báo biến, vậy bạn sẽ mất sự trợ giúp của cái popup xổ xuống gợi ý về các thuộc tính, phương thức của biến mỗi khi bạn gõ dấu chấm sau tên biến ấy (ai đủ khả năng nhớ hết mấy thứ này)
- Bạn bỏ dòng "Option Explicit" và bỏ luôn khai báo biến, vậy thì VBA cũng chẳng biết biến ấy là cái giống gì ---> Dẫn đến tốc độ code bị ảnh hưởng ít nhiều (trong một số trường hợp cụ thể sẽ ảnh hưởng rất nhiều)
vân vân...
-----------------------
Ngày trước khi tôi mới học VBA, do chưa biết nên không thèm khai báo biến. Bây giờ biết chút chút, tôi sẽ không bao giờ ra tay "một đao giết sạch sẽ" thế đâu! Rất dã man ---> dã man cho người khác và cho cả chính bản thân mình
Ẹc... Ẹc...
 
Upvote 0
Vậy hả thầy, thế mà em cứ tưởng bỏ đi thì chẳng có ảnh hưởng gỉ, miễn sao code chạy là được. Cám ơn Thầy.
 
Upvote 0
Lời khuyên là không nên bỏ dòng "Option Explicit" ---> Cái lợi chẳng đáng bao nhiêu so với những cái mà bạn bị mất
Ví du sơ sơ:
- Bạn bỏ dòng "Option Explicit" và bỏ luôn khai báo biến, vậy bạn sẽ mất sự trợ giúp của cái popup xổ xuống gợi ý về các thuộc tính, phương thức của biến mỗi khi bạn gõ dấu chấm sau tên biến ấy (ai đủ khả năng nhớ hết mấy thứ này)
- Bạn bỏ dòng "Option Explicit" và bỏ luôn khai báo biến, vậy thì VBA cũng chẳng biết biến ấy là cái giống gì ---> Dẫn đến tốc độ code bị ảnh hưởng ít nhiều (trong một số trường hợp cụ thể sẽ ảnh hưởng rất nhiều)
vân vân...
-----------------------
Ngày trước khi tôi mới học VBA, do chưa biết nên không thèm khai báo biến. Bây giờ biết chút chút, tôi sẽ không bao giờ ra tay "một đao giết sạch sẽ" thế đâu! Rất dã man ---> dã man cho người khác và cho cả chính bản thân mình
Ẹc... Ẹc...

Tôi có nhắc chủ thớt cần tìm hiểu tại sao các biến khác thì khai báo đàng hoàng mà riêng biến ấy thì không.
Không có phần Option Exxplicit sẽ rất khò kiểm soát biến toàn cục.
 
Upvote 0
Vậy hả thầy, thế mà em cứ tưởng bỏ đi thì chẳng có ảnh hưởng gỉ, miễn sao code chạy là được. Cám ơn Thầy.
Người ta bỏ Option Explicit cũng với mục đích khỏi khai báo biến thôi. Mới học thì sẽ chẳng cảm thấy có gì khác biệt giữa việc khai báo biến hoặc không khai báo biến đâu, thậm chí khỏi phải khai báo rườm rà người ta còn khoái nữa là đàng khác. Tuy nhiên, cũng vì mới học VBA nên ta phải tạo những thói quen tốt (mà KHAI BÁO BIẾN RÕ RÀNG là một trong những thói quen nên học). Mai này bạn sẽ thấy nó lợi ích thế nào khi làm những dự án lớn hơn
 
Upvote 0
Xin đề nghị Phụ trách BOX này nên xóa bài của Quang Hải bên trên đi!
 
Upvote 0
Anh Hải dể thương quá, mở cửa cho trộm và nhà xem như là bạn
Ai có biết đâu. Mình toàn chơi kiểu đó. Có được học cơ bản gì đâu. Cứ cái nào chạy được là cứ phang tới. Hèn chi nhiều người nói mình viết code cẩu thả. Giờ thì tin là họ nói đúng. Nhưng cũng không sao, chủ yếu là ham vui mà.
 
Upvote 0
Không xài câu lệnh đó thì kệ 2uang Hải;

/(/hưng viết ra đây sẽ là 0001 khuyến nghị xấu cho những người khác đó, "Thần tượng" của nhóm đông nhiều người à!
 
Upvote 0
Em cũng như bạn Lỗi tương tự ở chỗ Sub LuuHD() xin mọi người chỉ dạy

Sub LuuHD()
Dim Ip As Long, Idd As Long, Rng As Long, i As Long
Dim Ask
Ip = Sheet1.Range("D65535").End(3).Row
Idd = Ip - 11 + 1
i = Sheet2.Range("D65535").End(3).Row
Ask = MsgBox("Ban co muon luu phieu nay khong", vbYesNo, "Thong bao")
If Ask = vbYes Then
If Sheet1.Range("J1").Value > 0 Then
MsgBox "So phieu nay da co trong nhat ky. Kiem tra lai", vbOKOnly, "Thong bao"
Exit Sub
End If
Sheet2.Range("B" & i + 1) = Sheet1.Range("H2") 'So phieu
Sheet2.Range("I" & i + 1) = Sheet1.Range("H34") 'Tong
Sheet2.Range("j" & i + 1) = Sheet1.Range("H35") 'Da TU
Sheet2.Range("k" & i + 1) = Sheet1.Range("H35") 'Con lai
Sheet2.Range("L" & i + 1) = Sheet1.Range("B4") 'Ngay ban
'Sheet2.Range("M" & i + 1) = Sheet1.Range("B2") 'Chu hang
Sheet2.Range("N" & i + 1) = Sheet1.Range("D6") 'Khach hang
Sheet2.Range("O" & i + 1) = Sheet1.Range("D7") 'Dia chi
Sheet1.Range("C11:H" & Ip).Copy Sheet2.Range("C" & i + 1)
With Sheet4.Range("A" & i + 1 & ":O" & i + 1).Resize(Idd)
.Borders.LineStyle = xlContinuous
.Borders(xlInsideHorizontal).Weight = xlHairline
End With
End If
End Sub
Sub IN_hoadon()
Dim Ask
Ask = MsgBox("Ban co muon in phieu nay khong", vbYesNo, "Thong bao")
If Ask = vbYes Then
ActiveWindow.SelectedSheets.PrintOut
End If
End Sub
Sub Xoa_hoadon()
Dim Ask
Ask = MsgBox("Ban co muon xoa phieu nay khong", vbYesNo, "Thong bao")
If Ask = vbYes Then
With Sheet1
.Range("H2").ClearContents
.Range("B4:H4").ClearContents
.Range("D6:D8").ClearContents
.Range("C11:G33").ClearContents
End With
End If
End Sub
 
Upvote 0
Mà lỗi ở dòng lệnh nào vậy bạn? Xin lỗi do chưa có file để thử mới hỏi vậy, thông cảm nha.
 
Upvote 0
Góp ý cho bạn.

1/ Nên đính kèm File để tạo điều kiện thuận tiện cho người trợ giúp trong việc kiểm tra hoặc viết lại code cho gọn hơn.
2/ Xem lại chỗ này nè, gán vào sheet2, tự nhiên ở đâu nhảy ra sheet4.

Mã:
With Sheet4.Range("A" & i + 1 & ":O" & i + 1).Resize(Idd)
 
Upvote 0
Người ta bỏ Option Explicit cũng với mục đích khỏi khai báo biến thôi. Mới học thì sẽ chẳng cảm thấy có gì khác biệt giữa việc khai báo biến hoặc không khai báo biến đâu, thậm chí khỏi phải khai báo rườm rà người ta còn khoái nữa là đàng khác. Tuy nhiên, cũng vì mới học VBA nên ta phải tạo những thói quen tốt (mà KHAI BÁO BIẾN RÕ RÀNG là một trong những thói quen nên học). Mai này bạn sẽ thấy nó lợi ích thế nào khi làm những dự án lớn hơn
bạn ơi cho mình hỏi cụ thể về khai báo biến của VBA này với, code được vài hôm rồi mà nói thật là đi đạo code là chính, do bản chất khai báo biến của VBA mình không rõ và cũng không rõ cách VBA define các biến, funtion như nào.
những ngôn ngữ khác thì trước khi code việc đầu tiên đều phải làm là khai báo biến, funtion tường minh, sau vào thân hàm mail thì mình sẽ call nó ra và sử dụng. VBA thì mình chịu và hiện cũng đang gặp lỗi như chủ thớt ở đây vướng vào. :( option explicit.
 
Upvote 0
Lời khuyên cho bạn là: Đừng bao giờ xài câu lệnh On eRror Resume Next ở những dòng đầu của 1 macro

Với mình xài như vậy là ta phớt lờ đi mọi thứ, kể cả cái sai của mình & như vậy có thể ai đó hay đâu đó gánh dùm cái sai cho mình!
 
Upvote 0
Web KT

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

Back
Top Bottom