Hỏi cách dừng vòng lặp khi thoả điều kiện

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

xluan

Thành viên mới
Tham gia
15/8/10
Bài viết
6
Được thích
0
câu lệnh dừng vòng lặp trong file như thế nào, mình không rành mày mò mãi không được xin các cao thủ chỉ dùm./
 

File đính kèm

Bạn thêm 1 dòng màu đỏ vào code của bạn xem sao

Sub CanKe()
Dim Some, StrC As String: Dim Ij As Integer
For Ij = 8 To 999
StrC = "F" & CStr(Ij): Range(StrC).Select
With Selection
If .Offset(, -5) = "" Then Exit For
.FormulaR1C1 = _
"=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"

End With
Next Ij
Exit Sub
End Sub
 
Upvote 0
câu lệnh dừng vòng lặp trong file như thế nào, mình không rành mày mò mãi không được xin các cao thủ chỉ dùm./
Vì không biết bạn làm gì và khi nào muốn dừng vòng lặp nên chỉ đoán mò thôi. Nếu Thầy Sealand hướng dẫn mà đúng ý bạn thì code của bạn có thể như thế này (chép thẳng vào nút)
Mã:
Private Sub CB01_Click()
Dim I As Integer
        I = Range([a8], [a5000].End(xlUp)).Rows.Count + 7
       Range("f8:f" & I).FormulaR1C1 = _
       "=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
End Sub
Thân
 
Upvote 0
Mình chỉ gợi ý 1 cách thoát vòng lặp còn không can thiệp cách làm của bạn ấy . Như vậy bạn ấy sẽ tìm ra cách viết Code trong trường hợp khác. Chứ bài này còn viết gọn hơn nữa:

Mã:
Sub Cthuc()
Sheets("tvi").Range("F8", Sheets("tvi").[a65536].End(xlUp).Offset(, 5)).FormulaR1C1 = _
      "=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
End Sub

Còn tính I của Concogia chỉ cần thế này thôi chứ:

I = [a5000].End(xlUp).Row
 
Lần chỉnh sửa cuối:
Upvote 0
Định vị vùng dữ liệu cho chính xác, vậy sẽ khỏi cần thoát vòng lập làm gì
ví dụ:
PHP:
Sub Test()
  Dim Clls As Range
  For Each Clls In Range([A8], [A65536].End(xlUp))
    Clls.Offset(, 5) = "=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
  Next
End Sub
Cũng có cách khác là dùng Do Loop như sau:
PHP:
Sub Test()
  Dim Clls As Range
  Set Clls = Range("A8")
  Do
    Clls.Offset(, 5) = "=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
    Set Clls = Clls.Offset(1)
  Loop Until IsEmpty(Clls)
