VBA 行列 – 作成および詳細

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

masahiro yoshida

Last updated on 6月 13, 2022

このチュートリアルでは、VBAで配列を使用して行列を作成する方法を説明します。

行列は、行と列に相当する数値を持つ2次元の配列で表すことができます。VBAで行列を作成するには、Array型変数に値を入力し、VBAループを使用します。

VBAで行列を作成する

Sub CreateSimpleMatrix()
   Dim matrix() As Integer
   Dim x, i, j, k As Integer
'配列の大きさを変更する
   ReDim matrix(1 To 3, 1 To 3) As Integer
   x = 1
   For i = 1 To 3
      For j = 1 To 3
         matrix(i, j) = x
         x = (x + 1)
      Next j
   Next i
'結果を一度にシートに戻す
   Range("A1:C3") = matrix
End Sub

上記のプロシージャを実行すると、Range(“A1:C3”)に単純な行列がワークシートに返されます。

vba matrix simple

一行のベクトルを行列に変換する

次のような数値の列を考えてみましょう。数値の列を行列に変換したいと思うことがあるかもしれません。

vba matrix convert

以下の関数を使用すると、数値のリストから行列を作成することができます。

Function Create_Matrix(Vector_Range As Range, No_Of_Cols_in_output As Integer, No_of_Rows_in_output As Integer) As Variant
   ReDim Temp_Array(1 To No_Of_Cols_in_output, 1 To No_of_Rows_in_output)
   Dim No_Of_Elements_In_Vector As Integer
   Dim Col_Count As Integer, Row_Count As Integer

   No_Of_Elements_In_Vector = Vector_Range.Rows.Count

'NULL条件を排除する
   If Vector_Range Is Nothing Then Exit Function
   If No_Of_Cols_in_output = 0 Then Exit Function
   If No_of_Rows_in_output = 0 Then Exit Function
   If No_Of_Elements_In_Vector = 0 Then Exit Function

   For Col_Count = 1 To No_Of_Cols_in_output
      For Row_Count = 1 To No_of_Rows_in_output
         Temp_Array(Col_Count, Row_Count) = Vector_Range.Cells(((No_of_Rows_in_output) * (Col_Count - 1) + Row_Count), 1)
      Next Row_Count
   Next Col_Count
   Create_Matrix = Temp_Array

End Function

上記の関数を呼び出すと、Excelシートに行列を作成することができます。

Sub ConvertToMatrix()
   Range("C1:H2") = Create_Matrix(Range("A1:A10"), 2, 6)
End Sub

vba vector to matrix

行列を1行のベクトルに変換する

また、行列を1行に変換することもできます。次のような行列を考えてみましょう。

vba-matrix-2dim

これを以下の関数で1次元の配列に変換します。

Fcuntion Create_Vector(Matrix_Range As Range) As Variant
   Dim No_of_Cols As Integer, No_Of_Rows As Integer
   Dim i As Integer
   Dim j As Integer
'行列から行と列を得る
   No_of_Cols = Matrix_Range.Columns.Count
   No_Of_Rows = Matrix_Range.Rows.Count
   ReDim Temp_Array(No_of_Cols * No_Of_Rows)
'NULLを排除する
   If Matrix_Range Is Nothing Then Exit Function
   If No_of_Cols = 0 Then Exit Function 
   If No_of_Rows = 0 Then Exit Function
'配列の最初の要素までループする
   For j = 1 To No_Of_Rows
'次に2番目の要素までループする
      For i = 0 To No_of_Cols - 1
'1次元の一時配列に代入する
         Temp_Array((i * No_Of_Rows) + j) = Matrix_Range.Cells(j, i + 1)
      Next  i
   Next j
   Create_Vector = Temp_Array
End Function

この関数を呼び出すには、以下のプロシージャを使用します。

Sub GenerateVector()
   Dim Vector() As Variant
   Dim k As Integer
   Dim No_of_Elements
'配列の取得
   Vector = Create_Vector(Sheets("Sheet1").Range("A1:D5"))
'配列をループしてシートに入力する
   For k = 0 To UBound(Vector) - 1
      Sheets("Sheet1").Range("G1").Offset(k, 0).Value = Vector(k + 1)
   Next k
End SUb

このプロシージャは、次のような結果を返します。 vba matrix to vector

WorksheetFunction.MMULTを使った行列配列の作成

次のようなスプレッドシートを考えてみましょう。

vba-matrix-empty-interest

以下のプロシージャを使用して、金利とその人が借りたい金額に基づいて、上のグリッドの金利額を計算することができます。

Sub UseMMULT()
   Dim rngIntRate As Range
   Dim rngAmtLoan As Range 
   Dim Result() As Variant
'Rangeオブジェクトを設定する
   Set rngIntRate = Range("B4:B9")
   Set rngAmtLoan = Range("C3:H3")
'MMULT 計算式を使用してResultを埋める
   Result = WorksheetFunction.MMult(rngIntRate, rngAmtLoan)
'シートに入力する
   Range("C4:H9") = Result
End Sub

vba matrix filled

上記のシートでは、上記のプロシージャが数式ではなく値をセルに入力していることにお気づきでしょう。上の図のC4を見てください。 このように ワークシート関数 を使用すると、数式ではなく、常に静的な値がワークシートに返されます。 つまり、金利や融資額が変わっても、マトリックスに入力された値は変化しません

WorksheetFunction.MMULT を使用する代わりに、VBA を使用してFormulaArray メソッドを使用して MMULT 関数をセルに適用することができます。

Sub InsertMMULT()
   Range("C4:H9").FormulaArray = "=MMULT(B4:B9,C3:H3)"
End Sub

これで、スプレッドシートが入力されると、セルで数式が使用されることに注意してください。

vba matrix formula array

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Return to VBA Code Examples