Manhhung90
Thành viên hoạt động



- Tham gia
- 3/4/20
- Bài viết
- 151
- Được thích
- 7
Bạn làm theo các bước sau:Em muốn liệt kê tất cả các ngày mong muốn vào 1 ô như hình ảnh
Bác đùa em quá ạ.Bạn làm theo các bước sau:
- Nhấn F2 để vào chế độ nhập liệu (có thể bỏ qua)
- Nhập ngày mong muốn thứ nhất
- Nhập dấu phẩy (,)
- Nhập ngày mong muốn thứ hai
- Nhập dấu phẩy (,)
- ...
- Lặp lại cho đến khi hết ngày mong muốn. Lưu ý sau ngày cuối cùng không cần nhập dấu phẩy (,)
- Nhấn Enter để hoàn tất và thoát chế độ nhập liệu
bác hãy đưa file lên chứ ở trên có bác nói thế mà bác không hiểu ý nữa saoBác đùa em quá ạ.
Xin lỗi ạ. Do mình không hiểu ý ạ. Mình gởi file ạbác hãy đưa file lên chứ ở trên có bác nói thế mà bác không hiểu ý nữa sao
Bạn có vấn đề về đọc hiểu hay sao ấy nhỉ. File không có dữ liệu gì khác với cái ảnh bạn gửi thì liệt kê với tổng hợp cái gì?Xin lỗi ạ. Do mình không hiểu ý ạ. Mình gởi file ạ
Do mình không biết làm mới đưa file mình mong muốn kết quả đoạn bôi vàng như vậy.Bạn có vấn đề về đọc hiểu hay sao ấy nhỉ. File không có dữ liệu gì khác với cái ảnh bạn gửi thì liệt kê với tổng hợp cái gì?
Bản dùng office bản nào?Do mình không biết làm mới đưa file mình mong muốn kết quả đoạn bôi vàng như vậy.
Mình dùng bản 2016 ạBản dùng office bản nào?
Bài này liên quan đến nối chuỗi nên ít nhất bạn phải dùng Excel2019, mình chỉ làm được công thức trên Excel2019. Nếu bạn dùng bản 2016 thì chờ người khác vậy hoặc có thể dùng các khác như VBA, PQ...Mình dùng bản 2016 ạ
Quan trọng là ở đâu ra các ngày trong ô bôi vàng. Nó ở trong đầu bạn mà không thể hiện bằng văn bản hay minh họa bằng các ô excel thì không ai làm được. Người đọc có thể đoán ra, nhưng bạn phải tự nói để khỏi đoán nhầm mỗi người đoán 1 kiểu.Do mình không biết làm mới đưa file mình mong muốn kết quả đoạn bôi vàng như vậy.
Dạ. Ngày trong ô vàng là các ngày cộng dồn lên theo số ngày ở ô C4 ạ. Ví dụ: ngày bắt đầu là ngày 1/1/2023, các ngày tiếp theo sẽ cộng dồn 180 ngày đến ngày hiện tại ạ.Quan trọng là ở đâu ra các ngày trong ô bôi vàng. Nó ở trong đầu bạn mà không thể hiện bằng văn bản hay minh họa bằng các ô excel thì không ai làm được. Người đọc có thể đoán ra, nhưng bạn phải tự nói để khỏi đoán nhầm mỗi người đoán 1 kiểu.
Vậy là ai định giúp lại phải tự nhặt các ngày đó để làm ví dụ hộ bạn đã, sau đó mới nghĩ đến việc làm thế nào để cộng dồn được. Chờ được ai đủ kiên nhẫn làm hết các bước này e rằng hơi lâu. Có khi người ấy còn chưa sinh ra cũng nên.Dạ. Ngày trong ô vàng là các ngày cộng dồn lên theo số ngày ở ô C4 ạ. Ví dụ: ngày bắt đầu là ngày 1/1/2023, các ngày tiếp theo sẽ cộng dồn 180 ngày đến ngày hiện tại ạ.
Cái đề bài này đâu có gì gây khó hiểu đâu nhỉ.Vậy là ai định giúp lại phải tự nhặt các ngày đó để làm ví dụ hộ bạn đã, sau đó mới nghĩ đến việc làm thế nào để cộng dồn được. Chờ được ai đủ kiên nhẫn làm hết các bước này e rằng hơi lâu. Có khi người ấy còn chưa sinh ra cũng nên.
Function Taochuoingay(ngaybd As Date, ngaykt As Date, kc As Long) As String
Dim chuoingay As String
Dim ngay As Date
chuoingay = ""
ngay = ngaybd + kc
chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", "
If ngay > ngaykt Then
chuoingay = ""
End If
Do While ngay < ngaykt
ngay = ngay + kc
If ngay <= ngaykt Then
chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", "
End If
Loop
If ngay > ngaykt Then
chuoingay = chuoingay & Format(ngaykt, "dd/mm/yyyy")
End If
If Right(chuoingay, 1) = " " Then
chuoingay = Left(chuoingay, Len(chuoingay) - 2)
End If
Taochuoingay = chuoingay
End Function
Đúng như bạn nói nhưng do mình không trình bày rõ ạ. Cảm ơn bạnCái đề bài này đâu có gì gây khó hiểu đâu nhỉ.
Chủ thớt chỉ cần ví dụ 1 ngày là: 1/1/2023, sau đó cứ cộng lũy tiếm tiếp là ra mấy ngày trong ô màu vàng.
1/1/2023 + 180 = 27/12/2023 + 180 = 24/06/2024 +....
Bác nào biết công thức thì làm công thức, không thì xử lý bằng VBA vậy thôi
Có những người giúp biết rằng ý là như vậy, nhưng chủ bài ví dụ tiết kiệm quá nên người giúp cũng nản anh ạ.Cái đề bài này đâu có gì gây khó hiểu đâu nhỉ.
Chủ thớt chỉ cần ví dụ 1 ngày là: 1/1/2023, sau đó cứ cộng lũy tiếm tiếp là ra mấy ngày trong ô màu vàng.
1/1/2023 + 180 = 27/12/2023 + 180 = 24/06/2024 +....
Bác nào biết công thức thì làm công thức, không thì xử lý bằng VBA vậy thôi
Cảm ơn bạn rất nhiều! Code chạy rất ổn và đúng theo ý muốn ạBài này dùng công thức cho excel 2016 thì không tổng quát được. Trong lúc chờ đợi ý kiến thêm thì tham khảo hàm tự tạo này.
Taochuoingay(ngày bắt đầu; ngày kết thúc; khoảng cách ngày)
Xem thêm trong fileMã:Function Taochuoingay(ngaybd As Date, ngaykt As Date, kc As Long) As String Dim chuoingay As String Dim ngay As Date chuoingay = "" ngay = ngaybd + kc chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", " If ngay > ngaykt Then chuoingay = "" End If Do While ngay < ngaykt ngay = ngay + kc If ngay <= ngaykt Then chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", " End If Loop If ngay > ngaykt Then chuoingay = chuoingay & Format(ngaykt, "dd/mm/yyyy") End If If Right(chuoingay, 1) = " " Then chuoingay = Left(chuoingay, Len(chuoingay) - 2) End If Taochuoingay = chuoingay End Function
Nhờ bạn giúp mình 1 lần nữa là nếu các ngày trong chuỗi đó trùng với ngày lễ mình chỉ định thì cộng thêm 1 ngày được không ạ?Bài này dùng công thức cho excel 2016 thì không tổng quát được. Trong lúc chờ đợi ý kiến thêm thì tham khảo hàm tự tạo này.
Taochuoingay(ngày bắt đầu; ngày kết thúc; khoảng cách ngày)
Xem thêm trong fileMã:Function Taochuoingay(ngaybd As Date, ngaykt As Date, kc As Long) As String Dim chuoingay As String Dim ngay As Date chuoingay = "" ngay = ngaybd + kc chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", " If ngay > ngaykt Then chuoingay = "" End If Do While ngay < ngaykt ngay = ngay + kc If ngay <= ngaykt Then chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", " End If Loop If ngay > ngaykt Then chuoingay = chuoingay & Format(ngaykt, "dd/mm/yyyy") End If If Right(chuoingay, 1) = " " Then chuoingay = Left(chuoingay, Len(chuoingay) - 2) End If Taochuoingay = chuoingay End Function
Bài hướng dẫn này chi tiết quá, đến từng dấu phẩy luôn.Bạn làm theo các bước sau:
- Nhấn F2 để vào chế độ nhập liệu (có thể bỏ qua)
- Nhập ngày mong muốn thứ nhất
- Nhập dấu phẩy (,)
- Nhập ngày mong muốn thứ hai
- Nhập dấu phẩy (,)
- ...
- Lặp lại cho đến khi hết ngày mong muốn. Lưu ý sau ngày cuối cùng không cần nhập dấu phẩy (,)
- Nhấn Enter để hoàn tất và thoát chế độ nhập liệu
Vì bạn ấy là người có tâm "nhì" trái đất.Bài hướng dẫn này chi tiết quá, đến từng dấu phẩy luôn.
Rồi phải nhập các ngày lễ vào 1 vùng nào đó đúng không bạn?Nhờ bạn giúp mình 1 lần nữa là nếu các ngày trong chuỗi đó trùng với ngày lễ mình chỉ định thì cộng thêm 1 ngày được không ạ?
Em đoán mò rằng nếu rơi vào hai ngày này thì phải bắt đầu từ ngày 3/5 vì ngày 30/4 cộng một ngày, ngày 1/5 cộng một ngày nữa là 2 ngày nên thành ra bắt đầu từ ngày 3/5.Nếu rơi vào 30/4 hay 1/5 thì chọn 2/5 đúng không?
Thường một số hình thức khác là ngày Lễ, Tết, ngày Nghỉ (CN) không tính. Bạn có áp dụng ngày nghỉ không thì đưa vô để bạn ấy xử lý luôn cho đầy đủ.Nhờ bạn giúp mình 1 lần nữa là nếu các ngày trong chuỗi đó trùng với ngày lễ mình chỉ định thì cộng thêm 1 ngày được không ạ?
Chưa kể giỗ ông tổ theo ngày AL nên ngày DL không cố địnhEm đoán mò rằng nếu rơi vào hai ngày này thì phải bắt đầu từ ngày 3/5 vì ngày 30/4 cộng một ngày, ngày 1/5 cộng một ngày nữa là 2 ngày nên thành ra bắt đầu từ ngày 3/5.
Mà phải cập nhật ít nhất 10 năm. Giỗ tổ phải tra lịch âm trong 10 năm.CHờ chủ thớt cập nhật lên file mới làm được.
File mình thêm sheet LICH NGHI LE. Có cột Ngày nghỉ lễ là những ngày mình mong muốn bỏ qua ngày đó tới ngày tiếp theo. Thêm bao nhiêu ngày nghỉ thì thêm trong cột A- ngày nghỉ lễ đó. Nhờ mọi người quan tâm giúp em ạChưa kể giỗ ông tổ theo ngày AL nên ngày DL không cố định
CHờ chủ thớt cập nhật lên file mới làm được.
Mình không biết cách làm bài này, nhưng File có Macro mà lại để đuôi ".xlsx" thì chạy thế nào được nhỉ.File mình thêm sheet LICH NGHI LE. Có cột Ngày nghỉ lễ là những ngày mình mong muốn bỏ qua ngày đó tới ngày tiếp theo. Thêm bao nhiêu ngày nghỉ thì thêm trong cột A- ngày nghỉ lễ đó. Nhờ mọi người quan tâm giúp em ạ
Em có gởi lại ạMình không biết cách làm bài này, nhưng File có Macro mà lại để đuôi ".xlsx" thì chạy thế nào được nhỉ.
Không khó lắm. Phần khó nhất là phần đếm số ngày lễ trong các khoảngMình không biết cách làm bài này, ...
Cách dễ hơn là tính trước số giai đọan 180 ngày giữa ngày bắt đầu và ngày hiện tại (không có ngày kết thúc), để dùng được trong công thức 365.Không khó lắm. Phần khó nhất là phần đếm số ngày lễ trong các khoảng
Thuật toán trên tôi chỉ cho bạn ấy cách giải khi bài đến chỗ khắc nghiệt nhất. Không phải là lời đoán ý thớt....
Vấn đề là sau khi cộng 1 ra ngày bắt đầu của giai đoạn n, thì qua giai đoạn n + 1 lấy ngày đó cộng 180 hay lấy ngày trước khi cộng 1 để cộng 180? Câu hỏi này quan trọng và được hỏi từ bài 22 mà chưa trả lời
...
Vấn đề tiếp theo là sau khi gặp trường hợp đến ngày lễ rồi thì sau đó mốc tiếp theo sẽ là ngày lễ hay là ngày lễ +1 thì chủ bài cũng không đề cập đến, mặc dù đã có bài đề cập câu hỏi này trước bài trả lời gần nhất của chủ bài mấy bài rồi, cho nên em cũng chẳng thử nữa anh ạ.Nếu bạn hứng, có thể thử.
Option Explicit
Function listngay(ngaybd As Date, songay As Integer, n As Integer) As String
If ngaybd = 0 Or songay = 0 Then
listngay = "O nay khong co so lieu!"
Exit Function
End If
Dim c&, st As String, ngaykt As Date, wf As Object
Set wf = WorksheetFunction
Do
c = c + 1
Select Case n
Case 1
ngaybd = IIf(c = 1, ngaybd, ngaykt)
ngaykt = wf.Min(Date, wf.WorkDay_Intl(ngaybd, songay, "0000000", Sheets("LICH NGHI LE").Range("A2:A5")))
Case 2
ngaybd = ngaybd + songay
ngaykt = wf.Min(Date, wf.WorkDay_Intl(ngaybd - 1, 1, "0000000", Sheets("LICH NGHI LE").Range("A2:A5")))
Case Else
MsgBox "Nhap 1 hay 2 cho tham so thu 3!"
Exit Function
End Select
st = IIf(st = "", ngaykt, st & ", " & ngaykt)
If ngaykt >= Date Then Exit Do
Loop
listngay = st
End Function
Tác giả một là không cần gấp, hai là quá thờ ơ, hời hợt. Giờ này chưa thấy phản hồi. Thật ra vẫn còn 1 việc cần phải nói rõ, đó là khi phát biểu "nếu lớn hơn ngày hiện tại thì ngày cuối cùng là ngày hiện tại", thì lớn hơn bao nhiêu? Lớn hơn dù 1 ngày hay lớn hơn 179 ngày cũng đều lấy ngày hiện tại?Vấn đề tiếp theo là sau khi gặp trường hợp đến ngày lễ rồi thì sau đó mốc tiếp theo sẽ là ngày lễ hay là ngày lễ +1 thì chủ bài cũng không đề cập đến, mặc dù đã có bài đề cập câu hỏi này trước bài trả lời gần nhất của chủ bài mấy bài rồi, cho nên em cũng chẳng thử nữa anh ạ.
Xin lỗi anh và mọi người ạ! Do mình mắc công việc nên chưa phản hồi kịp thời ạ.Tác giả một là không cần gấp, hai là quá thờ ơ, hời hợt. Giờ này chưa thấy phản hồi. Thật ra vẫn còn 1 việc cần phải nói rõ, đó là khi phát biểu "nếu lớn hơn ngày hiện tại thì ngày cuối cùng là ngày hiện tại", thì lớn hơn bao nhiêu? Lớn hơn dù 1 ngày hay lớn hơn 179 ngày cũng đều lấy ngày hiện tại?
Thí dụ ngày cộng dồn kế cuối là hôm qua (31/10) thì cũng lấy ngày hiện tại là 01/11 và 2 ngày trong dãy cách nhau có 1 ngày?
Còn các ngày lễ đầy đủ cho các năm trước và sau 2024? Đặc biệt là các ngày lễ dựa vào âm lịch?Xin lỗi anh và mọi người ạ! Do mình mắc công việc nên chưa phản hồi kịp thời ạ.
Mình chỉ cần các ngày lễ Dương lịch mà em ghi vào thôi ạ. Chứ không phải tất cả các ngày nghỉ lễ ạ.Còn các ngày lễ đầy đủ cho các năm trước và sau 2024? Đặc biệt là các ngày lễ dựa vào âm lịch?
Ngày cuối = ngày lễ thì bằng ngày lễ luôn ạ. Do mình đặt ngày làm sẽ không trùng với ngày lễ nên chắc chắn sẽ không trùng ngày lễ ạ.Yêu cầu loại bỏ các ngày lễ cũng không khó. Chỉ cần lập 1 mảng gồm các ngày lễ, khi có biến 'ngay' thì thêm 1 vòng lặp để so sánh với phần tử mảng. Sau đó xử lý tiếp. Phát sinh nếu today = ngày nghỉ (vd 30/4) thì sẽ lấy ngày cuối là ngày nào?
Code này anh thêm tham số ngày kết thúc để có thể chọn được không ạ. Do trong quá trình làm em làm ngày hôm nay nhưng ngày kết thúc chọn ngày khác ạ.Trong cái UDF này, sẽ cho phép chọn cách 1 hay 2 (là số ngày cộng dồn có tính từ ngày lễ +1 hay không)
=Listngay(ngày bắt đầu, số ngày, 1 (hay 2))
Trong file đính kèm, vùng màu vàng là vùng dùng công thức
Vùng kiểm tra phía dưới là mình dùng công thức để test lại, có thể delete vùng này đi
PHP:Option Explicit Function listngay(ngaybd As Date, songay As Integer, n As Integer) As String If ngaybd = 0 Or songay = 0 Then listngay = "O nay khong co so lieu!" Exit Function End If Dim c&, st As String, ngaykt As Date, wf As Object Set wf = WorksheetFunction Do c = c + 1 Select Case n Case 1 ngaybd = IIf(c = 1, ngaybd, ngaykt) ngaykt = wf.Min(Date, wf.WorkDay_Intl(ngaybd, songay, "0000000", Sheets("LICH NGHI LE").Range("A2:A5"))) Case 2 ngaybd = ngaybd + songay ngaykt = wf.Min(Date, wf.WorkDay_Intl(ngaybd - 1, 1, "0000000", Sheets("LICH NGHI LE").Range("A2:A5"))) Case Else MsgBox "Nhap 1 hay 2 cho tham so thu 3!" Exit Function End Select st = IIf(st = "", ngaykt, st & ", " & ngaykt) If ngaykt >= Date Then Exit Do Loop listngay = st End Function
Ý bạn là xác định ngày cuối thay vì ngày today()?Code này anh thêm tham số ngày kết thúc để có thể chọn được không ạ. Do trong quá trình làm em làm ngày hôm nay nhưng ngày kết thúc chọn ngày khác ạ.
Option Explicit
Function listngay(ngaybd As Date, songay As Integer) As String
If ngaybd = 0 Or songay = 0 Then
listngay = "O nay khong co so lieu!"
Exit Function
End If
Dim c&, st As String, ngaykt As Date, ngaycuoi As Date, wf As Object
Set wf = WorksheetFunction
ngaycuoi = DateSerial(2024, 11, 3) ' thay doi ngay tuy chon. Co the thay bang InputBox de chon ngay moi khi run, neu ngay nay co su bien dong
Do
c = c + 1
ngaybd = ngaybd + songay
ngaykt = wf.Min(ngaycuoi, wf.WorkDay_Intl(ngaybd - 1, 1, "0000000", Sheets("LICH NGHI LE").Range("A2:A5")))
st = IIf(st = "", ngaykt, st & ", " & ngaykt)
If ngaykt >= ngaycuoi Then Exit Do
Loop
listngay = st
End Function
Ý là mình muốn xác định ngày cuối giống như xác định ngày bắt đầu đó ạ. Để chọn vào các ô trong excel cho tiện.Ý bạn là xác định ngày cuối thay vì ngày today()?
Trong code này mình cố định ngày cuối trong code luôn. Nếu bạn muốn chọn ngày thì thay nó bằng 1 cái InputBox nhé
ngaycuoi = DateSerial(2024, 11, 3)
giả sử ngày cuối là ngày 03/11/2024
PHP:Option Explicit Function listngay(ngaybd As Date, songay As Integer) As String If ngaybd = 0 Or songay = 0 Then listngay = "O nay khong co so lieu!" Exit Function End If Dim c&, st As String, ngaykt As Date, ngaycuoi As Date, wf As Object Set wf = WorksheetFunction ngaycuoi = DateSerial(2024, 11, 3) ' thay doi ngay tuy chon. Co the thay bang InputBox de chon ngay moi khi run, neu ngay nay co su bien dong Do c = c + 1 ngaybd = ngaybd + songay ngaykt = wf.Min(ngaycuoi, wf.WorkDay_Intl(ngaybd - 1, 1, "0000000", Sheets("LICH NGHI LE").Range("A2:A5"))) st = IIf(st = "", ngaykt, st & ", " & ngaykt) If ngaykt >= ngaycuoi Then Exit Do Loop listngay = st End Function
Không có ngày lễ cho năm 2025 và điền ngày cuối là 30/06/2025 hoặc 2026 thì sao?Ý là mình muốn xác định ngày cuối giống như xác định ngày bắt đầu đó ạ. Để chọn vào các ô trong excel cho tiện.
Kết quả phải là 03/05/2024, 11/10/2024, 25/12/2024 chứ,Mình xin được phép gởi lại file dữ liệu mong muốn nhờ mọi người giúp đỡ ạ. Em cũng đã liệt kê các ngày lễ để bỏ qua từ năm 2021 đến 2027
Ngày cuối trùng ngày lễ thì + 1 ngày thôi ạKết quả phải là 03/05/2024, 11/10/2024, 25/12/2024 chứ,
Cái này đơn giản, bạn có thể tự làm được mà.Ý là mình muốn xác định ngày cuối giống như xác định ngày bắt đầu đó ạ. Để chọn vào các ô trong excel cho tiện.
ngaycuoi = Range("C5").value
Được ạ. Nhưng do mình cần copy kéo xuống nhiều dòng khác thì sẽ không tiện bằng cách chọn ô C5, kéo xuống thì thành C6,C7,C8 ... có ô chứa ngày cuối tương ứng ạ.Cái này đơn giản, bạn có thể tự làm được mà.
Giả sử ô C5 chứa ngày cuối
PHP:ngaycuoi = Range("C5").value
Function Taochuoingay(ngaybd As Date, ngaykt As Date, kc As Long) As String
Dim chuoingay As String
Dim ngay As Date
Dim ngaynghile As Range
Dim cell As Range
Dim trungngayle As Boolean
On Error Resume Next
Set ngaynghile = ThisWorkbook.Names("ngayle").RefersToRange
On Error GoTo 0
If ngaynghile Is Nothing Then
Set ngaynghile = ActiveSheet.Range("A1")
End If
chuoingay = ""
ngay = ngaybd + kc
Do While ngay <= ngaykt
trungngayle = False
For Each cell In ngaynghile
If ngay = cell.Value Then
ngay = ngay + 1
trungngayle = True
Exit For
End If
Next cell
If Not trungngayle And ngay <= ngaykt Then
chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", "
ngay = ngay + kc
End If
Loop
If ngay > ngaykt Then
chuoingay = chuoingay & Format(ngaykt, "dd/mm/yyyy")
End If
If Right(chuoingay, 1) = " " Then
chuoingay = Left(chuoingay, Len(chuoingay) - 2)
End If
Taochuoingay = chuoingay
End Function
Cảm ơn bạn rất nhiều. Mình đã tạo được dữ liệu theo ý muốn và nó rất cần thiết cho công việc của mình thời gian lâu dài ạ. Cảm ơn mọi người đã quan tâm thớt này ạ.Mình bổ sung thêm theo yêu cầu của bạn, đặt tên list ngày nghỉ là "ngayle" để bạn có thể tùy chỉnh số lượng ngày. Hàm vẫn chưa thực sự hoàn thiện. Nhưng trong phạm vi nào đó thì mình nghĩ vẫn áp dụng được. Vì yêu cầu của bạn không mang tính phổ biến và cũng không biết dữ liệu thực của bạn thế nào nên bạn tự kiểm tra.
Mã:Function Taochuoingay(ngaybd As Date, ngaykt As Date, kc As Long) As String Dim chuoingay As String Dim ngay As Date Dim ngaynghile As Range Dim cell As Range Dim trungngayle As Boolean On Error Resume Next Set ngaynghile = ThisWorkbook.Names("ngayle").RefersToRange On Error GoTo 0 If ngaynghile Is Nothing Then Set ngaynghile = ActiveSheet.Range("A1") End If chuoingay = "" ngay = ngaybd + kc Do While ngay <= ngaykt trungngayle = False For Each cell In ngaynghile If ngay = cell.Value Then ngay = ngay + 1 trungngayle = True Exit For End If Next cell If Not trungngayle And ngay <= ngaykt Then chuoingay = chuoingay & Format(ngay, "dd/mm/yyyy") & ", " ngay = ngay + kc End If Loop If ngay > ngaykt Then chuoingay = chuoingay & Format(ngaykt, "dd/mm/yyyy") End If If Right(chuoingay, 1) = " " Then chuoingay = Left(chuoingay, Len(chuoingay) - 2) End If Taochuoingay = chuoingay End Function
Function StrDate(StartD, EndD, Cycle As Long, Holidays As Range)
Dim TmpStr As String, TmpD As Long
TmpD = StartD
Do
TmpD = TmpD + Cycle
For Each Cll In Holidays
If TmpD = Cll.Value Then TmpD = TmpD + 1
Next
TmpStr = TmpStr & ", " & Format(TmpD, "dd/mm/yy")
Loop Until TmpD + Cycle > EndD
TmpStr = TmpStr & ", " & Format(EndD, "dd/mm/yy")
StrDate = Mid(TmpStr, 3, Len(TmpStr))
End Function
Cảm ơn anh rất nhiều ạ. Code chạy rất tốt đáp ứng nhu cầu làm việc thường xuyên của em ạCode dưới đây đáp ứng yêu cầu cuối cùng. Không thêm bớt yêu cầu mới gì nữa, nếu có thì tự sửa.
PHP:Function StrDate(StartD, EndD, Cycle As Long, Holidays As Range) Dim TmpStr As String, TmpD As Long TmpD = StartD Do TmpD = TmpD + Cycle For Each Cll In Holidays If TmpD = Cll.Value Then TmpD = TmpD + 1 Next TmpStr = TmpStr & ", " & Format(TmpD, "dd/mm/yy") Loop Until TmpD + Cycle > EndD TmpStr = TmpStr & ", " & Format(EndD, "dd/mm/yy") StrDate = Mid(TmpStr, 3, Len(TmpStr)) End Function
Cú pháp:
=StrDate(ngày đầu, ngày cuối, chu kỳ, vùng ngày lễ)
View attachment 305212
Function StrDate(StartD, EndD, Cycle As Long, Holidays As Range)
Dim TmpStr As String, TmpD As Long
Dim Cll As Variant
TmpD = StartD + Cycle
Do While TmpD < EndD
For Each Cll In Holidays
If TmpD = Cll.Value Then TmpD = TmpD + 1
Next
TmpStr = TmpStr & ", " & Format(TmpD, "dd/mm/yy")
TmpD = TmpD + Cycle
Loop
TmpStr = TmpStr & ", " & Format(EndD, "dd/mm/yy")
StrDate = Mid(TmpStr, 3, Len(TmpStr))
End Function
Đúng là tôi chưa test trường hợp này. Có thể thêm 1 điều kiện If nhưng cách của bạn hay hơn.Bẫy lỗi trường hợp ngày cuối cách ngày đầu đúng 1 chu kỳ:
Còn trường hợp 2 ngày nghỉ liên tiếp thì chỉ lên 1 ngày ạ. Ví dụ: trúng ngày 30/4/2024 thì nó chỉ nhảy lên 1 ngày là 1/5/2024 chứ không nhảy qua ngày 2/5/2024.Đúng là tôi chưa test trường hợp này. Có thể thêm 1 điều kiện If nhưng cách của bạn hay hơn.
Kết quả mong muốn bạn đưa lên ở bài 45 là 2/5. Bài 47 bạn còn cãi với bài 46.Còn trường hợp 2 ngày nghỉ liên tiếp thì chỉ lên 1 ngày ạ. Ví dụ: trúng ngày 30/4/2024 thì nó chỉ nhảy lên 1 ngày là 1/5/2024 chứ không nhảy qua ngày 2/5/2024.
Em cảm ơn nhiều ạKết quả mong muốn bạn đưa lên ở bài 45 là 2/5. Bài 47 bạn còn cãi với bài 46.
Tôi đã nói là không xí quên, không xí lộn, không thêm bớt. Bạn phải tự sửa.
View attachment 305213
Chưa chắc là hay đâu anh, bẫy này vẫn để "sổng" lỗi khi ngày liền trước ngày kết thúc là ngày kết thúc chu kỳ đồng thời là ngày lễ.Đúng là tôi chưa test trường hợp này. Có thể thêm 1 điều kiện If nhưng cách của bạn hay hơn.
Hai lỗi đầu là đúng là lỗi, lỗi 3 thì hình như đã có rồi (dòng 12)Chưa chắc là hay đâu anh, bẫy này vẫn để "sổng" lỗi khi ngày liền trước ngày kết thúc là ngày kết thúc chu kỳ đồng thời là ngày lễ.
--
Ngoài ra code còn một lỗi khá nghiêm trọng là sẽ rơi vào vòng lặp vô tận khi số ngày một chu kỳ bằng 0 (có thể do vô tình xóa ô chứa giá trị số ngày một chu kỳ).
--
Còn cái vế "lớn hơn ngày hiện tại thì ngày cuối cùng là ngày kết thúc" trong yêu cầu thì không hiểu ý nói gì, code cũng chưa thực hiện.
Dòng 12 khác gì so với các dòng khác anh? Trong code cũng không thấy chỗ nào so sánh với ngày hiện tại cả.Hai lỗi đầu là đúng là lỗi, lỗi 3 thì hình như đã có rồi (dòng 12)
Ở bài #1, thớt nói là ngày hiện tại, nhưng sau thì đổi ý rồi.Dòng 12 khác gì so với các dòng khác anh? Trong code cũng không thấy chỗ nào so sánh với ngày hiện tại cả.
Y thị đổi ý là ngày kết thúc bất kỳ chứ không còn là ngày hiện tại nữa, nên thay thế bằng tham số EndD. Câu lệnh nối EndD nằm ngoài vòng lặp Do chính là thêm ngày cuối khi đã thoát vòng lặp. Mà điều kiện thoát vòng lặp là tmpD + Cycle > EndD bất kể lớn hơn 1 ngày hay nhiều ngày.Dòng 12 khác gì so với các dòng khác anh? Trong code cũng không thấy chỗ nào so sánh với ngày hiện tại cả.
Không anh. Sau khi đổi ý và sau khi có đủ số ngày nghỉ của những năm trước và những năm sau 2024 như tôi đòi, tôi mới viết cho yêu cầu mới nhất và dữ liệu đủ nhất.Chỉ có LCT, nói là sợ "điều kiện ảo" nhưng vẫn bám chặt.
Mô tả yêu cầu ghi là "lớn hơn ngày hiện tại thì ngày cuối cùng là ngày kết thúc" nhưng anh hiểu là "lớn hơn ngày kết thúc thì ngày cuối cùng là ngày kết thúc" thế mà lại trúng. Hay thật.Dòng 12 nếu cộng tay (có cộng 2 ngày lễ) thì ngày cuối là 25/08/25, lớn hơn ngày cuối 25/12/24 (tô vàng), nên phải lấy ngày cuối và kết quả là E12.
Fix lỗi này nhưng lại lòi ra lỗi khác, bài #60 em có nêu trường hợp xảy ra lỗi.lỗi này fix bằng cách của phuocam đổi Loop Until thành Do While.
Yêu cầu thay ngày hiện tại bằng ngày kết thúc và chọn được là ở bài 40. Còn ô E5 trong file thì không sửa yêu cầu cũ từ bài 1 thành yêu cầu mới. Bài trên tôi có nói đương sự này là kẻ hời hợt và vô trách nhiệm mà. Hỏi mãi hỏi đủ thứ cho mãi đến bài 45 mới đủ thông tin, lúc đó tôi mới làm.Mô tả yêu cầu ghi là "lớn hơn ngày hiện tại thì ngày cuối cùng là ngày kết thúc" nhưng anh hiểu là "lớn hơn ngày kết thúc thì ngày cuối cùng là ngày kết thúc" thế mà lại trúng. Hay thật.
Tôi đã dự định không làm tiếp nên không test nữa và cũng không sửa nữa. Chẳng hạn như yêu cầu phát sinh 2 ngày lễ liên tiếp chỉ cộng 1 cho ngày lễ thứ nhất, tôi đã từ chối.Fix lỗi này nhưng lại lòi ra lỗi khác, bài #60 em có nêu trường hợp xảy ra lỗi.
Cảm ơn anh và mọi người đã giúp đỡ tận tình ạ. Do trong quá trình làm phát sinh các lỗi em không lường trước được nên vấn đề cứ phát sinh dẫn đến làm phiền mọi người ạ. Ví dụ: dữ liều ban đầu là em chỉ dùng ngày hiện tại nhưng em muốn sử dụng các trường hợp khác nữa nên mới phát sinh như vậy hoặc khi chạy ra dữ liệu ra thì có những ngày trùng ngày nghỉ lễ nên phải tạo lịch nghỉ lễ để tránh những ngày đó.Yêu cầu thay ngày hiện tại bằng ngày kết thúc và chọn được là ở bài 40. Còn ô E5 trong file thì không sửa yêu cầu cũ từ bài 1 thành yêu cầu mới. Bài trên tôi có nói đương sự này là kẻ hời hợt và vô trách nhiệm mà. Hỏi mãi hỏi đủ thứ cho mãi đến bài 45 mới đủ thông tin, lúc đó tôi mới làm.
Tôi đã dự định không làm tiếp nên không test nữa và cũng không sửa nữa. Chẳng hạn như yêu cầu phát sinh 2 ngày lễ liên tiếp chỉ cộng 1 cho ngày lễ thứ nhất, tôi đã từ chối.