Làm sao biết ngày đầu tuần (thứ 2) của tuần thứ x là ngày bao nhiêu?

Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Ví dụ: hiện tại weeknum(today()) đang ở tuần thứ 28
Làm sao em biết được thứ hai rơi vào ngày bao nhiêu cụ thể thứ 2 tuần 28 rơi vào 05/07/2010
 
Conv

Ví dụ:
Ô B1 ta gõ Weeknum
Ô B2 ta gõ weekday (quy ước Monday = 1 nhé)
Ô B3 ta gõ Năm.

Công thức để chuyển sang ngày thỏa mãn ba điều kiện đó như sau:

=DATE($B$3,1,($B$1-1)*7+CHOOSE(WEEKDAY(DATE($B$3,1,1),2),0,-1,-2,-3,3,2,1)+$B$2)


Từ đó có thể viết Code lại như sau:

Function ConvertDate(mYear As Integer, mWeek As Integer, mDay As Integer) As Date
Dim iDays As Integer, iNumDays As Integer
iDays = Choose(Weekday(DateSerial(mYear, 1, 1), vbMonday), 0, -1, -2, -3, 3, 2, 1)
iNumDays = (mWeek - 1) * 7 + iDays + mDay
ConvertDate = DateAdd("d", iNumDays - 1, DateSerial(mYear, 1, 1))
End Function
Cú pháp hàm tự tạo: = Convertdate(Năm, Tuần, Thứ)
Lưu ý: Công thức này dùng quy ước Monday = 1
 

File đính kèm

  • Convert to Date.xls
    32.5 KB · Đọc: 44
Lần chỉnh sửa cuối:
Upvote 0
Hu hu, khó quá. Chuyển về code giúp em được không
- Bài toán là biết ngày thứ mấy (ví dụ thứ 2) biết tuần
- Tìm ngày thứ bao nhiều ví dụ: 05/07/2010

Cám ơn Anh Ca_dafi
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ:
Ô B1 ta gõ Weeknum
Ô B2 ta gõ weekday (quy ước Monday = 1 nhé)
Ô B3 ta gõ Năm.

Công thức để chuyển sang ngày thỏa mãn ba điều kiện đó như sau:
Đâu có đúng đâu chứ
Tuần thứ 2 của năm 2010, ngày thứ 2 là ngày là ngày 4/1 cơ mà (của Kiệt ra kết quả ngày 11/1)
Tôi nghĩ nó phải vầy:
PHP:
=DATE(2010,1,1)-WEEKDAY(DATE(2010,1,1))+ 2+(WEEKNUM(A1)-1)*7
---------------------
Xin lỗi ST-Lu! Mình làm xong mới thấy đây là box VBA.
Chẳng quan trọng gì ---> Vấn đề là Thuật toán
 
Upvote 0
Anh ndu ơi cho em hỏi xíu, Weeknum(A1), anh nói thêm A1 là ngày nào? Công thức của anh quá hay!
 
Upvote 0
Ví dụ: hiện tại weeknum(today()) đang ở tuần thứ 28
Làm sao em biết được thứ hai rơi vào ngày bao nhiêu cụ thể thứ 2 tuần 28 rơi vào 05/07/2010
Bạn thử công thức này với :A1 : nhập năm 2009 , 2010 .. ; A2 : tuần thứ ; A3: thứ mấy ( ví dụ thứ 2 là 2 , thứ 3 là 3 ,...,Chủ nhật tùy)


=DATE(A1;1;1)-WEEKDAY(DATE(A1;1;1);1)+IF(A3<8;A3;8)+7*(A2-1)
 
Upvote 0
Đâu có đúng đâu chứ
Tuần thứ 2 của năm 2010, ngày thứ 2 là ngày là ngày 4/1 cơ mà (của Kiệt ra kết quả ngày 11/1)
Tôi nghĩ nó phải vầy:
PHP:
=DATE(2010,1,1)-WEEKDAY(DATE(2010,1,1))+ 2+(WEEKNUM(A1)-1)*7
---------------------

Chẳng quan trọng gì ---> Vấn đề là Thuật toán

Anh NDU ơi, em chưa hiểu công thức trên dùng như nào,
ở đây em hiểu WEEKNUM(A1) mà A1 ở đây là số tuần phải không? hay A1 là gì ạh?
 
Upvote 0
Ví dụ:
Ô B1 ta gõ Weeknum
Ô B2 ta gõ weekday (quy ước Monday = 1 nhé)
Ô B3 ta gõ Năm.

Công thức để chuyển sang ngày thỏa mãn ba điều kiện đó như sau:



Từ đó có thể viết Code lại như sau:

Cú pháp hàm tự tạo: = Convertdate(Năm, Tuần, Thứ)
Lưu ý: Công thức này dùng quy ước Monday = 1

