Lâu thoát khỏi vòng lặp For Next (1 người xem)

Liên hệ QC

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

canguocs

Thành viên hoạt động
Tham gia
28/6/14
Bài viết
100
Được thích
7
Mã:
Sub Loi()
    Dim Rng As Range, Cll As Range
    Application.ScreenUpdating = False
    Set Rng = Sheet1.Range("C53:C" & Sheet1.[C65000].End(xlUp).Row)
    For Each Cll In Rng
    If Cll = 8866 And Cll.Offset(, 3) <> Cll.Offset(, 17) Then
    MsgBox "Sai roi, lam lai"
    Else
    MsgBox "Dung roi"
    If Cll = 8865 And Cll.Offset(, 4) <> Cll.Offset(, 17) Then
    MsgBox "Sai roi, lam lai"
    Else
    MsgBox "Dung roi"
    End If
    End If
     Next
     Application.ScreenUpdating = True
   End Sub
Em có đoạn code như sau
Khi chạy code vẫn hiện cảnh báo đúng rồi nhưng máy bị đơ luôn
Không biết có phải do vòng lặp for Next ko ah
vì lý do bảo mật nên em chưa đưa file gốc lên được ah
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn sử dụng msgbox để thông báo, nếu giả định số dòng dữ liệu của bạn là 6000 dòng thì có tới 6000 lần thông báo, bạn mất 1 giây để kích Ok cho hộp thoại thì 6000 giây là con số khá lâu.

Bạn có thể thay vì dùng msgbox bằng cách gán giá trị thông báo sang cell bên cạnh rồi dùng filter để lọc tình trạng như thế sẽ khả thi hơn.
 
Upvote 0
Mã:
Sub Loi()
    Dim Rng As Range, Cll As Range
    Application.ScreenUpdating = False
    Set Rng = Sheet1.Range("C53:C" & Sheet1.[C65000].End(xlUp).Row)
    For Each Cll In Rng
    If Cll = 8866 And Cll.Offset(, 3) <> Cll.Offset(, 17) Then
    MsgBox "Sai roi, lam lai"
    Else
    MsgBox "Dung roi"
    If Cll = 8865 And Cll.Offset(, 4) <> Cll.Offset(, 17) Then
    MsgBox "Sai roi, lam lai"
    Else
    MsgBox "Dung roi"
    End If
    End If
     Next
     Application.ScreenUpdating = True
   End Sub
Em có đoạn code như sau
Khi chạy code vẫn hiện cảnh báo đúng rồi nhưng máy bị đơ luôn
Không biết có phải do vòng lặp for Next ko ah
vì lý do bảo mật nên em chưa đưa file gốc lên được ah

PHP:
Sub Loi()
    Dim Rng As Range, Cll As Range
    Application.ScreenUpdating = False
    Set Rng = Sheet1.Range("C53:C" & Sheet1.[C65000].End(xlUp).Row)
    For Each Cll In Rng
         If Cll = 8866 And Cll.Offset(, 3) <> Cll.Offset(, 17) Then
            MsgBox "Sai roi, lam lai"
         Else
            MsgBox "Dung roi"
         End If
         If Cll = 8865 And Cll.Offset(, 4) <> Cll.Offset(, 17) Then
            MsgBox "Sai roi, lam lai"
         Else
            MsgBox "Dung roi"
         End If
     Next
     Application.ScreenUpdating = True
End Sub
 
Upvote 0
PHP:
Sub Loi()
    Dim Rng As Range, Cll As Range
    Application.ScreenUpdating = False
    Set Rng = Sheet1.Range("C53:C" & Sheet1.[C65000].End(xlUp).Row)
    For Each Cll In Rng
         If Cll = 8866 And Cll.Offset(, 3) <> Cll.Offset(, 17) Then
            MsgBox "Sai roi, lam lai"
         Else
            MsgBox "Dung roi"
         End If
         If Cll = 8865 And Cll.Offset(, 4) <> Cll.Offset(, 17) Then
            MsgBox "Sai roi, lam lai"
         Else
            MsgBox "Dung roi"
         End If
     Next
     Application.ScreenUpdating = True
End Sub
Lúc đầu em cũng làm giống cách của anh nhưng vấn bị đơ anh ah
 
Upvote 0
Lúc đầu em cũng làm giống cách của anh nhưng vấn bị đơ anh ah

Xét về cú pháp code của bạn là sai nên sửa lại như thế, còn khi chạy code bị đơ có thể do dữ liệu của bạn.
Nhìn tổng quát code này không xài được đâu. Không ai xài For Next cho trường hợp này cả.
Muốn hiện thông báo thì chỉ xét 1 ô nào khi nhập dữ liệu thôi.
Không có file thì khó mà có giải pháp hợp lý
 
