V/v vòng lặp for bị lỗi (1 người xem)

Liên hệ QC

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

hondatron

Thành viên mới
Tham gia
14/9/10
Bài viết
49
Được thích
3
Mục đích công việc: Mỗi lần chạy code VBA thì dữ liệu 2 ô A5 và G4 của sheet(Nhap)sẽ tự động thêm vào cột A2 và B2 của sheet(DA)
Em có dùng vòng lặp for để thực hiện mục đích trên, nhưng chỉ chạy ra kết quả 1 lần, còn những lần sau ko dc. Mong mọi người chỉnh dùm em với

Mã:
Public Sub LocHoa()    '* Khai báo kieu du lieu
    On Error Resume Next
    Dim i As Integer, j As Integer
    Dim ws As Worksheet
    Dim dieukien As String
    Dim VungDo As Range, Cll As Range
    
    ' DAU VàO
    Set ws = Sheets("NHAP")
    
    Set STT = Sheets("DA").Range("A3:A180")
    Set DL = Sheets("DA").Range("B2:B180")
    Set CO = ws.[A5]
    Set VungDo = Sheets("DA").Range("B3:B180")


    Application.ScreenUpdating = False
    
    dieukien = ws.Range("G4").Value
    
    i = 0
    If Trim(dieukien) = "" Then
    
        Exit Sub
    Else
    For Each Cll In STT
    i = i + 1
    If Cll <> vbNull Then
    Cll.Value = CO.Value
    VungDo(i).Value = ws.Range("G4")
    End If
    Exit For
Next
End If
  Application.ScreenUpdating = True
  End Sub
 

File đính kèm

Mục đích công việc: Mỗi lần chạy code VBA thì dữ liệu 2 ô A5 và G4 của sheet(Nhap)sẽ tự động thêm vào cột A2 và B2 của sheet(DA)
Em có dùng vòng lặp for để thực hiện mục đích trên, nhưng chỉ chạy ra kết quả 1 lần, còn những lần sau ko dc. Mong mọi người chỉnh dùm em với

Mã:
Public Sub LocHoa()    '* Khai báo kieu du lieu
    On Error Resume Next
    Dim i As Integer, j As Integer
    Dim ws As Worksheet
    Dim dieukien As String
    Dim VungDo As Range, Cll As Range
    
    ' DAU VàO
    Set ws = Sheets("NHAP")
    
    Set STT = Sheets("DA").Range("A3:A180")
    Set DL = Sheets("DA").Range("B2:B180")
    Set CO = ws.[A5]
    Set VungDo = Sheets("DA").Range("B3:B180")


    Application.ScreenUpdating = False
    
    dieukien = ws.Range("G4").Value
    
    i = 0
    If Trim(dieukien) = "" Then
    
        Exit Sub
    Else
