【技術記事】最短最速で学ぶ!Excel VBA入門 – 番外編:行列計算 –

みなさん、こんにちは、
みむすたーです。

ここまで、Excel VBAの初歩について取り上げてきましたが、
私も人間ですので、VBAの初歩についての記事をあげるのを少し飽き始めてきてしまいました。

なので今日は、少し趣向を変えて、VBAで行列計算をしてみたいと思います。
それではいきましょう。

行列計算の構想

まず、簡単に構想を練りましょう。
今回の行列計算の方法は、シート単位に一つの行列を表すとしましょう。

例えば、AとBという行列の足し算を考えるとき、
以下のようなシート構成にします。

AとBの行列の計算を行う際に、計算式というシートにAとBの足し算の式を書きます。
以下のような

★マークの行まで上から順番に計算を行うようにします。

行列の足し算

Const LeftEnumOffset As Long = 0    ' 左辺の位置のオフセット
Const ExpOffset As Long = 1         ' 演算子のオフセット
Const RightEnumOffset As Long = 2   ' 右辺の位置のオフセット
Const ResultOffset As Long = 4      ' 結果シートのオフセット

Sub Main()
    Application.Sheets("計算式").Activate
    
    Dim TableTopLeftRow As Integer
    Dim TableTopLeftColumn As Integer
    TableTopLeftRow = ActiveSheet.Cells.Find("左辺").Row
    TableTopLeftColumn = ActiveSheet.Cells.Find("右辺").Column
    
    ' ステップごとに行列を計算する
    Dim step As Integer
    step = 1
    Do While Cells(TableTopLeftRow + step, TableTopLeftColumn) <> "★"
        Dim leftSheetName As String
        Dim Exp As String
        Dim rightSheetName As String
        leftSheetName = Cells(TableTopLeftRow + step, TableTopLeftColumn + LeftEnumOffset)
        Exp = Cells(TableTopLeftRow + step, TableTopLeftColumn + ExpOffset)
        rightSheetName = Cells(TableTopLeftRow + step, TableTopLeftColumn + RightEnumOffset)
        resultSheetName = Cells(TableTopLeftRow + step, TableTopLeftColumn + ResultOffset)
        Dim resultSheet As Worksheet
        Sheets(resultSheetName).Delete
        Set resultSheet = Sheets.Add
        resultSheet.Name = resultSheetName
        
        Select Case (Exp)
            Case "+"
            Call Plus(Sheets(leftSheetName), Sheets(rightSheetName), resultSheet)
            Case Else
            ' その他
        End Select
        
        step = step + 1
    Loop
    
    
End Sub

Function GetMaxRow(ws As Worksheet) As Integer
    GetMaxRow = ws.Cells.SpecialCells(xlLastCell).Row
End Function

Function GetMaxColumn(ws As Worksheet) As Integer
    GetMaxColumn = ws.Cells.SpecialCells(xlLastCell).Column
End Function

Sub Plus(leftWs As Worksheet, rightWs As Worksheet, resultWs As Worksheet)
    If GetMaxRow(leftWs) <> GetMaxRow(rightWs) Or _
        GetMaxColumn(leftWs) <> GetMaxColumn(rightWs) Then
        MsgBox "左辺と右辺の行列が異なるためエラー"
    End If
    
    Dim i As Integer
    Dim j As Integer
    
    For i = 1 To GetMaxRow(leftWs)
        For j = 1 To GetMaxColumn(rightWs)
            resultWs.Cells(i, j) = leftWs.Cells(i, j) + rightWs.Cells(i, j)
        Next j
    Next i
End Sub

今日はこれを作成するだけで疲れたので、いったんここまでです。
明日は残りの計算式の完成とこのプログラムの解説でもします。

コメント