End Sub
Vô vàn cách
Ngoài ra, cái công thức quỷ quái này:
"=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
Sao không thay thành:
"=TRIM(RIGHT(SUBSTITUTE(RC[-5],"" "",REPT("" "",LEN(RC[-5]))),LEN(RC[-5])))"
Hoặc ngắn hơn:
"=TRIM(SUBSTITUTE(RC[-5],""°"",""""))"
Gọn hơn không
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là nhiều cách thoát, căn cứ vào công việc cụ thể ta chọn 1 cái bẫy trong chạy vòng lặp. Nếu vướng bẫy thì thoát hay làm gì đó thì tuỳ. Việc thoát thì thường có:

For...
DK-->Exit For
Next

-------------
Do
Dk--->Exit do
Loop

-----------------
Do While Dk hợp lệ
loop

----------------------
Do Until Dk thoat
Loop
----------------------
Do
Loop Until Dk thoat

ngoài ra còn Wind-Wend

Thường thì vòng lặp xác định được thì hay dùng For, nếu không xác định được thì dùng Do giống như bảo cứ làm đi, nếu hết vật liệu thì nghỉ.
 
Upvote 0
Cảm ơn mọi người đã trợ giúp! Code của thầy Sealand rất tuyệt. Công thức của ndu cũng rất tốt, có thể phải thêm istancenum nữa. Code của Concogia sao mình thầy nó chỉ cho kết qủa dòng đầu thôi nhỉ? nhưng cũng rất cảm ơn bạn. Thầy Sealand lại còn cho trang tham khảo nữa. Mới vô diễn dàn mình chẳng biết nút thanks ở đâu để bấm nữa. Do mới bập bẹ tìm hiểu về VBA mình chẳng hiểu gì về Code cả, muốn biết chắc cần nhiều thời gian? Đề nghị mọi người giúp thêm câu lệnh chọn vùng vừa xuất dữ liệu, mục tiêu là copy và dán trị đè lên nó để khỏi vướng công thức; hoặc dán dè lên cột A tươnng ứng.
Với khoảng 10.000 dòng dữ liệu mình thấy Code của thầy Sealand chạy nhanh nhất, gần như tức thời, còn Code mình dưa mọi người giúp nó chạy tới cả 1 phút rưỡi, máy của mình cấu hình PIII thôi 1G2.
icon7.gif

thanks.
 

File đính kèm

Upvote 0
Cảm ơn mọi người đã trợ giúp! Code của thầy Sealand rất tuyệt. Công thức của ndu cũng rất tốt, có thể phải thêm istancenum nữa. Code của Concogia sao mình thầy nó chỉ cho kết qủa dòng đầu thôi nhỉ? nhưng cũng rất cảm ơn bạn. Thầy Sealand lại còn cho trang tham khảo nữa. Mới vô diễn dàn mình chẳng biết nút thanks ở đâu để bấm nữa. Do mới bập bẹ tìm hiểu về VBA mình chẳng hiểu gì về Code cả, muốn biết chắc cần nhiều thời gian? Đề nghị mọi người giúp thêm câu lệnh chọn vùng vừa xuất dữ liệu, mục tiêu là copy và dán trị đè lên nó để khỏi vướng công thức; hoặc dán dè lên cột A tươnng ứng.
Với khoảng 10.000 dòng dữ liệu mình thấy Code của thầy Sealand chạy nhanh nhất, gần như tức thời, còn Code mình dưa mọi người giúp nó chạy tới cả 1 phút rưỡi, máy của mình cấu hình PIII thôi 1G2.
icon7.gif

thanks.
Dùng mảng cho nó nhanh:
PHP:
Private Sub CB03_Click()
  Dim Arr, i As Long, Item
  With Range([a8], [A65536].End(xlUp))
    Arr = .Value
    For i = 1 To UBound(Arr)
      Item = Trim(Replace(Arr(i, 1), "°", ""))
      Arr(i, 1) = IIf(IsNumeric(Item), "'" & Item, Item)
    Next
    .Value = Arr
  End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Việc nhanh chậm là 1 vấn đề , cái cũng đáng để ý là để lại công thức thì sẽ rất hạn chế cho việc sử lý tiếp theo khi bảng tính thường xuyên cập nhật cho hàng vạn cái công thức ấy. Đã Code thì code một thể. Bạn tham khảo Code này xem:


Mã:
Private Sub CB01_Click()
Dim cl as Range
For Each cl In Sheets("tvi").Range("F8:F" & _
WorksheetFunction.CountA(Sheets("tvi").Range("A8:A65536")))
cl.Value = _
Replace(Replace(cl.Offset(, -5).Value, Chr(176), ""), Chr(32), "")
Next
End Sub

2/Còn việc xác định vùng bạn để ý 1 chút là thấy

Sub Cthuc()
Sheets("tvi").Range("F8", Sheets("tvi").[a65536].End(xlUp).Offset(, 5)).FormulaR1C1 = _
"=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
End Sub

Bạn thêm 1 dòng:

Sheets("tvi").Range("F8", Sheets("tvi").[a65536].End(xlUp).Offset(, 5)).Value=Sheets("tvi").Range("F8", Sheets("tvi").[a65536].End(xlUp).Offset(, 5)).Value
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn thầy Sealand, cảm ơn ndu96081631 & bạn concogia nhờ các bạn giúp mà mình đã giải quyết được vấn đề của mình và vỡ ra được một chút về VBA Excel, mình cũng đã hiểu và sử dụng được Code của concogia. Chúc luôn mạnh khoẻ và có một cuộc sống hạnh phúc. Thanks!!!
 
Upvote 0
Ngoài ra, cái công thức quỷ quái này:
"=RIGHT(RC[-5],LEN(RC[-5])-FIND(""*"",SUBSTITUTE(RC[-5],"" "",""*"",LEN(RC[-5])-LEN(SUBSTITUTE(RC[-5],"" "","""")))))"
Sao không thay thành:
"=TRIM(RIGHT(SUBSTITUTE(RC[-5],"" "",REPT("" "",LEN(RC[-5]))),LEN(RC[-5])))"
Hoặc ngắn hơn:
"=TRIM(SUBSTITUTE(RC[-5],""°"",""""))"
Gọn hơn không[/QUOTE]

Có một số trường hợp ở cột A(số xe) chỉ có duy nhất dấu ° và khi đó cần giữ lại dấu này, nên mình mới dùng cái công thức tách tên trong trường hợp này. Đúng là đọc lên mình cũng muốn điếc luôn chả hiểu gì cả, thấy áp dụng được thì dùng. Trường hợp này dùng mảng như thế nào đề nghị bạn giúp cho "trót" nhé.
icon10.gif
 
Upvote 0
Cho tôi hỏi? tôi làm hoá đơn tự in trên report của Access, nhưng tôi trên report dòng số STT, hàng hoá, đơn giá, thành tiền luôn luôn hiển thị 10 dòng, thì tôi phải làm sao? ai biết xin chỉ dùng. Cám ơn nhiều
 
Upvote 0
Việc nhanh chậm là 1 vấn đề , cái cũng đáng để ý là để lại công thức thì sẽ rất hạn chế cho việc sử lý tiếp theo khi bảng tính thường xuyên cập nhật cho hàng vạn cái công thức ấy. Đã Code thì code một thể.

Theo lời khuyên của thầy sealand tôi đã chuyển sang code thay cho việc dùng công thức rất tốt(Sheets bcth) có điều là với việc đặt tên vùng cố định thì kém linh hoạt mà dùng vùng động thì file phải liên tục cập nhật nên khi chạy macro rất chậm, xin thầy và các cao thủ sửa dùm code cho phù hợp hơn.thanks!

http://www.mediafire.com/file/3lmqm2kqdhz6peh/baocao.rar
 
Upvote 0
Web KT

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

Back
Top Bottom