キムは、開始日(列C)と終了日(列D)を配置するワークシートを持っています。彼女は、2つの日付の間の月末の数を計算する方法を必要としています。たとえば、開始日が1/1/17で、終了日が7/31/17の場合、月末数は7になります。ただし、終了日が7/30/17の場合、月数です。終わりは6です。

適切な数を計算するために考案できる式はいくつもあります。最も簡単な式は、列Cの日付が月の始まりであると常に信頼できるかどうかです。その場合、次の式で問題なく機能します。

=DATEDIF(C1,D1+1,"m")

月の始まりである日付を含む列Cを当てにすることはできないが、開始日と終了日が常に同じ年であると期待できる場合は、次の数式のいずれかでうまくいきます。

=IF(MONTH(D1+1)=MONTH(D1),MONTH(D1)-MONTH(C1),MONTH(D1)-MONTH(C1)+1)

=IF(MONTH(D1+1)=MONTH(D1),MONTH(D1)-1,MONTH(D1))-MONTH(C1)+1 =MONTH(EOMONTH(D1,0))-MONTH(EOMONTH(C1,0))+(EOMONTH(D1,0)=D1)

=IF(EOMONTH(D1,0)=D1,MONTH(D1)-MONTH(C1)+1,MONTH(D1)-MONTH(C1))

=IF(D1<EOMONTH(D1,0),MONTH(D1)-1,MONTH(D1))-MONTH(C1)+1 =MONTH(D1)-MONTH(C1)+IF(D1=EOMONTH(D1,0),1,0)

開始日と終了日の年が異なる可能性がある場合、式はもう少し複雑になります。次のバリエーションのいずれかにより、日付範囲内の月末の正しい数が計算されます。

=12*(YEAR(D1)-YEAR(C1))+MONTH(D1)-MONTH(C1)+INT(D1=EOMONTH(D1,0))

=12*(YEAR(D1)-YEAR(C1))+MONTH(D1)-MONTH(C1)+IF(EOMONTH(D1,0)=D1,1,0)

=12YEAR(D1)+MONTH(D1)-12YEAR(C1)-MONTH(C1)+IF(D1=EOMONTH(D1,0),1,0)

=12YEAR(D1)+MONTH(D1)-12YEAR(C1)-MONTH(C1)+(D1=EOMONTH(D1,0))

=12YEAR(D1)+MONTH(D1)-12YEAR(C1)-MONTH(C1)+(DAY(D1+1)=1)

=MONTH(D1)+12YEAR(D1)-MONTH(C1)-12YEAR(C1)+IF(EOMONTH(D1,0)=D1,1,0)

=(MONTH(D1+1)+12YEAR(D1+1))-(MONTH(C1)+12YEAR(C1))

=IF(D1=EOMONTH(D1,0),1,0)+MONTH(D1)-MONTH(C1)+((YEAR(D1)-YEAR(C1))*12)

=IF(EOMONTH(D1,0)=D1,(MONTH(D1)-MONTH(C1)+1)+(YEAR(D1)-YEAR(C1))12,MONTH(D1)-MONTH(C1)+(YEAR(D1)-YEAR(C1))12)

=IF(D1=EOMONTH(D1,0),DATEDIF(EOMONTH(C1,-1),EOMONTH(D1,0),"m"),DATEDIF(EOMONTH(C1,-1),EOMONTH(D1,0),"m")-1)

=IF(D1<C1,"Error",MONTH(D1)-MONTH(C1)+IF(D1MONTH(D1+1))*1)

=IF(D1<C1,"Error",(YEAR(D1)-YEAR(C1))*12+(MONTH(D1)-MONTH(C1))+(EOMONTH(D1,0)=D1))

=SUM(N(FREQUENCY(EOMONTH(ROW(INDIRECT(C1&":"&D1)),0),EOMONTH(ROW(INDIRECT(C1&":"&D1)),0))>0))-(D1<EOMONTH(D1,0))

これらの式のいくつかは少し長いので、1つを使用することを選択した場合は、すべてが得られることを注意深く監視する必要があります。

マクロアプローチを使用したい場合は、次のユーザー定義関数が役立ちます。

Function CountMonthEnds(sd As Date, ed As Date) As Integer     Dim ceom As Integer     Dim cmonth As Integer     Dim lmonth As Integer     Dim x As Date

cmonth = 0     ceom = 0     cmonth = Month(sd)

lmonth = cmonth     ' go to end date + 1 to allow for end date being end of month     For x = sd To ed + 1         cmonth = Month(x)

If cmonth <> lmonth Then             ceom = ceom + 1             lmonth = cmonth         End If     Next x     CountMonthEnds = ceom End Function

マクロは、開始日と終了日の間のすべての日付をステップスルーするだけです。各日付の月を調べ、変更された場合は「月末」としてカウントします。このカウントは関数によって返されます。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(572)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。