マクロ上でワークシート関数を使う。

マクロの作成ができるようになっていろいろな処理を作っていくと、マクロ上でExcelシートの「計算式」を使いたくなるものです。

ここでは、「計算式」「時刻を15分・30分単位にまるめてから時間数を計算」のような通常マクロでは難しい時刻のまるめ処理をサンプルにします。 VBAの関数では、数値の「まるめ(切り捨て・切り上げ・四捨五入)」は「桁位置」が基本であり、時刻のまるめは困難です。
例えば15分単位であれば96分の1単位でのまるめ処理となってしまうからです。
(日付型では1日が1の増分であり、時刻の処理は小数扱いです。15分は「1/96日」になります。)
そのままやるなら96倍して小数を切り捨ててから、また96で割るなどと言う方法になります。
15分単位に切り上げの結果
(画像をクリックすると、このサンプルがダウンロードできます)
「計算式」「時刻を15分・30分単位にまるめてから時間数を計算」で説明してあるようにFLOOR関数」「CEILING関数」ではまるめの単位を「桁位置」ではなく、「値」で自在に指定できるので、このような場合に便利です。


'***************************************************************************************************
'   マクロ上でワークシート関数を使うサンプル                        Module1(Module)
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'03/07/28(1.00)新規作成
'03/11/15(1.01)初回修正
'20/02/23(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit

'***************************************************************************************************
'   ■■■ ワークシート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :TimeCeiling15Min
'* 機能  :時刻15分単位切り上げ
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年07月28日
'* 作成者 :井上 治
'* 更新日 :2020年02月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub TimeCeiling15Min()
    '-----------------------------------------------------------------------------------------------
    Dim dteTime1 As Date                                            ' 算出前時刻
    Dim dteTime2 As Date                                            ' 算出後時刻
    dteTime1 = Cells(4, 7).Value
    ' 上の時刻を15分単位で切り上げる(15分=1/96日)
    dteTime2 = Application.WorksheetFunction.Ceiling(dteTime1, 1 / 96)      ' ←@
    ' 計算結果の表示
    MsgBox dteTime2
End Sub

'***************************************************************************************************
'* 処理名 :TimeFloor10Min
'* 機能  :時刻15分単位切り上げ
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2003年07月28日
'* 作成者 :井上 治
'* 更新日 :2020年02月23日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub TimeFloor10Min()
    '-----------------------------------------------------------------------------------------------
    Dim dteTime1 As Date                                            ' 算出前時刻
    Dim dteTime2 As Date                                            ' 算出後時刻
    dteTime1 = Cells(8, 7).Value
    ' 上の時刻を10分単位で切り捨てる(10分=1/144日)
    dteTime2 = Application.WorksheetFunction.Floor(dteTime1, 1 / 144)       ' ←A
    ' 計算結果の表示
    MsgBox dteTime2
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
計算式はExcelに実装されているので、ExcelアプリケーションオブジェクトからWorksheetFunctionプロパティ
ワークシート関数を参照します。@CEILING関数」96分の1単位(24×4)での切り上げになり、AFLOOR関数」144分の1単位(24×6)での切り捨てになります。カッコ内の引数は計算式のそれと同じです。

あくまでサンプルですが、実際の利用シーンを考えると、なかなかうまい例が思いつきません。なぜなら計算式で済むならマクロは組まないだろうと思うからです。 しかし、ワークシートでないとできないことをワークシート外から利用するようなケースがあります。 例えば「ユーザーフォーム上でヨミガナを自動表示」などがそれに当たります。