t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA クラスモジュールを気軽に使う その2

その1ではOperatableNumberというオブジェクトを作成した。
thom.hateblo.jp

似たような内容になるが、今回はOperatableStringを作成してみようと思う。
※なお、サンプルなので変数の型などは一部省略している。

クラスモジュールを追加し、以下のコードを追加した後、OperatableStringという名称に変更する。

Dim s As String

Property Let Value(x As String)
    s = x
End Property

Property Get Value() As String
    Value = s
End Property

Function Left(n) As OperatableString
    Dim tmpS As New OperatableString
    tmpS.Value = VBA.Left(s, n)
    Set Left = tmpS
End Function

Function Right(n) As OperatableString
    Dim tmpS As New OperatableString
    tmpS.Value = VBA.Right(s, n)
    Set Right = tmpS
End Function

Function Join(str) As OperatableString
    Dim tmpS As New OperatableString
    tmpS.Value = s & str
    Set Join = tmpS
End Function

以下のテクニックを使用し、Valueをデフォルトプロパティにしておく。
thom.hateblo.jp

そしてこのオブジェクトを用いたコードがこちら。

Sub test()
    Dim s As New OperatableString
    s = "Hello, VBA!!"
    
    '普通に出力
    Debug.Print s
    
    '従来通りのやり方
    Debug.Print Left(Right(s, 5), 3) & " is easer than VB.NET"
    
    'オブジェクトの機能を使ったやり方
    Debug.Print s.Right(5).Left(3).Join(" is easer than VB.NET")
    
    '上記の操作を行っても、値に影響は与えない。
    Debug.Print s
    
End Sub

従来のやり方に比べるとカッコがネストせず左から順に適用されるので読みやすい。
※あくまでサンプルなので、Midでいいじゃないかというツッコミは無しで。

ところでVB.NETのString型は、オブジェクト型である。
VB.NETにもLeft, Right, Midは存在するようだがあまり使用されておらず、String型のメソッドであるSubstringを主に使用する。

IntegerやStringなどの基本型がメソッドを持っていると、記述がシンプルになって良い。
VB.NETのこの機能をうらやましいと思っていたが、クラスモジュールを使えば自分で実装できる。


余談であるが、Rubyという言語では面白いことにリテラルがメソッドを持つ。

リテラルというのはコード中に直接書かれている値のことである。
プログラミングの世界では変数を指して「値xを~」などという言い方もするので、直接書かれた値を「リテラル」という言葉で区別しているわけだ。

x = 10としたときの10はリテラルである。
MsgBox "Hello"としたときの"Hello"もリテラルである。

さて、リテラルがメソッドを持つとはどういうことか。

つまり、こう書けるのである。

"Hello, Ruby".slice(7,4)

sliceメソッドは、VBAでいうMid関数だと思えばよい。
上記は"Ruby"が帰ってくる。

文字列に命令を出せるなんて変な気はするが、優れたアプローチだと思う。
VBAもこれくらい進化してくれたら。。と時々思わなくもない。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。