Em bị lỗi vòng lặp For với điều kiện cho trước.

Liên hệ QC

diemngoc.ts

Thành viên mới
Tham gia
1/8/18
Bài viết
16
Được thích
0
Cảm ơn mọi người đã giúp đỡ em những lần trước ạ. Em mới làm quen VBA nên giờ lại gặp lỗi nữa ạ, Vòng lặp FOR của em nó không trả về giá trị cần tìm mà cứ trả về giá trị đầu tiên không à. Hàm của em là:
Mã:
Function ketqua( a,z, solieu As String)
If a < 2018 And solieu = "lai" Then

       ketqua = "0-0"

ElseIf a >= 2018 And solieu = "lai" Then

       If (z Mod 250 = 0) Then

             n = z / 250 - 1

      ElseIf (z Mod 250 <> 0) Then

             n = WorksheetFunction.RoundDown(z / 250, 0)

      End If

ketqua = n & "-5"

ElseIf solieu <> "lai" Then

Dim soluong As Variant

soluong = Array(5, 10, 15, 25, 35)

khoang = 80

         If (z Mod 250 = 0) Then

              n_min = z / 250 - 1

         ElseIf (z Mod 250 <> 0) Then

              n_min = WorksheetFunction.RoundDown(z / 250, 0)

         End If

n_max = WorksheetFunction.Max(1, WorksheetFunction.RoundDown((z - khoang * 2 - 25) / (khoang + 25), 0) + 1)

For j = 0 To UBound(soluong)

          For i = n_min To n_max

                If 0.85*i *  soluong(j)^2 >= solieu Then Exit Function

                ketqua = i & "-" & soluong(j)

           Next i

Next j

End If

End Function

Hàm của em e muốn cho n chạy trước tương ứng với n sẽ đưa ra giá trị số lượng và nếu nó lớn hơn dữ liệu đầu vào của em thì sẽ đưa ra cặp n và j. Nhưng em nhập:
=ketqua(2017,1012,900) nó cứ ra 4-15 trong khi 0.85*4*15^2<900.
Mong mọi người giúp em ạ.
 

File đính kèm

Lần chỉnh sửa cuối:
(I) Mình chạy hàm của bạn trên cửa sổ Immediate, thì nhận được các kết quả sau:
?KetQua(2017,1012,"lai")
0-0
?KetQua(2018,1012,"lai")
4-5
?KetQua(2017,1012,"l0")
8-35
?KetQua(2017,1000,"l9")
8-35

(II) Bạn làm về kỹ thuật thì cho mình khuyên bạn 1 lời: Hãy tường minh trong khi xài VBA
Có tường minh thì bạn sẽ dễ tìm lỗi do mình gây ra.
 
Upvote 0
(I) Mình chạy hàm của bạn trên cửa sổ Immediate, thì nhận được các kết quả sau:
?KetQua(2017,1012,"lai")
0-0
?KetQua(2018,1012,"lai")
4-5
?KetQua(2017,1012,"l0")
8-35
?KetQua(2017,1000,"l9")
8-35

(II) Bạn làm về kỹ thuật thì cho mình khuyên bạn 1 lời: Hãy tường minh trong khi xài VBA
Có tường minh thì bạn sẽ dễ tìm lỗi do mình gây ra.
Dạ vậy kết quả cũng không như mình mong muốn ạ, bạn có thể giúp mình lỗi là chỗ nào không ạ?
 
Upvote 0
nhấn phím Tab thut ra thut vô cho đúng cấp cột sẽ dễ thấy bị gì
Chủ thớt có thụt thò rồi mà anh nhưng vì chép bài vào khung viết bài nên bị cắt mất cái thụt thò ấy. :)

--------
Không biết làm sao cho diễn đàn hướng dẫn/ bắt buộc chép nội dung code, công thức vào đúng vị trí. Bó tay.

1537949687589.png
 
Upvote 0
Chủ thớt có thụt thò rồi mà anh nhưng vì chép bài vào khung viết bài nên bị cắt mất cái thụt thò ấy. :)

--------
Không biết làm sao cho diễn đàn hướng dẫn/ bắt buộc chép nội dung code, công thức vào đúng vị trí. Bó tay.

