みなさん、こんにちは、
みむすたーです。
ここまで、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
今日はこれを作成するだけで疲れたので、いったんここまでです。
明日は残りの計算式の完成とこのプログラムの解説でもします。
コメント