[COLOR=#0000ff]    For Each Cll In STT
    i = i + 1
    If Cll <> vbNull Then
    Cll.Value = CO.Value
    VungDo(i).Value = ws.Range("G4")
    End If
    [/COLOR][COLOR=#ff0000][B]Exit For[/B][/COLOR][COLOR=#0000ff]
Next
[/COLOR]End If
  Application.ScreenUpdating = True
  End Sub

Mới chạy 1 lượt đã exit (chỗ màu đỏ) mất đất rồi còn đâu chạy các lượt khác.
Code này bạn cóp ở đâu mà lạ vậy?
 
Upvote 0
Mình không biết ý bạn định viết gì nhưng code của bạn chỉ chạy 1 vòng là đúng vì cuối vòng 1 gặp lệnh Exit For nên nó nhảy ra luôn. Chỉ cần bỏ dòng lệnh này là chạy bình thương.\
Chiểu theo code này của bạn thì có thể viết thành

Mã:
Sub TEST()
Dim Cl As Range
If Trim(Sheet3.[G4]) <> "" Then
For Each Cl In Sheet2.[A3:A180]
If Cl <> vbNull Then
Cl.Value = Sheet3.[A5]
Cl.Offset(, 1) = Sheet3.[G4]
End If
Next
End If
End Sub
 
Upvote 0
Mã:
Sub TEST()
Dim Cl As Range
If Trim(Sheet3.[G4]) <> "" Then
For Each Cl In Sheet2.[A3:A180]
If Cl <> vbNull Then
Cl.Value = Sheet3.[A5]
Cl.Offset(, 1) = Sheet3.[G4]
End If
Next
End If
End Sub

Em cảm ơn bác sealand.
Mục đích của em khi em tạo 1 button, khi nhập dữ liệu vào 2 ô bên sheet nhập, em click vào button thì nó sẽ ghi vào 2 ô chưa có dữ liệu tương ứng cột A2, B2. Cữ mỗi lần ấn thêm thì nó ghi giá trị theo thứ tự lên (A3,B3); (A4,B4); (A5,B5);......

em ko biết đặt exit for ở đâu trong đoạn mã để kết thúc vòng lặp for để có kết quả đúng
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn bác sealand.
Mục đích của em khi em tạo 1 button, khi nhập dữ liệu vào 2 ô bên sheet nhập, em click vào button thì nó sẽ ghi vào 2 ô chưa có dữ liệu tương ứng cột A2, B2. Cữ mỗi lần ấn thêm thì nó ghi giá trị theo thứ tự lên (A3,B3); (A4,B4); (A5,B5);......

Nếu mình hiểu đúng ý bạn nói thì cần gì vòng lặp, hay bạn có ý gì khác ? Bạn thử cái này xem sao.

Mã:
Sub LocHoa()   Dim Stt As Long
   Dim Ma As String
   Dim Target As Range
   Stt = Sheets("NHAP").Range("A5").Value
   Ma = Sheets("NHAP").Range("G4").Value
   Set Target = Sheets("DA").Range("A65000").End(xlUp).Offset(1)
   Target.Value = Stt: Target.Offset(, 1).Value = Ma
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu mình hiểu đúng ý bạn nói thì cần gì vòng lặp, hay bạn có ý gì khác ?

Tại có trường hợp em nhập dữ liệu sai, em muốn xoá đi, thì em vào sheet(DA) xoá dòng đó đi rồi nhập lại thì nó sẽ ghị lại đúng dòng đó. Nên em nghĩ mình phải sử dụng vòng lặp
 
Upvote 0
Thế thì phải viết thế này:

Mã:
Sub TEST()
Dim Cl As Range, eR
On Error GoTo Thoat
If Sheet3.[G4] = vbNull Then Exit Sub
If MsgBox("Nhap moi nhan OK", vbOKCancel + vbDefaultButton1 + vbInformation, "THONG BAO") = vbOK Then
Set Cl = Sheet2.[A65000].End(xlUp).Offset(1)
Else
eR = InputBox("Sua dong bao nhieu tren sheet DA ?")
Set Cl = Sheet2.Cells(eR, "A")
End If
Cl.Value = Sheet3.[A5]
Cl.Offset(, 1) = Sheet3.[G4]
Exit Sub
Thoat:
MsgBox "Co the ban nhap dong sua khong dung???"
End Sub
 
Upvote 0
Tại có trường hợp em nhập dữ liệu sai, em muốn xoá đi, thì em vào sheet(DA) xoá dòng đó đi rồi nhập lại thì nó sẽ ghị lại đúng dòng đó. Nên em nghĩ mình phải sử dụng vòng lặp
PHP:
Sub giupban()
    a = Range("A" & Rows.Count).End(3).Row
    For i = 2 To a + 1
        If Sheets("DA").Cells(i, 1) = "" Then
            k = i
            Exit For
        End If
    Next
  Sheets("DA").Cells(k, 1) = Sheets("NHAP").Cells(5, 1)
  Sheets("DA").Cells(k, 2) = Sheets("NHAP").Cells(4, 7)
End Sub
hoặc:
PHP:
Sub giupban2()
    i = 2
    Do Until Sheets("DA").Cells(i, 1) = 0
       i = i + 1
    Loop
  Sheets("DA").Cells(i, 1) = Sheets("NHAP").Cells(5, 1)
  Sheets("DA").Cells(i, 2) = Sheets("NHAP").Cells(4, 7)
End Sub
Bạn xem đúng ý bạn chưa nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom