ちっとばかり頭の体操の意味も込めて、Excel VBA を jQuery 風に弄れるかどうかのテストを。結論から言えば、結構いけます。行けるんじゃないだろうか?の段階まではできました。
Option Explicit
' 宣言
Private XL As New XLQuery
Sub test001()
XL.Cell("A1").Text = "masuda"
XL.Cell("A1:A10").Text = "masuda"
' 行列指定
XL.Cell(1, 2).Text = "masuda"
' 範囲指定
XL.Cell(1, 2, 10, 2).Text = "masuda"
' 名前定義
XL.Cell("#name").Text = "masuda"
' クラス定義(実は名前)
XL.Cell(".name2").Text = "masuda"
End Sub
Sub test002()
' 背景色を設定
XL.Cell(1, 1).css("background-color") = "#FF0000"
' 文字色を設定
XL.Cell("A2").css("color") = "blue"
End Sub
な風なコードを書くと、
な位まではできることが確認できました。
練習コードも含めてあるので、無駄が多いですが、ちょっと全コードを晒しておきますw 二つのクラス(XLQuery, XLRange)を作ってください。
XLQuery クラス
Option Explicit
''' excel vba query
Private EmptyBook_ As Workbook
Private EmptySheet_ As Worksheet
Private Current_ As Worksheet
Private Selection_ As Range
''' 簡易プロパティ
Public Property Get Application() As Excel.Application
Applicaiton = Excel.Application
End Property
Public Property Get Book() As Workbook
Set Book = Excel.ActiveWorkbook
End Property
Public Property Get Sheet() As Worksheet
Set Sheet = Excel.ActiveSheet
End Property
''' コンストラクタ
Public Sub Class_Initialize()
Set Current_ = Excel.ActiveSheet
Set Selection_ = Excel.ActiveSheet.Cells(1, 1)
End Sub
''' Empty チェック
Public Property Get EmptySheet() As Worksheet
Set EmptySheet = EmptySheet_
End Property
Public Function IsEmptySheet(sh As Worksheet) As Boolean
Set IsEmptySheet = IIf(sh = EmptySheet_, True, False)
End Function
''' Worksheet を取得
Public Function GetSheet(name As String) As Worksheet
Set GetSheet = EmptySheet_
Dim sh As Worksheet
For Each sh In Me.Book.Sheets
If sh.name = name Then
Set GetSheet = sh
Exit For
End If
Next
End Function
''' カレントシートの設定/取得
Public Property Get Current() As Worksheet
If Current_ Is Nothing Then
Set Current = EmptySheet_
Else
Set Current = Current_
End If
End Property
Public Property Let Current(v As Worksheet)
If v Is EmptySheet Then v = Nothing
Set Current_ = v
End Property
''' テキストを取得/設定
Public Property Get Text() As String
If Selection_ Is Nothing Then
Text = ""
ElseIf Selection_ Is Range Then
Dim rg As Range
Set rg = Selection_
Text = rg.Text
Else
Text = ""
End If
End Property
Public Property Let Text(Value As String)
If Not Selection_ Is Nothing Then
If TypeOf Selection_ Is Range Then
Selection_.Value = Value
End If
End If
End Property
''' セルにアクセス
Public Function Cell(r1 As String, Optional c1 As String = "", Optional r2 As String = "", Optional c2 As String = "") As XLRange
Dim rg As New XLRange
' Cell("A1")呼出
' Cell("A1:B10")呼出
' Cell("#id")呼出
' Cell(".class")呼出
If c1 = "" Then
If Left(r1, 1) = "#" Then
rg.self = Me.Sheet.Range(Mid(r1, 2))
ElseIf Left(r1, 1) = "." Then
rg.self = Me.Sheet.Range(Mid(r1, 2))
Else
rg.self = Me.Sheet.Range(r1)
End If
' Cell(1,1)呼出
ElseIf r2 = "" Then
rg.self = Me.Sheet.Cells(CInt(r1), CInt(c1))
' Cell(1,1,2,10)呼出
Else
rg.self = Me.Sheet.Range(Me.Sheet.Cells(CInt(r1), CInt(c1)), Me.Sheet.Cells(CInt(r2), CInt(c2)))
End If
Set Cell = rg
End Function
XLRange クラス
Option Explicit
Private text_ As String
Private range_ As Range
Public Property Get Text() As String
Text = text_
End Property
Public Property Let Text(v As String)
text_ = v
If Me.self Is Nothing Then Exit Property
Me.self.Value = v
End Property
Public Property Get self() As Range
Set self = range_
End Property
Public Property Let self(v As Range)
Set range_ = v
End Property
Public Property Let css(prop As String, v As String)
If Me.self Is Nothing Then Exit Property
Select Case StrConv(prop, vbLowerCase)
Case "background-color": self.Interior.Color = toRGB(v)
Case "color": self.Font.Color = toRGB(v)
End Select
End Property
Private Function toRGB(v As String)
If Left(v, 1) = "#" Then
Dim r, g, b
r = CInt("&H" + Mid(v, 2, 2))
g = CInt("&H" + Mid(v, 4, 2))
b = CInt("&H" + Mid(v, 6, 2))
toRGB = RGB(r, g, b)
Else
Select Case v
Case "red": toRGB = RGB(255, 0, 0)
Case "blue": toRGB = RGB(0, 0, 255)
Case "green": toRGB = RGB(0, 255, 0)
' このあたりは後で
End Select
End If
End Function
プロパティとパラメータの省略(option)を駆使して、それ風に動くようにします。VBA の制限としてクラスをひとつのファイルに複数のクラスを置けないので、利用する側を考慮してクラスは多くない様にします。なので、継承など本来のオブジェクト指向は無視して(苦笑)、使いやすい形で「オブジェクト」の部分だけ残しておくということで。
XLRange クラスの css プロパティを使って、スタイルシート風に設定ができるようにすれば、Excel のオブジェクトを覚えなくて良いので、その点は楽かなと。


XLQuery だと接頭子が Excel 本家とバッティングするので、EvQuery あたりが良いですね。