Skip to content

Instantly share code, notes, and snippets.

@YujiFukami
Created April 1, 2025 08:22
Show Gist options
  • Save YujiFukami/c7a142fca1f6c5656ec60aab720d6552 to your computer and use it in GitHub Desktop.
Save YujiFukami/c7a142fca1f6c5656ec60aab720d6552 to your computer and use it in GitHub Desktop.
'PushValueArray2DRow・・・元場所:IkiAddin.ModArray
'ExpandArray2DRow ・・・元場所:IkiAddin.ModArray
'IsArray2D ・・・元場所:IkiAddin.ModArray
'IsArray2DStart1 ・・・元場所:IkiAddin.ModArray
Public Function PushValueArray2DRow(ByRef Array2D As Variant, _
ParamArray Values() As Variant) _
As Variant
'二次元配列の行方向に値を追加する
'20240324
'20241124 要素がオブジェクトでも対応可能に
'https://www.softex-celware.com/post/pushvaluearray2drow
'引数
'Array2D・・・対象の二次元配列
'Values ・・・追加する要素の値を可変長引数配列で複数入力
Dim ColCount As Long: ColCount = UBound(Values, 1) + 1
Dim Output As Variant
Dim MaxRow As Long
If IsEmpty(Array2D) = True Then
ReDim Output(1 To 1, 1 To ColCount)
MaxRow = 1
Else
Output = ExpandArray2DRow(Array2D, 1)
MaxRow = UBound(Output, 1)
End If
Dim I As Long
For I = 1 To ColCount
If IsObject(Values(I - 1)) = False Then '20241124
Output(MaxRow, I) = Values(I - 1)
Else
Set Output(MaxRow, I) = Values(I - 1)
End If
Next
'出力
PushValueArray2DRow = Output
End Function
Private Function ExpandArray2DRow(ByRef Array2D As Variant, _
Optional ByRef AddRow As Long = 1) _
As Variant
'二次元配列の最終行の後ろに行を追加する。
'20211103
'20241124 要素がオブジェクトでも対応可能に
'https://www.softex-celware.com/post/expandarray2drow
'引数
'Array2D ・・・二次元配列
'[AddRow]・・・追加する行の個数/省略なら1
'返り値
'二次元配列の最終行の後ろに行が追加された二次元配列
'引数チェック
If IsArray2D(Array2D) = False Then Exit Function '二次元配列かチェック
If IsArray2DStart1(Array2D) = False Then Exit Function '開始要素番号が1かチェック
If AddRow <= 0 Then
MsgBox "AddRowは1以上の値を入力してください", vbExclamation
Stop
Exit Function
End If
'処理
Dim I As Long
Dim J As Long
Dim N As Long: N = UBound(Array2D, 1) '縦要素数
Dim M As Long: M = UBound(Array2D, 2) '横要素数
Dim Output As Variant: ReDim Output(1 To N + AddRow, 1 To M) '出力する二次元配列
For I = 1 To N
For J = 1 To M
If IsObject(Array2D(I, J)) = False Then '20241124
Output(I, J) = Array2D(I, J)
Else
Set Output(I, J) = Array2D(I, J)
End If
Next J
Next I
'出力
ExpandArray2DRow = Output
End Function
Private Function IsArray2D(ByRef Array2D As Variant, _
Optional ByRef ArrayName As String = "Array2D") _
As Boolean
'入力配列が二次元配列かどうかチェックする
'20210804
'20220309 変数名変更
'20241230 Functionプロシージャにして判定結果を返す
'https://www.softex-celware.com/post/isarray1d
'引数
'Array2D ・・・チェックする配列
'[ArrayName]・・・エラーメッセージで表示する時の名前
On Error Resume Next
Dim Dummy2 As Long: Dummy2 = UBound(Array2D, 2)
Dim Dummy3 As Long: Dummy3 = UBound(Array2D, 3)
On Error GoTo 0
If Dummy2 = 0 Or Dummy3 <> 0 Then
MsgBox ArrayName & "は二次元配列を入力してください", vbExclamation
Stop 'エラーを確認するために一度停止する
Exit Function 'Falseが返ってくる
End If
'出力
IsArray2D = True
End Function
Private Function IsArray2DStart1(ByRef Array2D As Variant, _
Optional ByRef ArrayName As String = "Array2D") _
As Boolean
'入力二次元配列の開始番号が1かどうかチェックする
'20210804
'20220309 変数名変更
'20241230 Functionプロシージャにして判定結果を返す
'https://www.softex-celware.com/post/isarray1d
'引数
'Array2D ・・・チェックする二次元配列
'[ArrayName]・・・エラーメッセージで表示する時の名前
If LBound(Array2D, 1) <> 1 Or LBound(Array2D, 2) <> 1 Then
MsgBox ArrayName & "の開始要素番号は1にしてください", vbExclamation
Stop 'エラーを確認するために一度停止する
Exit Function 'Falseが返ってくる
End If
'出力
IsArray2DStart1 = True
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment