Cách đếm số tháng theo điều kiện (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Gia_Khue

Thành viên chính thức
Tham gia
18/12/07
Bài viết
83
Được thích
13
Nghề nghiệp
BI
Kính gửi cả nhà /-*+/

GK hôm nay ngồi hì hục ;;;;;;;;;;; mãi mà làm chưa ra cách đếm tháng. Nếu dùng If thì câu lệnh nó dài ơi là dài -+*/ , mà GK viết xong thì nó báo lỗi tè le tét lét :=\+ .

Cả nhà xem giúp GK có giải pháp nào đơn giản và chính xác hơn không với nhé.

Ví dụ:
Có 3 cột A: Ngày bắt đầu; cột B: Ngày hiện hành ; cột C sẽ cho mình biết kết quả từ ngày bắt đầu cho đến ngày hiện hành là mấy tháng. Tuy nhiên, cách tính tháng ở cột C này lại phải theo điều kiện:
nếu cột A: 1/9/2007 ; cột B : 25/12/2007 ---> cột C : 3 tháng

nếu cột A: 2/9/2007 ; cột B : 25/12/2007 ----> cột C: 2 tháng

nếu cột A: 1/12/2007 ; cột B : 25/12/2007 ---- cột C: 0 tháng

tức là chỉ tính những tháng tròn thôi, còn không tròn, dù chỉ thiếu 1 ngày cũng tính nó = 0. GK muốn nó ghi nhận giá trị là 0 chứ không phải ra 1 cell trống đâu ạ.

Nhân tiện, mấy bác giúp GK cái hàm Now với, GK muốn nó luôn hiện ngày hiện hành ở cột B, thế nhưng uýnh lệnh kiểu gì nó cũng hỏng thèm ra, ko biết nó bị làm sao nữa.

Cả nhà có giải pháp nào hay thì chỉ GK với nhé. Hì hì, GK hỏng có biết viết VB đâu, GK chỉ biết sửa trên nền code có sẵn thôi à. Bác nào mà kiu GK viết = VB là GK lăn đùng ra mà xỉu luôn )(*^= .

Cám ơn cả nhà trước nhé.
 
Lần chỉnh sửa cuối:
B2=Now() chắc chắn ra ngày hiện hành, nếu không ra dạng ngày bạn phải Format cell - Date - Short date
C2=Datedif(A2,B2,"M") bảo đảm thỏa 8 điều kiện hiện hành của bạn.
Nếu vẫn có khó khăn bạn phải gởi File kèm theo, mọi người mới giúp được.
 
Lần chỉnh sửa cuối:
Trước tiên, cám ơn PTM0412 vì đã trả lời cho GK.

Cái hàm Now, GK uýnh hoài vẫn hỏng được dù đã format cell như bạn chỉ.

Vừa mới làm thử theo cách bạn chỉ, do chọn là Month nên nó chỉ đếm Month thôi, trong khi đó GK chỉ tính đó là 1 tháng nếu nó bắt đầu từ ngày đầu đến ngày cuối tháng.

Trong file đính kèm, cột C là kết quả làm theo công thức bạn chỉ, còn cột D là đáng lẽ kết quả phải vậy.

Bạn xem rồi chỉ giúp GK nhé.

Cám ơn bạn lần nữa.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn xem File kèm theo, dòng 4 bạn nhẩm sai, từ 15/8 đến 15/12 là tròn 4 tháng, đến 25/12 là có lẻ mấy ngày, datedif () phải ra 4.
Vấn đề bạn thấy cột B không đúng như bạn nghĩ vì bạn quên: Cột A bạn format ngày Vietnamese, cột B bạn format ngày English, ngôn nggữ có hiển thị ở dòng language của hộp thoại Format mà bạn không để ý.
Tuy nhiên đã format là ngày thì datedif() cũng đúng dù là ngôn ngữ gì.
 

File đính kèm

Ôi, bạn hiểu lầm ý của GK rồi

Cách tính tháng của GK là bắt buộc phải từ đầu tháng đến cuối tháng mới tính là 1 tháng, do đó nếu ngày bắt đầu là 02/11, thì cho đến ngày 02/12 vẫn không đuợc tính là 1 tháng.

GK thấy nó phức tạp chính ở cái chỗ đấy đó bạn. GK nghĩ mãi chẳng ra. !$@!!

Bạn xem lại giúp GK với.

Hàm Now, mình hiểu ra rồi. %#^#$

Tks bạn.
 
Bạn không nói rõ đk 1 tháng phải bắt đầu từ ngày 1, nên tớ tính sai. Nhưng cũng có cách. Xem File mới.
Còn ngày cột B bạn Format lại Vietnamese hoặc dùng Format Painter từ A5, đừng từ A4 vì A4 là dd/mm/yyyy, quét vào cả khối A4:B9 luôn.
 

File đính kèm

Ơ, bạn ơi, với những ngày bắt đầu là mùng 1 thì nó tính được, nhưng nếu hỏng phải ngày mùng 1 thì nó báo lỗi #NAME?

Máy bạn có bị vậy ko? Hay do máy mình nhỉ?

Tks bạn vì đã chịu khó xem giúp mình dù đêm đã khuya. %#^#$
 
Bạn mở Menu - Tool - Add-Ins xem đã đánh dấu Analysis ToolPark chưa? nếu chưa thì đánh dấu vào rồi OK, nếu nó đòi đưa CD thì bỏ đĩa CD cài đặt Ofice vào. Nói lẹ làm lẹ, 15 phút nữaa tớ di ngủ.
 
Bác "Not Very Old Man" ơi, bác cứ ngủ đi, để em thay cho...
Em nghĩ không phải thiếu Analysis ToolPark đâu, vì nếu thiếu thì nó đã báo #NAME? cả đám rồi chứ không chỉ riêng gì mấy hàng ngày không phải là 1 như Gia Khuê nói.

Bạn Gia Khuê, bạn thử đổi công thức này xem sao (ở C4 và kéo xuống C9):
=IF(DAY(A4)=1, DATEDIF(A4, B4, "M"), DATEDIF(A4, B4, "M") -1)

P/S: Tôi không biết bạn bao nhiêu tuổi, nhưng có lẽ bạn không thể lớn hơn bác ptm0412.. và cũng để lịch sự tí, mong bạn đừng xưng "tớ" trong diễn đàn khi bạn chưa biết bạn đang nói chuyện với ai, bạn có thể xưng tôi, hoặc xưng em. Góp ý tí nhé.
 
Lần chỉnh sửa cuối:
Đúng là thiếu Analysis ToolPark mà. Hỏi GK xem. Mình thử đúng rồi mới Post lên. Khi day() =1 nó không xét tới hàm eomonth() nên ra kq, ngược lại nó không biết eomonth() là gì nên #name.
Tuy nhiên datedif()-1 cũng đúng rồi, khỏi CD.
 
Lần chỉnh sửa cuối:
Í, mình xem lại rồi, datedif()-1 có chỗ không ổn, đố các bạn biết!
Giải thưởng là 1 nửa thùng bia của enmuaxuan (nếu tớ kiếm được).
Phen này bắt GiaKhue gọi anh xưng em đàng hoàng, hề hề.
 
Hình như cốt lỗi vấn đề này là đếm xem có bao nhiêu ngày = 1 thì phải?
Nó là công thức mãng này đây:
Mã:
{=SUM(IF(DAY((A1-1+ROW(INDIRECT("1:"&(B1-A1)+1))))=1,1,0))}
Với A1 là ngày bắt đều, B1 là ngày kết thúc...
Tham khảo vụ đếm này tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=2943
ANH TUẤN
 
ptm0412 đã viết:
Í, mình xem lại rồi, datedif()-1 có chỗ không ổn, đố các bạn biết!
Giải thưởng là 1 nửa thùng bia của enmuaxuan (nếu tớ kiếm được).
Phen này bắt GiaKhue gọi anh xưng em đàng hoàng, hề hề.
Kiếm bia uống thử...
Bác PTM0412 ơi, có phải cái bác nói là trường hợp công thức cho ra kết quả âm không?
Nếu là âm thì cho nó bằng 0 (chưa có tháng nào):

=IF(DAY(A4)=1, DATEDIF(A4, B4, "M"), MAX(DATEDIF(A4, B4, "M") -1, 0))
Còn không phải vụ này thì... để em nghĩ tiếp.

@Gia Khuê: Mới chuẩn bị "băm nhát đầu" mà bạn đã đau khổ, vậy mình "băm nát bấy" rồi thì sao đây?
 
anhtuan1066 đã viết:
Hình như cốt lỗi vấn đề này là đếm xem có bao nhiêu ngày = 1 thì phải?
Nó là công thức mãng này đây:
Mã:
{=SUM(IF(DAY((A1-1+ROW(INDIRECT("1:"&(B1-A1)+1))))=1,1,0))}
Với A1 là ngày bắt đều, B1 là ngày kết thúc...
Tham khảo vụ đếm này tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=2943
ANH TUẤN
Bác hiểu sai vấn đề của Gia Khuê rùi...
Ý của Gia Khuê là đếm xem có bao nhiêu "tháng tròn" giữa hai khoảng thời gian
Ví dụ:
  • Từ 1/9/2007 đến 26/12/2007, chỉ có tháng 9, 10, và 11 là "đủ", nghĩa là kết quả = 3
  • Từ 2/9/2007 đến 26/12/2007, chỉ có tháng 10 và 11 là "đủ" (tháng 9 thiếu 1 ngày, không tính) nên kết quả = 2
Công thức mảng của bác vẫn tính dư 1 tháng.
A1 = 1/11/2007, B1 = 26/12/2007
{=SUM(IF(DAY((A1-1+ROW(INDIRECT("1:"&(B1-A1)+1))))=1,1,0))} cho kết quả = 2
Nhưng đây chỉ có mỗi tháng 11 là tròn, tháng 12 chưa đủ, nên kết quả phải bằng 1 thôi:
=IF(DAY(A4)=1, DATEDIF(A4, B4, "M"), MAX(DATEDIF(A4, B4, "M") -1, 0)) cho kết quả = 1
 
Mất nửa thùng bia rồi, mới 5 phút!
Cho tớ nợ tới khi tìm được enmuaxuan, xem tớ có đúng trong topic Cây thư mục không nhé!
Mà công thức như vây không ngắn gọn bằng eomonth().
@ anhtuan:
Cốt lõi là đếm số ngày 1 và đếm số ngày cuối tháng tương ứng với số ngày 1 của từng tháng đếm được, 2 cái khớp nhau mới tính . Theo hướng này thì phức tạp lắm lắm .
 
Trời.. tôi biết chứ... đây chỉ là gợi ý.. bạn thích làm thế nào là tùy... Dù sao nó vẫn là đếm ngày có DAY = 1, đúng ko? Kết hợp thêm vụ ngày cuối có trùng với cuối tháng hay ko (thêm mỗi cái IF ngắn nữa)? Hic...
Là gợi ý... các bạn hiểu ko nhỉ? Công thức này còn làm dc 1 đóng việc khác nữa đấy.. ví dụ:
-Đếm có bao nhiêu ngày chẳn giữa 2 thời điểm
-Đếm có bao nhiêu ngày lẽ giữa 2 thời điểm
-Đếm có bao nhiêu ngày chủ nhật giữa 2 thời điểm
vân vân và vân vân...
Nghiên cứu xem
ANH TUẤN
 
Lần chỉnh sửa cuối:
ptm0412 đã viết:
Mất nửa thùng bia rồi, mới 5 phút!
Cho tớ nợ tới khi tìm được enmuaxuan, xem tớ có đúng trong topic Cây thư mục không nhé!
Mà công thức như vây không ngắn gọn bằng eomonth().
Là sao hở bác? OR("Bác mất nửa thùng bia", "em được nửa thùng bia") vậy ?
Dĩ nhiên cái của em thì dài thoòng so với cái này của bác:

=DATEDIF(IF(DAY(A4)=1,A4,EOMONTH(A4,0)),B4,"M")
Nhưng mà em làm vậy vì lỡ Gia Khuê hổng có Analysis Tool... í mà.
 
Chào cả nhà,

Tuần này GK mới qua công ty mới, mà công ty này phong tỏa dữ dội, đến đổi cái desktop nhìn cho đẹp 1 tí cũng khóa luôn nói chi đến lướt web. :=\+ Về đến nhà là chạy vô hỏi mọi người ngay lập tức.

Hôm nay GK thử làm theo công thức của cả 2 anh Ptm0412 và BNTT, tuy nhiên, hôm nay GK mới phát hiện ra 1 điều là có trường hợp tính nhẩm đúng là trọn tháng, nhưng nó hỏng thèm tính trọn tháng.

Ví dụ : từ ngày 01/9/2007 đến ngày 31/12/2007 là tròn 4 tháng, thế mà cả 2 công thức đề tính ra là 3 tháng.

Nhờ 2 anh Ptm0412 và BNTT xem file GK đính kèm.

Trong file này GK đã loại bỏ trường hợp giá trị âm.

Cám ơn 2 anh nhiều nhé.

GK.

P/s:
GK sẽ rút kinh nghiệm, lần sau sẽ nói thật rõ yêu cầu để tránh hiểu lầm dẫn đến mất thời gian của mọi người. Hôm qua, bác nào bị GK làm phiền mà mất ngủ thì GK hứa sẽ không làm phiền đêm khuya nữa, GK chỉ làm phiền đến tối thôi à --=0 .:-=
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử dùng ct sau: (Copy anhtuan1066)
=SUMPRODUCT((DAY(ROW(INDIRECT("1:"&(C4-B4)+1)))=1)*1)-1
Lưu ý: nên dùng today() hơn là dùng now()
 
Bác ThuNghi ơi,
Nếu em hiểu không lầm ý muốn của Gia Khuê, thì cách tính phải là như cái này nè (nhờ bạn Gia Khuê xem luôn dùm):
030.jpg

Mà muốn đúng như vậy thì công thức trong cột C dài ngoằng à:

(C2) =IF(AND(DAY(A2)=1,B2=EOMONTH(B2,0)),DATEDIF(A2,B2,"M")+1,IF(OR(DAY(A2)=1,B2=EOMONTH(B2,0)),DATEDIF(A2,B2,"M"),MAX(DATEDIF(A2,B2,"M")-1,0)))


Nếu đem cái của bác thả vào cột C, thì đáp số không đúng yêu cầu:

(C13) =SUMPRODUCT((DAY(ROW(INDIRECT("1:"&(B13-A13)+1)))=1)*1)-1
031.jpg

(sai ở chỗ tháng trước thiếu và tháng sau cũng thiếu)
 
Lần chỉnh sửa cuối:
Cám ơn bác ThuNghi nhiều lắm

Cho GK hỏi thêm tí nhé. %#^#$

Tại sao phải dùng hàm Today() thì mới không bị báo lỗi hả bác. Hàm Today và Now khác nhau ở chỗ nào?

Cám ơn sự giúp đỡ của bác.

Anh BNTT ơi, công thức của anh cũng ra kết quả đúng nữa, dài loằng ngoằng, nhưng GK đọc vô hiểu công thức. Công thức của bác ThuNghi cũng ra kết quả đúng, rất ngắn gọn, nhưng do Gk hỏng rành cái hàm Indirect tí teo nào nên chỉ copy và xài, chứ hỏng hiểu gì ráo trọi hết á.

Cám ơn anh BNTT. (hỏi nhỏ, GK gọi là "anh" đúng không vậy? hay phải gọi là "chị"?)

GK.
 
Lần chỉnh sửa cuối:
Hàm TODAY() chỉ hiện ra mỗi ngày tháng năm thôi, Còn hàm NOW() thì có kèm theo cả giờ phút giây nữa.

Bạn cứ hiểu theo tiếng Anh đi, NOW = hiện nay, ngay lúc này (tính được cả giờ, phút...),
trong khi TODAY = hôm nay (7 giờ sáng cũng là hôm nay mà 9 giờ tối cũng là hôm nay)

Để kiểm chứng, bạn mở một Sheet mới, đừng định dạng gì cả,
một ô bạn gõ = NOW(), một ô bạn gõ = TODAY()
bạn sẽ thấy nó khác ở chỗ nào liền.


P/S: Bạn gọi anh là... đúng gòy.
 
Lần chỉnh sửa cuối:
Quả nhiên sự đời không đơn giản. Mình đã làm lại hết mọi trường hợp (khoảng 1000 trường hợp), công thức BNTTnew cũng còn sai (445 trường hợp). Mình phải làm lại, công thức dài như xe lửa xuyên Việt:
= IF(B3=EOMONTH(B3;0);
DATEDIF(IF(DAY(A3)=1;A3;EOMONTH(A3;0));B3+1;"M");
DATEDIF(IF(DAY(A3)=1;A3;EOMONTH(A3;0)+1);B3;"M"))

Xem file kèm theo
 

File đính kèm

Lần chỉnh sửa cuối:
Mấy món tính ngày tháng năm theo 1 yêu cầu nào đó phải tinh ý mới dc.. ko dễ ăn đâu... Ngay từ đầu tôi đã gợi ý là nên bám vào vụ đếm số ngày đầu tháng (ngày 1 tây)
Nói chung sẽ có hàng đóng công thức tùy thích.. xin gới thiệu 2 em:
-Em đầu tiên (công thức mãng)
Mã:
=SUM(IF(DAY((A2-1+ROW(INDIRECT("1:"&(B2-A2)+1))))=1,1,0))-1+(DATE(YEAR(B2),MONTH(B2)+1,0)=B2)
Nhớ Ctrl + Shift + Enter đễ kết thúc
-Em thứ 2 dùng DATEDIF
Mã:
=DATEDIF(DATE(YEAR(A2-1),MONTH(A2-1)+1,1),DATE(YEAR(B2+1),MONTH(B2+1),1),"M")
File đính kèm cho các bạn theo dỏi!
Công thức của đồng chí ThuNghi về nguyên tắc là gần chính xác, nhưng vẫn còn thiếu đoạn xét ngày cuối tháng... Nếu ngày cuối đúng bằng cuối tháng thì cộng thêm 1 vào công thức trên
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
ThuNghi đã viết:
Bạn thử dùng ct sau: (Copy anhtuan1066)
=SUMPRODUCT((DAY(ROW(INDIRECT("1:"&(C4-B4)+1)))=1)*1)-1
Lưu ý: nên dùng today() hơn là dùng now()
Công thức trên bị sai khi A4 là 02/10/07 và B4 là 26/12/07, đúng ra phải cho KQ 1
Vậy nên sửa thành ct sau cho đúng
=SUMPRODUCT(((DAY(ROW(INDIRECT("A"&$A4&":A"&$B4+1)))=1)*1))-1
Sorry nhé, cám ơn BNTT nhiều!
 
Nếu đừng cố bám vào Datedif()!

Ngay từ đầu do yêu cầu của GK chưa chính xác, mình dùng Datedif(), sau đó khi yêu cầu thay đổi và đã quá khuya, mình chỉ cải tiến nó, rồi cứ thế bám theo nó mãi đến khi nó thành xe lửa Xuyên Việt thì mất trắng 2 đêm.

Nhưng nay nghĩ lại, ngay từ đầu mà biết cái yêu cầu như thế mình dùng cái này, đơn giản hơn, dễ hiểu hơn, dù có dài nhưng không phải xe lửa mà chỉ là xe đò:
- lấy month trừ month
- Nếu tháng của ngày trước đủ: +1
- Nếu tháng của ngày sau đủ: +1
- Nếu tháng của cả 2 ngày đều thiếu: -1
- Dự phòng trường hợp month() 2 ngày bằng nhau --> bị âm

Dễ làm như đọc đề bài làm xuống, nếu đề bài ra đúng và chính xác câu cú ngay từ đầu:
 
Lần chỉnh sửa cuối:
Uh.. phát biểu thì dễ, nhưng diển giãi cho Excel hiểu thì.. nội cái:
-Nếu tháng của ngày trước đủ
-Nếu tháng của ngày sau đủ
-Nếu tháng của cả 2 ngày đều thiếu
Nội 3 cái IF đó thôi cũng đủ làm cho công thức dài mệt nghĩ... Dựa vào tiêu chí nào đễ biết tháng là đũ? Thứ nhất ngày phải là ngày 1 tây.. nhưng điều này vẫn chưa đũ, ít nhất ngày kết thúc phải >= ngày cuối tháng nữa? Hic...
IF 3 nhát đói bụng luôn
ANH TUẤN
 
Chưa xong đâu các bạn.

Mình test thử công thức của vài bạn, và cả của mình, test cái nào sai cái nấy, trường hợp sai là nếu ngày trước và ngày sau cùng 1 tháng.

Mình định test hết nhưng lâu quá, vì mình đang xài dấu ";" gõ lại thì lâu mà copy xuống cũng phải sửa.

Xin cảm phiền, của ai nấy test cả trong 4 trường hợp đủ đủ, đủ thiếu, thiếu đủ, thiêu thiếu trong trường hợp chung là 2 ngày cùng tháng.
Vì đúng trong case này thì sai case kia.
Của mình cũng thế.
 
He... he... Vậy thì chúng ta cùng cố gắng hoàn thiện hơn vậy!
Tôi đề xuất 1 cái
Mã:
=MAX(SUM(IF(DAY((A2-1+ROW(INDIRECT("1:"&(B2-A2)+1))))=1,1,0))-1+(DATE(YEAR(B2),MONTH(B2)+1,0)=B2),0)
Tôi nghĩ cái của ThuNghi cũng phải thêm MAX giống vậy
Mã:
MAX(SUMPRODUCT...... ,0)
vì thực chất 2 công thức trên là cùng 1 thuật toán
ANH TUẤN
 
Lần chỉnh sửa cuối:
Mình test thử luôn rồi, Atuan cũ 2 cái, mới nhất 1 cái là 3, ThuNghi 1 cái mới nhất, BNTT 1 cái mới nhất, của mình cái xe lửa xuyên Việt.
Chỗ nào sai bị font chữ đỏ.
Chỗ tô màu là cùng trường hợp "thiếu thiếu" mà lại đúng. Thua Bác Bill chỗ này.
Xem file kèm theo
 

File đính kèm

Đại ca xem lại đi... Công thức sau cùng của tôi hoàn toàn đúng.. chỉ là đại ca đã nhập sai... hi... hi... Tôi ghi A2 và B2 thì trong file cụ thể này, đại ca phải đỗi nó thành B2 và C2 chứ
Đây nè.. đại ca.. Tôi sửa của ThuNghi luôn rồi đấy...
Còn công thức của các đại ca vì IF nhiều quá tôi chẳng biết phải sửa như thế nào nữa..
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi đã test lại các công thức được nêu lên, và xin đưa ra kết luận sau:
Công thức của bác ThuNghi
MAX(SUMPRODUCT(((DAY(ROW(INDIRECT("A"&$A2&":A"&$B2+1) ))=1)*1))-1,0)
và công thức của bác ANHTUAN1066
MAX(SUM(IF(DAY((A1-1+ROW(INDIRECT("1:"&(B1-A1)+1))))=1,1,0))-1+(DATE(YEAR(B1),MONTH(B1)+1,0)=B1),0)
là chính xác 100%

Với A1 là ngày của tháng trước, B1 là ngày của tháng sau

Trong đó,
Công thức của bác ThuNghi là công thức bình thường
Công thức của bác ANHTUAN là công thức mảng

Nếu có ai chứng minh được hai công thức trên không đúng, tôi sẽ hậu tạ 1 thùng bia.
 
Lần chỉnh sửa cuối:
Còn công thức của các đại ca vì IF nhiều quá tôi chẳng biết phải sửa như thế nào nữa..
ANH TUẤN
Thanks bạn, mình cũng chẳng muốn sửa cái xe lửa dài ngoằng đó nữa, vì thêm 1 if là thêm 1 toa, lại càng dài.
Của bạn là đúng rôì, lại ngắn nữa.

Nhân đây mình cũng rút ra 1 số bài học, chung cho mọi người:

1. Phải test kỹ mọi trường hợp
2. Nếu càng sửa càng thấy xuất hiện lỗi thì :
a. Trở lại sửa từ đầu F1, F2, đừng cố sửa cái phiên bản F5, F7
b. Đổi hướng tư duy, tìm thuật toán khác, hàm khác
3. Xong phải trở lại điều 1.

Mình thấy bài học này có thể xài cho cả trong việc viết code VBA.

Cám ơn mọi người đã chia sẻ.

To BNTT:
Bạn mới có vốn 1/2 thùng mà dám treo giải 1 thùng ư? Hì hì!
 
BNTT đã viết:
Tôi đã test lại các công thức được nêu lên, và xin đưa ra kết luận sau:
Công thức mảng của bác ANHTUAN1066 là chính xác 100%
MAX(SUM(IF(DAY((A1-1+ROW(INDIRECT("1:"&(B1-A1)+1))))=1,1,0))-1+(DATE(YEAR(B1),MONTH(B1)+1,0)=B1),0)
Với A1 là ngày của tháng trước, B1 là ngày của tháng sau

Nếu có ai chứng minh được công thức trên không đúng, tôi sẽ hậu tạ 1 thùng bia.
Vậy ct này có sai không, test thử luôn, nếu OK thì ngắn hơn
=MAX(SUMPRODUCT(((DAY(ROW(INDIRECT("A"&$B2&":A"&$C2+1) ))=1)*1))-1,0)
Xin 5 lon thôi!
 
Uh... thì làm phần mềm cũng vậy mà... lúc đầu cũng ko thể nào lường trước dc mọi việc... phải nhờ bà con test thử, phản hồi ý kiến thì mới rút ra kết luận phải sửa hay thêm bớt cái gì cho hoàn thiện...
Mà tôi nhận xét công thức của ThuNghi nếu thêm MAX vào cũng chính xác cơ mà..

He... he... và thêm cái DATEDIF của tôi mới sửa nữa.. cũng chính xác luôn... Là 3 em chính xác nhé!
ANH TUẤN
 
Chỉnh sửa lần cuối bởi điều hành viên:
Xin lỗi bác ThuNghi nhé, trong khi bác post bài trên thì em đang sửa lại bài của mình, là thêm cái của bác nữa đó.

Và cũng xin nói thêm chút, công thức của ai ngắn hơn thì có điểm cao hơn.
Bác AnhTuan1066 có đồng ý không ?

Bác Ptm0412 à, em test gần 2 tiếng đồng hồ, quên ăn trưa luôn, nên mới dám mạnh dạn tuyên bố vậy chứ...
 
GK lại chào cả nhà.

Hôm nay GK đang test số liệu phát hiện ra trường hợp này bị sai khi áp dụng công thức của bác Thu Nghi. Các bác xem giúp GK lỗi do đâu nhé.

Các bác xem file đính kèm ạ, GK đã ghi rất chi tiết trong file rồi ạ.

Cám ơn các bác.
 

File đính kèm

Cho ké một cái nha, bằng VBA

PHP:
Option Explicit
 Function TronThang(Dat1 As Date, Dat2 As Date) As Integer
 If Dat2 < Dat1 Then
    Dim tDate As Date:              tDate = Dat2
    Dat2 = Dat1:                    Dat1 = tDate
 End If
 If Day(Dat1) > 1 Then     Dat1 = DauThang(Dat1)
 If Day(Dat2) < Day(DauThang(Dat2) - 1) Then _
    Dat2 = DauThang(Dat2, False) - 1
 TronThang = DateDiff("M", Dat1, Dat2) + 1
 End Function
)(&&@@ (hú í: Ngày theo dạng Mẽo :-=
PHP:
 Function DauThang(Dat0 As Date, Optional Sau As Boolean = True) As Date
 
  If Month(Dat0) <> 12 Then
    DauThang = DateSerial(Year(Dat0), Month(Dat0) - Sau, 1)
  Else
    DauThang = DateSerial(Year(Dat0) + 1, 1, 1)
  End If
 
 End Function
 
Lần chỉnh sửa cuối:
Gia_Khue đã viết:
GK lại chào cả nhà.
Hôm nay GK đang test số liệu phát hiện ra trường hợp này bị sai khi áp dụng công thức của bác Thu Nghi. Các bác xem giúp GK lỗi do đâu nhé.
Các bác xem file đính kèm ạ, GK đã ghi rất chi tiết trong file rồi ạ.
Cám ơn các bác.
Như vầy nè chị hai ơi!
ANH TUẤN
 

File đính kèm

Gia_Khue đã viết:
GK lại chào cả nhà.

Hôm nay GK đang test số liệu phát hiện ra trường hợp này bị sai khi áp dụng công thức của bác Thu Nghi. Các bác xem giúp GK lỗi do đâu nhé.

Các bác xem file đính kèm ạ, GK đã ghi rất chi tiết trong file rồi ạ.

Cám ơn các bác.
Tôi đã sửa ct rồi mà bạn o update
D5=MAX(SUMPRODUCT(((DAY(ROW(INDIRECT("A"&$B5&":A"&$C5 +1) ))=1)*1))-1,0)
 
ptm0412 đã viết:
B2=Now() chắc chắn ra ngày hiện hành, nếu không ra dạng ngày bạn phải Format cell - Date - Short date
C2=Datedif(A2,B2,"M") bảo đảm thỏa 8 điều kiện hiện hành của bạn.
Nếu vẫn có khó khăn bạn phải gởi File kèm theo, mọi người mới giúp được.


Em có 2 dữ liệu

Start date: 01 Apr 2007 (A2)
End date: 31 Dec 2007 (B2)
C2 = Datedif(A2,B2,"M") = 8

Em thắc mắc quá, nếu em đưa ngón tay ra tính nhẩm thì cũng được 9 tháng. Thế mà Hàm này ăn gian mất của em 1 tháng.

Nếu em dùng Hàm Days360 thì tính được 9 tháng

D2 = Days360(A2,B2,1)/30 = 9


Cả nhà giúp em giải thik với ạ.


Em cám ơn nhìu nhìu. Ô zê ê ê!!!!!!!!
 
Start date: 01 Apr 2007 (A2)
End date: 31 Dec 2007 (B2)
C2 = Datedif(A2,B2,"M") = 8
Nó không ăn gian đâu bạn à, DATEDIF tính theo kiểu "đủ ngày đủ tháng", nên nếu bạn chỉ lấy 31/12/2007 trừ 01/4/2007 thì đúng là bằng 8 thôi, vì nó sẽ tính từ 0 giờ ngày 01/4/2007 đến 0 giờ ngày 31/12/2007, nghĩa là ngày 31/12/2007 mới bắt đầu thôi, "chưa hết"!

Nếu em dùng Hàm Days360 thì tính được 9 tháng
D2 = Days360(A2,B2,1)/30 = 9
Cái ni cũng thế, không phải là 9 đâu, mà chỉ là làm tròn số thôi, bạn format cho nó có thêm số lẻ đi, nó sẽ là = 8.967, nghĩa là gần đủ 9 tháng (hay nói theo kiểu của DATEDIF thì còn thiếu 24 tiếng đồng hồ nữa mới đủ 9 tháng)

Bạn hiểu rồi chứ ?
 
Hơ hơ, Đúng zùi !!!

Em hiểu rồi ạ. Em cám ơn BNTT nhiều lắm ạ.

Chúc BNTT cuối tuần zui nhé :)
 
Ui, em hỏi Microsoft Help, nó bảo rằng
Sử dụng công thức sau ạ:
= (YEAR(B2)-YEAR(A2))*12 + MONTH(B2)-MONTH(A2)
 

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

Back
Top Bottom