VBA関数ラッパー

目次

VBA関数ラッパーとは?

ExcelのVBAからはワークシート関数を呼び出すことができますが、ExcelのワークシートからはVBAの関数を呼び出すことはできません。

例えば、InStrRevというVBA関数がありますが、これと同じ機能を持つワークシート関数がないため、仕方なくLenMidSubstitute等を組み合わせて同等の機能を実現している人も多いのではないでしょうか?

しかし、独自関数はワークシートから呼び出すことができますので、VBAの関数をラップしたVBA関数ラッパーを独自関数として作ることで、ワークシートから呼び出せるようなります。

対象とするVBA関数

今回、VBA関数ラッパーの対象とする関数は、下記のような基準で選択しています。

  • VBAにしか存在しないが、ワークシートでも有用と思われるもの
  • ワークシート関数にも同等の機能を持つ関数があるが、名前が異なり使いづらいと思われるもの

例えば、ワークシート関数にはSubstituteという文字列置換の関数がありますが、Replaceのほうがしっくりくる人も多いのではないでしょうか?

なお、名前が競合しないように、vbというプレフィクスを付けた関数名にしています。

インストール

任意の名前で標準モジュールを追加し、下記のソースを貼り付けるだけです。

使用方法

使い方はワークシート関数と全く同じです。

セルに=vbReplace("hoge/moge", "/", "\")のように書くだけです。

カテゴリー関数内容
StringsvbAsc文字のアスキーコードを取得
StringsvbChrアスキーコードに対応する文字を取得
StringsvbLTrim文字列の左側の空白を除去
StringsvbRTrim文字列の右側の空白を除去
StringsvbReplace文字列の特定の文字を置換
StringsvbStrReverse文字列の左右を反転する
StringsvbString指定文字を指定回数繰り返した文字列を取得する
StringsvbRepeat指定文字列を指定回数繰り返した文字列を取得する
StringsvbInStr文字列中の指定文字列の位置を取得する(前から検索)
StringsvbInStrRev文字列中の指定文字列の位置を取得する(後ろから検索)
StringsvbLCase小文字に変換する
StringsvbUCase大文字に変換する
DateTimevbDateSerial年・月・日から日付を取得する
DateTimevbTimeSerial時・分・秒から時刻を取得する
DateTimevbDateAdd指定日付から指定期間経過した日付を取得する
DateTimevbDateDiff2つの日付の間隔を取得する
MathvbSgn絶対値
MathvbSqr平方根
MathvbRnd乱数
'================================================================================================
' Strings
'================================================================================================
Public Function vbAsc(Expression As String) As Long
    vbAsc = Strings.Asc(Expression)
End Function

Public Function vbChr(CharCode As Long) As String
    vbChr = Strings.Chr(CharCode)
End Function

Public Function vbLTrim(Expression As String) As String
    vbLTrim = Strings.LTrim(Expression)
End Function

Public Function vbRTrim(Expression As String) As String
    vbRTrim = Strings.RTrim(Expression)
End Function

Public Function vbReplace(Expression As String, Find As String, Replace As String, Optional Start As Long = 1, Optional Count As Long = -1, Optional Compare As VbCompareMethod = vbBinaryCompare) As String
    vbReplace = Strings.Replace(Expression, Find, Replace, Start, Count, Compare)
End Function

Public Function vbStrReverse(Expression As String) As String
    vbStrReverse = Strings.StrReverse(Expression)
End Function

Public Function vbString(Number As Long, Character As String) As String
    vbString = Strings.String(Number, Character)
End Function

Public Function vbRepeat(Number As Long, Expression As String) As String
    Dim i As Long
    Dim ret As String
    For i = 1 To Number
        ret = ret & Expression
    Next i
    vbRepeat = ret
End Function
    
Public Function vbInStr(Optional Start As Variant, Optional String1 As Variant, Optional String2 As Variant, Optional Compare As VbCompareMethod = vbBinaryCompare) As Long
    vbInStr = Strings.InStr(Start, String1, String2, Compare)
End Function

Public Function vbInStrRev(StringCheck As String, StringMatch As String, Optional Start As Long = -1, Optional Compare As VbCompareMethod = vbBinaryCompare) As Long
    vbInStrRev = Strings.InStrRev(StringCheck, StringMatch, Start, Compare)
End Function

Public Function vbLCase(Expression As String) As String
    vbLCase = Strings.LCase(Expression)
End Function

Public Function vbUCase(Expression As String) As String
    vbUCase = Strings.UCase(Expression)
End Function


'================================================================================================
' Date
'================================================================================================
Public Function vbDateSerial(Year As Integer, Month As Integer, Day As Integer) As Date
    vbDateSerial = DateTime.DateSerial(Year, Month, Day)
End Function

Public Function vbTimeSerial(Hour As Integer, Minute As Integer, Second As Integer) As Date
    vbTimeSerial = DateTime.TimeSerial(Hour, Minute, Second)
End Function

Public Function vbDateAdd(Interval As String, Number As Double, D)
    vbDateAdd = DateTime.DateAdd(Interval, Number, D)
End Function

Public Function vbDateDiff(Interval As String, Date1, Date2, Optional FirstDayOfWeeek As VbDayOfWeek = vbSunday, Optional FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1)
    vbDateDiff = DateTime.DateDiff(Interval, Date1, Date2, FirstDayOfWeeek, FirstWeekOfYear)
End Function


'================================================================================================
' Math
'================================================================================================

Public Function vbSgn(Number)
    vbSgn = Math.Sgn(Number)
End Function

Public Function vbSqr(Number As Double) As Double
    vbSqr = Math.Sqr(Number)
End Function

Public Function vbRnd(Number) As Single
    vbRnd = Math.Rnd(Number)
End Function
よかったらシェアしてね!

この記事を書いた人

コメント

コメントする

目次
閉じる