Xin hướng dẫn tạo vòng lặp đến khi giá trị của 1 biểu thức không đổi

Liên hệ QC

wanghuy3

Thành viên mới
Tham gia
2/3/12
Bài viết
32
Được thích
2
Nghề nghiệp
nhân viên ocean bank
Xin chào mọi người, tôi đang làm 1 form xác định ngày cuối cuối của một dự án
VD: tôi muốn xác tôi nhập vào ngày đầu là ngày 25/4/2018 khoảng thời gian là 5 ngày tức là đến ngày 30/4
trong vùng Sheet2.Range("D2:D31") tôi đã khai báo có ngày 30/4 và 1/5.
khi tôi làm theo đoạn mã này thì ngày cuối ở bước 1 trả về 30/4 thì xác định đây là lễ -> ngay_le = 1
cho đến ngày cuối ở Bước 2 sẽ trả về 1/5
bây giờ tôi muốn lặp lại giống ngày cuối ở bước 1 cho đến khi ngày tiếp theo không phải là ngày lễ ---> trả về 2/5
Tổng quát hơn tôi giả định rằng từ 30/4 đến 4/5 là ngày nghĩ lễ thì số trả về ngày cuối là 5/5.
Rất mong được mọi người giúp đỡ, xin cảm ơn mọi người!!

.....
ngay_le = 0 '----> Ngày lễ
ngay_cuoi = ngay_dau + khoang_tgian '---> bước 1
For Each clls In Sheet2.Range("D2:D31") '-----> Vùng dữ liệu khai báo các ngày lễ
If clls.Value >= ngay_dau And clls.Value <= ngay_cuoi Then
ngay_le = ngay_le + 1
Else
ngay_le = ngay_le + 0
End If
Next clls
ngay_cuoi = ngay_dau + khoang_tgian + ngay_le '--->bước 2
next
 
Xin chào mọi người, tôi đang làm 1 form xác định ngày cuối cuối của một dự án
VD: tôi muốn xác tôi nhập vào ngày đầu là ngày 25/4/2018 khoảng thời gian là 5 ngày tức là đến ngày 30/4
trong vùng Sheet2.Range("D2:D31") tôi đã khai báo có ngày 30/4 và 1/5.
khi tôi làm theo đoạn mã này thì ngày cuối ở bước 1 trả về 30/4 thì xác định đây là lễ -> ngay_le = 1
cho đến ngày cuối ở Bước 2 sẽ trả về 1/5
bây giờ tôi muốn lặp lại giống ngày cuối ở bước 1 cho đến khi ngày tiếp theo không phải là ngày lễ ---> trả về 2/5
Tổng quát hơn tôi giả định rằng từ 30/4 đến 4/5 là ngày nghĩ lễ thì số trả về ngày cuối là 5/5.
Rất mong được mọi người giúp đỡ, xin cảm ơn mọi người!!

.....
ngay_le = 0 '----> Ngày lễ
ngay_cuoi = ngay_dau + khoang_tgian '---> bước 1
For Each clls In Sheet2.Range("D2:D31") '-----> Vùng dữ liệu khai báo các ngày lễ
If clls.Value >= ngay_dau And clls.Value <= ngay_cuoi Then
ngay_le = ngay_le + 1
Else
ngay_le = ngay_le + 0
End If
Next clls
ngay_cuoi = ngay_dau + khoang_tgian + ngay_le '--->bước 2
next
Đọc câu tôi muốn xác tôi nhập vào là hết nghĩ luôn bạn à.
 
Upvote 0
Bạn tham khảo hàm networkdays.intl thử xem
 
Upvote 0
Xin chào mọi người, tôi đang làm 1 form xác định ngày cuối cuối của một dự án
VD: tôi muốn xác tôi nhập vào ngày đầu là ngày 25/4/2018 khoảng thời gian là 5 ngày tức là đến ngày 30/4
trong vùng Sheet2.Range("D2:D31") tôi đã khai báo có ngày 30/4 và 1/5.
khi tôi làm theo đoạn mã này thì ngày cuối ở bước 1 trả về 30/4 thì xác định đây là lễ -> ngay_le = 1
cho đến ngày cuối ở Bước 2 sẽ trả về 1/5
bây giờ tôi muốn lặp lại giống ngày cuối ở bước 1 cho đến khi ngày tiếp theo không phải là ngày lễ ---> trả về 2/5
Tổng quát hơn tôi giả định rằng từ 30/4 đến 4/5 là ngày nghĩ lễ thì số trả về ngày cuối là 5/5.
Rất mong được mọi người giúp đỡ, xin cảm ơn mọi người!!

.....
ngay_le = 0 '----> Ngày lễ
ngay_cuoi = ngay_dau + khoang_tgian '---> bước 1
For Each clls In Sheet2.Range("D2:D31") '-----> Vùng dữ liệu khai báo các ngày lễ
If clls.Value >= ngay_dau And clls.Value <= ngay_cuoi Then
ngay_le = ngay_le + 1
Else
ngay_le = ngay_le + 0
End If
Next clls
ngay_cuoi = ngay_dau + khoang_tgian + ngay_le '--->bước 2
next
Nếu muốn lập trình VBA thì dùng vòng lặp
Mã:
Do While ....

...

Loop

hay
Mã:
Do

...

Loop Until...
 
