第9回VBA活用講座は最終回を迎え、5月23日(木)、15名の参加のもと大みか拠点で開催しました。今回は、教本の日経BP社発行の「残業ゼロ」の決め手!Excel VBA実践テクニック」のChapter7の後半について、勉強しました。
講座の内容梗概は下記のとおりです。

Chapter7 関数の技を極める

 第4回 EDATE/EOMONTH関数で簡単に日付を求める

◆=EDATE(開始日,月)は、開始日から指定した月数が経過した日付を返し、=EOMONTH(開始日,月)は、開始日から指定
  した月数が経過した月末の日付を返す関数である。すなわち、開始日と月数に基づき期間経過後の日付を求める。
◆基本的な日付関数として、DATE関数(日付けを求める)、YEAR関数(シリアル値の年)、MONTH関数(シリアル値の月)
  、DAY関数(シリアル値の日)がある。
◆請求日の3か月後に支払日を設定する場合、通常なら=DATE(YEAR(A6),MONTH(A6)+A4,DAY(A6))となるが、
  EDATE関数を使うと、=EDATE(A6,A4)と簡単になる。A6には請求日、A4には数か月後の支払い条件を記載している。前
  払いの場合は「-A4」とすればよい。
◆支払予定日を3か月後の10日にしたい場合は、=DATE(YEAR(A6),MONTH(A6)+A4,10)となるが、EOMONTH関数を使
  えば、=EOMONTH(A6,A4-1)+10と簡単になる。A6は請求日、A4は支払い条件で3か月後の10日である。
◆EOMONTH関数を使って「20日締め10日払い」の支払日を求める。=EOMONTH(A7,A5-IF(DAY(A7)<=A4,1,0))+10で
  示されるが、IFを省略して、=EOMONTH(A7,A5-(DAY(A7)<=A4))+10 あるいは =EOMONTH(A7-A4,A5)+10でもよい
  。ただし、A7は請求日、A5は2か月後の10日の支払い条件、A4は20日締めを表す。

 第5回 WORKDAY関数で休日を除いた日付計算にする

◆EDATE関数は基準日付から「月」単位で指定した期間が経過した後の日付を求めるものであったが、「日」単位としたもの
  が、WORKDAY関数やWORKDAY.INTL関数であり、特定の日(土、日曜日、祭日など)を除いた日数を取得できる。
◆ =WORKDAY(開始日,日数,祭日)は、作業開始日から休日を含めず、営業日だけをカウントした「日数」を経過した日付を
  返す。また、=WORKDAY.INTL(開始日,日数,週末,祭日)は、祭日のほか、特定の曜日を休日にする場合に適用する。
◆B3に作業開始日、B4に所要日数とすると、作業終了予定日は =WORKDAY(B3.B4)となり、土・日曜日を除く作業終了日
  付が示される。ただし、シリアル値が示されるので、セルの書式から日付に変更する必要がある。
◆祭日も考慮するには、別表の例えばD4:D8に祭日を設定してある場合は、=WORKDAY(B3,B4,D4:D8)となる。
◆引数「祭日」にはセル範囲だけでなく、直接日付を指定することもできる。
     =WORKDAY(B3,B4,"2016/11/23") または =WORKDAY(B3,B4,{"2016/11/23","2016/12/23"})。
◆特定の曜日を休日にしたい場合は、WORKDAY.INTL関数を使う。一覧表から休日の設定番号を選ぶ。
     =WOTKDAY.INTL(B3,B4,3,D4:D8) ただし、3は月曜日と火曜日を休日とする番号である。
◆休日の指定は=WORKDAY.INTL(B3,B4,0100110,D4:D8)でもよい。この場合は月・金・土曜日が休日である。
◆第3月曜日を検査の日とする場合の日付は、=WORKDAY.INTL(DATE(A4,B4,0),3,0111111)で求められる。A4に年、
  B4に月、DATE(A4,B4,0)で先月末日を求め、0111111で月曜日のみ営業日として、営業日の3日後を求めている。

 第6回 基本のIF関数で上級ワザを使いこなす

◆条件の真偽に応じて異なる処理を行うにはIF関数が最も知られている。=IF(B4>=180,"合格","不合格")は、B4が180以
  上の場合は合格、それ以外は不合格という基本的な使い方の例である。
◆=IF(B4>10000,100,50)は、B4が10000を超す場合は100、それ以外の場合は50という意味であるが、IF関数を使わない
  =(B4>180)*50+50でもよい。(B4>180)が「TRUE」の場合は「1」、「FALSE」の場合は「0」と見做される。
◆=IF(B4="","",B4*1.08)はB4が空白ならば空白を、そうでなければB4*1.08にせよという内容であるが、B4が数値でない
  場合はエラーとなる。 ISNUMBER関数を使い、=IF(ISNUMBER(B4),B4*1.08,"")とすればよい。
◆B4とC4の両方に数値が入っている場合のみ対応するには、COUNT関数を使い、=IF(COUNT(B4:C4)=2,B4*C4,"")。
◆=IF(COUNT(B4;D4)>0,AVERAGE(B4:D4)."")は、B4からD4に1つでも数値があれば、B4からD4の平均を求める もので
  、>0は無くても良い。すなわち、=IF(COUNT(B4;D4),AVERAGE(B4:D4),"")。
◆クーポン券ありの場合、割引価格を表示させる場合、VLOOKUP関数も使用する。
  =IF(B4="有り",VLOOKUP(A4,A7:C9,3,False),VLOOKUP(A4,A7:C9,2,FALSE)) 、B4にクーポン券の有無、A4に検
  索名、A7からC9に品名毎の通常価格と割引価格が表示されている。すなわち、クーポン券が無ければ通常価格を表示。
◆上記よりも=VLOOKUP(A4,A7:C9,IF(B4="有り",3,2,),FALSE)の方が良い。すなわち、列の選択にIF関数を使う。
◆日付によって価格が異なるような場合も上記と同じ手法を用いればよい。
  =VLOOKUP(B4,IF(A4<E8,E4:F6,E10:F12),2,FALSE)。A4およびE8に日付を、E4からF6およびE10からF12に日付によ
  って異なる価格表が表示されている。B4には検索名が表示されている。
◆上記で検索される表が複数行のある場合は、下記となる。
  =IF(B4="","",VLOOKUP(B4,IF(A4<$E$8,$E$4:$F$6,$E$10:$F$12),2,FALSE))となる。絶対値参照を忘れずに!
◆最後に「配列数式」で表示する方法として、クラスA,Bの成績がある場合、BクラスのMINを求めるには
  =MIN(IF(B4;B11=E4,C4:C11)と入力し、「Ctrl」+「Shift」+「Enter」で配列数式となり、Bクラスの最小値を求めることがで
  きる。同様にMAXの値は=MAX(B4;B11=E4)*C4:C11で同様に配列数式に変換すればよい。E4にBを記載している。

講師・文責 世話人 安田 出

1905vba

第9回 VBA活用講座に参加の皆さん

(戻り)