View attachment 204531
Có thể xử lý hơi khó nên bắt người dùng phải theo, không theo ráng chịu :(
 
Upvote 0
Có thể xử lý hơi khó nên bắt người dùng phải theo, không theo ráng chịu :(

Chủ thớt có thụt thò rồi mà anh nhưng vì chép bài vào khung viết bài nên bị cắt mất cái thụt thò ấy. :)

--------
Không biết làm sao cho diễn đàn hướng dẫn/ bắt buộc chép nội dung code, công thức vào đúng vị trí. Bó tay.

View attachment 204531
Nhờ bạn mình mới biết cách viết hàm trên diễn đàn, cảm ơn bạn nhiều nha :):)
Mình đã sửa théo đúng quy định rồi ạ.
 
Upvote 0
Cảm ơn mọi người đã giúp đỡ em những lần trước ạ. Em mới làm quen VBA nên giờ lại gặp lỗi nữa ạ, Vòng lặp FOR của em nó không trả về giá trị cần tìm mà cứ trả về giá trị đầu tiên không à. Hàm của em là:
Mã:
Function ketqua( a,z, solieu As String)
If a < 2018 And solieu = "lai" Then

       ketqua = "0-0"

ElseIf a >= 2018 And solieu = "lai" Then

       If (z Mod 250 = 0) Then

             n = z / 250 - 1

      ElseIf (z Mod 250 <> 0) Then

             n = WorksheetFunction.RoundDown(z / 250, 0)

      End If

ketqua = n & "-5"

ElseIf solieu <> "lai" Then

Dim soluong As Variant

soluong = Array(5, 10, 15, 25, 35)

khoang = 80

         If (z Mod 250 = 0) Then

              n_min = z / 250 - 1

         ElseIf (z Mod 250 <> 0) Then

              n_min = WorksheetFunction.RoundDown(z / 250, 0)

         End If

n_max = WorksheetFunction.Max(1, WorksheetFunction.RoundDown((z - khoang * 2 - 25) / (khoang + 25), 0) + 1)

For j = 0 To UBound(soluong)

          For i = n_min To n_max

                If 0.85*i *  soluong(j) >= solieu Then Exit Function

                ketqua = i & "-" & soluong(j)

           Next i

Next j

End If

End Function

Hàm của em e muốn cho n chạy trước tương ứng với n sẽ đưa ra giá trị số lượng và nếu nó lớn hơn dữ liệu đầu vào của em thì sẽ đưa ra cặp n và j. Nhưng em nhập:
=ketqua(2017,1012,900) nó cứ ra 4-15 trong khi 0.85*4*15^2<900.
Mong mọi người giúp em ạ.
Không hoàn toàn hiểu hết ý của bạn nhưng bạn thử thay 2 dòng dưới đây
Mã:
If 0.85 * I * soluong(j) ^ 2 >= solieu Then Exit Function
    ketqua = I & "-" & soluong(j)
bằng mấy dòng dưới đây xem ra sao
Mã:
If 0.85 * I * soluong(j) ^ 2 >= solieu Then
    ketqua = I & "-" & soluong(j)
    Exit Function
End If
 
Upvote 0
Không hoàn toàn hiểu hết ý của bạn nhưng bạn thử thay 2 dòng dưới đây
Mã:
If 0.85 * I * soluong(j) ^ 2 >= solieu Then Exit Function
    ketqua = I & "-" & soluong(j)
bằng mấy dòng dưới đây xem ra sao
Mã:
If 0.85 * I * soluong(j) ^ 2 >= solieu Then
    ketqua = I & "-" & soluong(j)
    Exit Function
End If
Dạ nó vẫn không ra như mong muốn, mục đích của mình là tìm ra 2 giá trị n và soluong sao cho 0.85*n*soluong^2> một giá trị có sẵn ạ.
 
Upvote 0
Code của bạn hãi bỏ bố. Ít nhất, nếu bạn khong thể chú thích nó làm cái gì thì cũng nên cho cỡ một chục ví dụ đầu ra đầu vào để còn đoán bạn muốn cái gì.
 
Upvote 0
Dạ nó vẫn không ra như mong muốn, mục đích của mình là tìm ra 2 giá trị n và soluong sao cho 0.85*n*soluong^2> một giá trị có sẵn ạ.
Lỗi ủa bạn là lỗi lôgíc. Với code của bạn thì giá trị trả về là của vòng lặp trước chứ không phải của vòng lặp hiện hành.

Với code đã sửa của CHAOQUAY thì đúng ý rồi còn gì. Kết quả là 5-15. Rõ ràng 0.85*5*15^2 > 900
 
Upvote 0
Web KT

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

Back
Top Bottom