Upvote 0
Có tính ngày cuối tuần hôn?
Nếu tính được cuối tuần thì quá tốt ạ
Bài đã được tự động gộp:

Nếu muốn lập trình VBA thì dùng vòng lặp
Mã:
Do While ....

...

Loop

hay
Mã:
Do

...

Loop Until...
Tôi cũng dự định là dùng vòng lặp, cứ lặp vòng đó đến khi ngày lễ vòng sau = ngày lễ vòng lặp trước (hoặc ngày cuối của vòng sau bằng vòng trước) nhưng không biết viết thành điều kiện loop until như thế nào, mong bạn hướng dẫn rõ hơn!
Bài đã được tự động gộp:

Mình đang làm một form nhập liệu nên muốn viết VBa luôn, mình sẽ nghiên cứu thêm về hàm này xem có đưa vào vba được ko
Bài đã được tự động gộp:

Đọc câu tôi muốn xác tôi nhập vào là hết nghĩ luôn bạn à.
Sory bạn, buồn ngủ mắt nhắm mở viết sai chính tả trầm trọng quá ^^
 
Lần chỉnh sửa cuối:
Upvote 0
Đầu tiên chúng ta fải có vài thỏa thuận trước với nhau, như sau:
PHP:
[ATTACH=full]209389[/ATTACH]
1./ Nếu ngày đầu là 25/4/2018 & kết thúc sau 1 ngày, thì ngày kết thúc sẽ fải là 26/4/2018
2./ Cơ quan bạn chỉ có 1 ngày cuối tuần (như được bôi đậmtrong hình)

3./ Như vậy, nếu ngày đầu vẫn là 25/4/2018 & kết thúc sau 5 ngày; Thì ngày kết thúc theo qui ước sẽ là 02/05/2018

Fương hướng chắc sẽ trãi qua các công đoạn sau:

A.) Lập danh sách các ngày nghĩ lễ trong năm
Danh sách này bao gồm mươi ngày do Nhà nước qui định & các ngày truyền thống của CQ bạn (ví dụ là 03)
Danh sách gồm [Ngày nghĩ] & [Thứ (của ngày lễ đó)]
Ta gán tên cho danh mục này là 'NLe' chẳng hạn
B.) Khai báo 1 biến đếm để xài
C.)Tạo vòng lặp duyệt từ ngày bắt đầu cho đến tổng của 'Số ngày cần để kết thúc' + (13+1)
Cứ qua mỗi 1 ngày, ta lấy ngày đó tra 2 lần:
Lần 1: Có fải là ngày Chủ nhật không? Nếu không fải thì tăng biến đềm lên 1
Lần 2: Có fải ngày này trong danh sách ngày nghĩ của CQ qui định hay không
Nếu fải thì trừ biếm đếm đi 1 ngày
Vòng lặp thoát với điều kiện biến đếm bằng với số ngày (đã định trước)

Chúc bạn thành công!
 

File đính kèm

  • 1544806571540.png
    1544806571540.png
    7.9 KB · Đọc: 4
Upvote 0
soNgay = 0
ngay_cuoi = ngay_dau
Do While ngay < khoang_thoigian
ngay_cuoi = ngay_cuoi + 1
If Not IsChuNhat(ngay_cuoi) Then
If Not IsNgayLe(ngay_cuoi) Then soNgay = soNgay + 1
End If
Loop

Viết thêm 2 hàm IsChuNhat và IsNgayLe
 
Upvote 0
Nếu tính được cuối tuần thì quá tốt ạ
Bài đã được tự động gộp:


Tôi cũng dự định là dùng vòng lặp, cứ lặp vòng đó đến khi ngày lễ vòng sau = ngày lễ vòng lặp trước (hoặc ngày cuối của vòng sau bằng vòng trước) nhưng không biết viết thành điều kiện loop until như thế nào, mong bạn hướng dẫn rõ hơn!
Bài đã được tự động gộp:


Mình đang làm một form nhập liệu nên muốn viết VBa luôn, mình sẽ nghiên cứu thêm về hàm này xem có đưa vào vba được ko
Bài đã được tự động gộp:


Sory bạn, buồn ngủ mắt nhắm mở viết sai chính tả trầm trọng quá ^^
Bạn gửi file ví dụ lên xem sao
 
Upvote 0
Function IsChuNhat(byVal d As Date) As Boolean
IsChuNhat = (UCase(Format(d, "DDD")) = "SUN")
' hoặc là
' IsChuNhat = (Weekday(d, vbSunday) = 1)
End Function

Function IsNgayLe(byVal d As Date, rg As Range) As Boolean
IsNgayLe = IsNumeric(Application.Match(d, rg, 0))
End Function

Lưu ý là hàm IsNgayLe ở trên giả sử rằng cái range chứa ngày lễ chỉ nhỏ thôi. Nếu là range lớn, rất nhiều ngày thì phải dùng giải thuật khác:
Giải thuật 1: Gồm thêm 1 ô 0 ở đầu và dùng Match 1 để buộc nó tìm theo nhị phân. Lấy chỉ số tìm ra so sánh, nếu đúng ngày thì là tìm được.
Giải thuật 2: Dùng phép dò luỹ tiến. Dò từ đầu cho đến khi gặp ngày lớn hơn d thì ngưng lại. Ghi nhớ vị trí này. Lượt dò tới thì bắt đầu từ vị trí ghi nhớ.
 
Upvote 0
Web KT

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

Back
Top Bottom