Upvote 0
Bạn sử dụng msgbox để thông báo, nếu giả định số dòng dữ liệu của bạn là 6000 dòng thì có tới 6000 lần thông báo, bạn mất 1 giây để kích Ok cho hộp thoại thì 6000 giây là con số khá lâu.

Bạn có thể thay vì dùng msgbox bằng cách gán giá trị thông báo sang cell bên cạnh rồi dùng filter để lọc tình trạng như thế sẽ khả thi hơn.

Em hiểu ý anh rồi ah,
cảm ơn anh đã góp ý
Đoạn code trên có thể viết cách khác như anh Hải nói ko ah
 
Upvote 0
Xét về cú pháp code của bạn là sai nên sửa lại như thế, còn khi chạy code bị đơ có thể do dữ liệu của bạn.
Nhìn tổng quát code này không xài được đâu. Không ai xài For Next cho trường hợp này cả.
Muốn hiện thông báo thì chỉ xét 1 ô nào khi nhập dữ liệu thôi.
Không có file thì khó mà có giải pháp hợp lý

Anh Hải sửa giúp em đoạn code trên được ko ah
Em gửi thử file giả lập đến cột T đấy ah
 
Upvote 0
Bạn có thể viết như thế này, sẽ nhanh hơn chút đĩnh:

PHP:
     For Each Cll In Rng
         If Cll = 8866 And Cll.Offset(, 3) <> Cll.Offset(, 17) Then
            Cll.Interior.Colorindex=36
         End If
         If Cll = 8865 And Cll.Offset(, 4) <> Cll.Offset(, 17) Then _
            Cll.Interior.Colorindex=38
     Next Cll
 
Upvote 0
PHP:
     For Each Cll In Rng
         If Cll = 8866 And Cll.Offset(, 3) <> Cll.Offset(, 17) Then
            Cll.Interior.Colorindex=36
         End If
         If Cll = 8865 And Cll.Offset(, 4) <> Cll.Offset(, 17) Then _
            Cll.Interior.Colorindex=38
     Next Cll
Cách của bác cũng hay ah
Hiện cảnh báo màu bằng Interior.Colorindex 36,38
Em cảm ơn nhé!
 
Upvote 0
Anh Hải sửa giúp em đoạn code trên được ko ah
Em gửi thử file giả lập đến cột T đấy ah
Code theo file giả lập
PHP:
Sub abc()
Dim data(), i
data = Range([C3], [C65536].End(3)).Resize(, 18).Value
For i = 1 To UBound(data)
   If data(i, 1) = 8866 Then
      If data(i, 4) <> data(i, 18) Then
         data(i, 3) = "SAI"
      Else
         data(i, 3) = "DUNG"
      End If
   ElseIf data(i, 1) = 8865 Then
      If data(i, 5) <> data(i, 18) Then
         data(i, 3) = "SAI"
      Else
         data(i, 3) = "DUNG"
      End If
   End If
Next
[C3].Resize(i - 1, 18) = data
End Sub
 
Upvote 0
Code theo file giả lập
PHP:
Sub abc()
Dim data(), i
data = Range([C3], [C65536].End(3)).Resize(, 18).Value
For i = 1 To UBound(data)
   If data(i, 1) = 8866 Then
      If data(i, 4) <> data(i, 18) Then
         data(i, 3) = "SAI"
      Else
         data(i, 3) = "DUNG"
      End If
   ElseIf data(i, 1) = 8865 Then
      If data(i, 5) <> data(i, 18) Then
         data(i, 3) = "SAI"
      Else
         data(i, 3) = "DUNG"
      End If
   End If
Next
[C3].Resize(i - 1, 18) = data
End Sub

Dạ, em cảm ơn anh nhé
phải thêm cột phụ data(i,3) và cho vào mảng là giải quyết được
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub Loi()
    Dim Rng As Range, Cll As Range
    Application.ScreenUpdating = False
    Set Rng = Sheet1.Range("C53:C" & Sheet1.[C65000].End(xlUp).Row)
    For Each Cll In Rng
    If Cll = 8866 Then
        If Cll.Offset(, 3) <> Cll.Offset(, 17) Then
        Cll.Offset(, 18).Value = "Sai roi"
        Else
        Cll.Offset(, 18).Value = "Dung roi"
        End If
   
    ElseIf Cll = 8865 Then
       If Cll.Offset(, 4) <> Cll.Offset(, 17) Then
        Cll.Offset(, 18).Value = "Sai roi"
        Else
        Cll.Offset(, 18).Value = "Dung roi"
        End If
    End If
    Next
     Application.ScreenUpdating = True
   End Sub
Em gửi lại code không dùng mảng cho những bạn mới học như em cùng tham khảo (sau khi tham khảo code mảng của anh Hải ah)
 
Upvote 0
Web KT

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

Back
Top Bottom