Khi nào thì xài biến irow (1 người xem)

  • Thread starter Thread starter DMQ
  • Ngày gửi Ngày gửi
Liên hệ QC

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

DMQ

Thành viên dốt
Tham gia
21/3/12
Bài viết
722
Được thích
57
Giới tính
Nam
Em có tải một file trên DD, trong Form đó có đoạn code để ghi váo sheet
Mã:
Private Sub CmdGhi_Click()
[B][COLOR=#ff0000]Dim i As Integer, N As Long  [/COLOR][COLOR=#0000ff]<----không có irow[/COLOR][/B]


    If CB_LoaiCT = "" Then MsgBox ("Ban chua chon Loai Chung Tu"), vbExclamation: Exit Sub
    If ListBox1.ListCount = 0 Then MsgBox ("ban chua cap nhat Noi dung CT vao Listbox"), vbExclamation: Exit Sub


Application.ScreenUpdating = False 'giup code chay. nhanh hon
    [B][COLOR=#ff0000]iRow[/COLOR][/B] = Cells(Rows.Count, "B").End(xlUp).Offset(1, 0).Row 'xac dinh row cuoi cung` chua' du~ lieu


    For i = 0 To ListBox1.ListCount - 1
        Cells(iRow + N, 2) = CB_LoaiCT
        Cells(iRow + N, 3) = CB_SoCT
        Cells(iRow + N, 4) = CDate(CB_NgayCT)
        Cells(iRow + N, 12) = CB_MNNS
        
        With ListBox1
            Cells(iRow + N, 5) = .List(i, 0)      'noi dung CT
            'Mã NDKT ?
            Cells(iRow + N, 8) = .List(i, 2)      'No
            Cells(iRow + N, 9) = .List(i, 3)      'Co
            Cells(iRow + N, 10) = .List(i, 4)     'So tien
        End With
        
        N = N + 1
    Next
    
Application.ScreenUpdating = True
MsgBox ("cap nhat xong")
    
End Sub
Trong Form đó thì chạy tốt, nhưng khi em coppy vào Form em làm thì code chạy bắt phải khai Biến Irow, lúc đó em phải khai thêm:
Mã:
Dim i As Integer, N As Long, [B][COLOR=#ff0000]irow as Long[/COLOR][/B]
Em đã tìm hết trong code của Anh ấy(hết các code trong File), nhưng không thấy chổ nào khai báo biến Irow mà code vẫn chạy. trong khi đó file của em thì phải khai báo biến Irow.Mong mọi người chỉ giáo, khi nào thì khai báo biến, khi nào không khai mà vẫn thực thi code!!!!!
 
Bạn xem lại ở đâu đó có lệnh
Mã:
 Option Explicit

Lệnh này bắt buột khai báo tường minh các biến mà bạn cần dùng; Mình có lời khuyên là: Nên như vậy trong tất thẩy các trường hợp; Xài nó chỉ có tốt trở lên mà thôi.

Chúc vui.
 
Upvote 0
Có hai trường hợp bạn phải khai báo.

1. Nếu đầu module của bạn có dòng Option Explicit. Từ 'explicit' có nghĩa là 'tách bạch' (không hiểu ngầm). Chọn option này là bạn bảo VBA 'tất cả các biến phải được khai báo trước khi sử dụng, không được xài tới đâu hiểu ngầm tới đó'

2. Nếu ngoài sub, bạn có khai báo tên biến này rồi. Nếu khai báo trong cùng mudule thì nó là biến toàn module. Nếu khai báo ở module khác (bắt buộc phải puiblic) thì nó là biến toàn cục project.
Trường hợp này, nếu bạn không khai báo bên trong sub thì mặc nhiên biến toàn cục sẽ được sử dụng. Nếu không phải do bạn cố ý dùng biến toàn cục thì bạn sẽ rất có khả năng gặp kết quả bất ngờ. Vì vậy, để tránh cái kết quả bất ngờ này, bạn nên khai báo. Code bên trong sub sẽ ưu tiên chọn biến khai báo bên trong sub trước, nếu không thấy, nó mới tìm sang biến module, không thấy thì nó tìm biến toàn project.
 
Upvote 0
Trả lời trực tiếp cho câu hỏi "khi nào thì dùng biến irow"

Bạn dùng biến irow khi bạn cần biết vị trí ô cuối trong sheet trước khi update. Trường hợp đó, biến irow phải được khai báo bên ngoài sub. Khai báo bên trong sub, sau khi thoát sub là biến bị huỷ.

Theo chính xác code trên, nếu bạn không cần biết vị trí ô cuối trước khi update thì biến irow không cần thiết. Bạn có thể dùng N để thay thế nó. Sửa irow + N và irow thành N
 
Upvote 0
Đúng là Code của Anh ấy không có "Option Explicit", cón của em có "Option Explicit". Theo Thầy SA_DQ thì nên có Option Explicit cho tường minh . Em cám ơn Các AC.
 
Upvote 0
Các AC cho em hỏi tiếp ah!!!! sao đoạn code này lỗi màu vàng chổ "mSg":
Mã:
Private Sub cmd_xoamax_Click()  
  If ListBox1.ListCount = 0 Then Exit Sub
    
    Dim Answer
   [B][COLOR=#ff0000] mSg [/COLOR][/B]= mSg & "ban co muon xoa' ma~?" & vbNewLine & _  [B][COLOR=#ff0000]<---bị lỗi vàng ngay chổ"mSg"[/COLOR][/B]
    "- " & ListBox1.List(ListBox1.ListIndex, 0) & vbNewLine & _
    "- " & ListBox1.List(ListBox1.ListIndex, 1)
    
    Answer = MsgBox(mSg, vbYesNo + vbQuestion)
    If Answer = vbNo Then Exit Sub
    If Answer = vbYes Then ListBox1.RemoveItem (ListBox1.ListIndex)
End Sub
Code cũng của Anh đó. (Không có Option Explicit) còn của em có Option Explicit, mong các AC giúp đỡ!!!!(không biết thiếu khai báo gì)
 
Upvote 0
Các AC cho em hỏi tiếp ah!!!! sao đoạn code này lỗi màu vàng chổ "mSg":
Mã:
Private Sub cmd_xoamax_Click()  
  If ListBox1.ListCount = 0 Then Exit Sub
    
    Dim Answer
   [B][COLOR=#ff0000] mSg [/COLOR][/B]= mSg & "ban co muon xoa' ma~?" & vbNewLine & _  [B][COLOR=#ff0000]<---bị lỗi vàng ngay chổ"mSg"[/COLOR][/B]
    "- " & ListBox1.List(ListBox1.ListIndex, 0) & vbNewLine & _
    "- " & ListBox1.List(ListBox1.ListIndex, 1)
    
    Answer = MsgBox(mSg, vbYesNo + vbQuestion)
    If Answer = vbNo Then Exit Sub
    If Answer = vbYes Then ListBox1.RemoveItem (ListBox1.ListIndex)
End Sub
Code cũng của Anh đó. (Không có Option Explicit) còn của em có Option Explicit, mong các AC giúp đỡ!!!!(không biết thiếu khai báo gì)

Bạn cần khai báo 1 biến dạng chuỗi có tên là mSg ở đâu đó trong chương trình;
 
Upvote 0
Tức là thêm " Dim mSg as String" phải không Thầy????
 
Upvote 0
Vậy em thấy bỏ "Option Explicit" cũng chẳng sao, khỏi khai báo biến như code của Anh ấy.
 
Upvote 0
Vậy em thấy bỏ "Option Explicit" cũng chẳng sao, khỏi khai báo biến như code của Anh ấy.
Tùy chọn Option Explicit rất hay đấy chứ, nó sẽ giúp chúng ta kiểm soát được các biến sử dụng trong chương trình. Đôi khi vì lý do gì đó mà ta gõ nhầm tên biến, chẳng hạn "irow" với "irows", nếu có sử dụng tùy chọn này và ta chỉ khai báo biến irow thì khi biên dịch lệnh, ta sẽ phát hiện ra ngay là anh chàng irows đã bị gõ nhầm, còn nếu ta không có tùy chọn này thì chương trình sẽ xem 2 anh chàng irow và irows là 2 biến độc lập (chứ không phải gõ nhầm), dẫn đến có thể phát sinh lỗi mà ta không kiểm soát được.
 
Upvote 0
Vậy em thấy bỏ "Option Explicit" cũng chẳng sao, khỏi khai báo biến như code của Anh ấy.

"Anh ấy" là ai vậy? Bạn chỉ đưa code của 1 cái sub lên, đâu biết thực tế người ta dùng nó trong một project có bao nhiêu module, và trong module chứa cái sub kia còn có gì nữa.

Như tôi đã nhắc nhở, câu hỏi của bạn là "xài biến". Nó khác với lỗi trong code của bạn là "khai báo biến".
Xài có nghĩa là dùng biến ấy để chứa dữ liệu, trị gì đó
Khai báo có nghĩa là báo cho VBA biết rằng trong code sẽ có xài một biến tên như thế, dạng như thế.
Option là loại lệnh dặn trình dịch, không phải là code. Dùng Option là bạn dặn trình dịch "code của tôi sẽ được dịch theo đường lối này..."
Option Explicit là câu lệnh dặn trình dịch rằng "bất cứ biến nào được xài trong module này đều phải được khai báo". Không có câu dặn này, trình dịch thả lỏng cho bạn tự do sử dụng biến mà không cần khai báo.

Về code của bài đầu tiên, như tôi đã nêu ra trong bài #3 và #4, biến irow thực sự không cần thiết phải dùng. Loại bỏ trường hợp tác giả viết code quá tệ, thì có thể do biến này được khai báo nơi khác. Nếu bạn khai báo nó một lần nữa trong sub thì có thể làm cho code nơi khác bị sai.

Tùy chọn Option Explicit rất hay đấy chứ, nó sẽ giúp chúng ta kiểm soát được các biến sử dụng trong chương trình. Đôi khi vì lý do gì đó mà ta gõ nhầm tên biến, chẳng hạn "irow" với "irows", nếu có sử dụng tùy chọn này và ta chỉ khai báo biến irow thì khi biên dịch lệnh, ta sẽ phát hiện ra ngay là anh chàng irows đã bị gõ nhầm, còn nếu ta không có tùy chọn này thì chương trình sẽ xem 2 anh chàng irow và irows là 2 biến độc lập (chứ không phải gõ nhầm), dẫn đến có thể phát sinh lỗi mà ta không kiểm soát được.

Đói với dân viết code chuyên nghiệp việc khai báo biến không chỉ giúp bạn tránh gõ lộn tên biến, nhiệm vụ chính của nó là để xác định tầm vực, tránh lỗi các biến nội bộ và toàn cục ghi chồng lên nhau. Khi nhìn vào code của bài ban đầu. Vì khong có khai báo biến irow cho nên tôi phải dựa vào dòng Option Explicit. Nếu có dòng này thì tôi biết irow được khai báo ngoài sub, và tôi phải cẩn thận vì có thể nó mang ý nghĩa nào đó. Nếu không có dòng này thì tôi biết do chủ code quên khai báo.
 
Lần chỉnh sửa cuối:
Upvote 0
"Anh ấy" là ai vậy? Bạn chỉ đưa code của 1 cái sub lên, đâu biết thực tế người ta dùng nó trong một project có bao nhiêu module, và trong module chứa cái sub kia còn có gì nữa.
file của Anh ấy đây ah:
 

File đính kèm

Upvote 0
Bạn vào cửa sổ VBE, bấm Ctrl+f
Chọn Curent Project.
Gõ irow vào Find what
Tiếp tục bấm find nexxt cho đến khí nó báo khong tìm được nữa.

Bạn sẽ thấy là biến irow chỉ sử dụng ở sub CmdThemMoi_Click(), và không có khai báo ở nơi khác.
Điều này chứng tỏ, như tôi đã nói trước đây, code này là code chắp nối, tác giả lấy ở đâu đó về, hoăch chủinh sửa ở một giai đoạn nào đó mà không bỏ công làm cho an toàn (khai báo đầy đủ). Trong code này, irow là thừa, có thể dùng N để thay thế nó.
 
Upvote 0
Web KT

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

Back
Top Bottom