Chị Ca_dafi ơi
Công thức của Chị bị lệch mất một ngày (ngay ở trong file của chị) tuần 28 thứ 2 là 05/07/2010 chị ạh (trong file của chị nó thể hiện là 12/07/10
 
Upvote 0
PHP:
Function ConvertDate(mYear As Integer, mWeek As Integer, mDay As Integer) As Date
Dim iDays As Integer, iNumDays As Integer
iDays = Choose(Weekday(DateSerial(mYear, 1, 1), vbMonday), 0, -1, -2, -3, 3, 2, 1)
iNumDays = (mWeek - 2) * 7 + iDays + mDay
ConvertDate = DateAdd("d", iNumDays - 1, DateSerial(mYear, 1, 1))
End Function
Anh Kiệt ơi
Em chưa hiểu đoạn này, kém quá
- các già trị mình lấy cho Idays là 0, -1, -2, -3, 3, 2, 1 --> tại sao lại như vậy?
- Em chưa hiểu về thuật toán trên, anh giảng qua em chút

P.s: Code của Anh nếu sửa lại thành -2 thì đúng anh ạh
 
Upvote 0
- các già trị mình lấy cho Idays là 0, -1, -2, -3, 3, 2, 1 --> tại sao lại như vậy?
- Em chưa hiểu về thuật toán trên, anh giảng qua em chút
P.s: Code của Anh nếu sửa lại thành -2 thì đúng anh ạh

Choose(Weekday(DateSerial(mYear, 1, 1), vbMonday), 0, -1, -2, -3, 3, 2, 1)
Diễn giải như sau:
Nếu như ngày đầu năm là thứ hai thì iday=0
Nếu ngày đầu năm là thứ ba thì iday = -1
....
Nếu như ngày đầu năm là thứ sáu thì iday = 3
...
Nếu như ngày đầu năm là chủ nhật thì iday = 1

==>Mục đích để đưa về mức chuẩn là ngày thứ hai để tính.

Vì vậy, chặt đầu chặt đuôi và phải chặt luôn phần quy chuẩn này, mình quên. Cho nên công thức trên sửa lại là lấy (số tuần - 2) sau đó nhân với 7 ngày là chính xác.

Đưa về dạng số, ngày 01/01/2010 là 40,179
vậy ngày thứ ba tuần 28 phải là [40,179 + (28-2)*7] + [thứ tự của thứ] +/- [ảnh hưởng của ngày đầu năm] (cái ảnh hưởng đó là phần Choose(....))
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ndu ơi cho em hỏi xíu, Weeknum(A1), anh nói thêm A1 là ngày nào? Công thức của anh quá hay!

A1 là TODAY() đấy! Là cái ngày nằm trong tuần cần phải tính (ở đây là tuần thứ 28).

Công thức này rất hay:
ndu96081631 đã viết:
=DATE(2010,1,1)-WEEKDAY(DATE(2010,1,1))+2+(WEEKNUM(A1)-1)*7
Có thể thay con số màu đỏ để tìm những ngày khác. Ví dụ, muốn biết thứ Ba là ngày mấy thì thay số 3, thứ Tư thì thay số 4... Chủ Nhật thì thay số 1.

Tuy nhiên, nếu thay A1 = TODAY() thì công thức này chỉ trả lời đươc câu hỏi: Thứ Hai của tuần này là ngày bao nhiêu?.


Nếu phải trả lời chính xác câu hỏi của tác giả: Thứ Hai của tuần thứ X là ngày bao nhiêu?, thì tôi sẽ dùng công thức này:

=DATE(2010,1,1) - WEEKDAY(DATE(2010,1,1)) + 2 + (X -1)*7
Với X = X trong câu hỏi.

Hay tổng quát hơn: Để trả lời cho câu hỏi Thứ Y của tuần thứ X là ngày bao nhiêu?, có thể dùng công thức:
=DATE(2010,1,1) - WEEKDAY(DATE(2010,1,1)) + Y + (X -1)*7
 
Upvote 0
Anh ndu ơi cho em hỏi xíu, Weeknum(A1), anh nói thêm A1 là ngày nào? Công thức của anh quá hay!
Trong quá trình thí nghiệm, tại cột A tôi gõ ngày từ 1 đến cuối năm nên A1 là 1 ngày nào đó thôi
Với yêu cầu của tác giả thì thay Weeknum(A1) bằng 1 số từ 1 đến 52 (hay 53 gì đó) là được rồi
Hoặc vầy:
PHP:
=DATE(2010,1,1)-WEEKDAY(DATE(2010,1,1))+ 2+(ROWS($1:1)-1)*7
và kéo fill xuống
Ở trên chỉ lầ giải thuật, BNTT đã sửa cho tổng quát rồi
Tuy nhiên:
- Nên kiểm tra lại 2 cận trên dưới xem có chính xác không? (cận trên là ngày đầu năm và những ngày lân cận nó... Cận dưới là ngày cuối năm và những ngày lân cận nó)
- Kiểm tra lại các trường hợp cận trên là ngày CN, thứ 2, thứ 3... vân vân...
---------------
Để ý khi viết code thì sai sót thường rơi vào các biên
 
Lần chỉnh sửa cuối:
Upvote 0
Với quy ước ngày chủ nhật là số 1 (là ngày đầu tuần), thứ 2 là số 2 thì công thức của mình như sau:

=DATE(NAM,1,1)-(WEEKDAY(DATE(NAM,1,1))+THU)+(TUAN-1)*7
Ví dụ:
Ô B2 là thứ cần tìm
Ô B3 là năm
Ô B4 là tuần thì công thức cụ thể tìm là:

=DATE(B3,1,1)-WEEKDAY(DATE(B3,1,1))+B2+(B4-1)*7
Nếu cần tìm ngày chủ nhật, tuần 29, năm 2010 thì kết quả sẽ là 11/7/2010

Tương tự như vậy, Chủ Nhật tuần 53 năm 2010 nhằm ngày 26/12/2010
 

File đính kèm

  • Thu_trong_tuan.xls
    36 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Với quy ước ngày chủ nhật là số 1 (là ngày đầu tuần), thứ 2 là số 2 thì công thức của mình như sau:

Ví dụ:
Ô B2 là thứ cần tìm
Ô B3 là năm
Ô B4 là tuần thì công thức cụ thể tìm là:

Nếu cần tìm ngày chủ nhật, tuần 29, năm 2010 thì kết quả sẽ là 11/7/2010

Tương tự như vậy, Chủ Nhật tuần 53 năm 2010 nhằm ngày 26/12/2010
Thì cũng y chang như trên thôi chứ có gì khác "đặc biệt" đâu đồng chí?
Ẹc... Ẹc...
 
Upvote 0
Web KT
Back
Top Bottom