私は、奇数サイズの空の正方行列を取り、それを数字で埋めるvba関数をExcelで書いています。ただし、関数が呼び出される前に、スプレッドシートで動的に選択された配列のサイズを取得できません。どうすればいいですか?
ありがとう!
Range オブジェクトを関数に渡し、値を確認します。
Public Function WhatIsTheMatrix(SourceRange as Excel.Range) As Variant
Dim arrSource as Variant
Dim arrOutPut as Variant
Dim i As Long, j As Long
arrSource = SourceRange.Value2
i = Ubound(arrSource, 1)
j = Ubound(arrSource, 2)
' The lower bounds of an array obtained from a range are always 1
' code
' more code
' even more code
WhatIsTheMatrix = arrOutPut
End Function
ここで、次の 2 つの問題があります。
i と j を検査することで解決される元の問題
単一セル範囲の値が配列バリアントではない特殊なケース
したがって、これが必要になります:
If SourceRange.Cells.Count = 1 Then
Redim arrSource(1 to 1, 1 To 1)
arrSource(1,1) = SourceRange.Value2
Else
arrSource = SourceRange.Value2
End If
その他の事業:
認識されていない仮定があります。つまり、現在の Application.Selection を渡すことができ、それは常に範囲になると考えていました。また、コントロール、チャート、またはチャート シリーズにすることもできます...
...いいえ、これが型の不一致のランタイム エラーを発生させることに依存することはできません。はい、あなたは Option Explicit を呼び出しました。はい、あなたが入力SourceRange as Excel.Range
すると、あなたの母親、教区司祭、治安判事があなたの実行を見守っていました。真夜中過ぎに不吉に見える岩の上で何かを犠牲にしてみてください.VBAランタイムはあなたを信じるでしょう.
したがって、これも必要です:
If Not TypeOf SourceRange Is Excel.Range Then
' Raise an error or Exit Sub
End If
それがすべての驚きだと思います。あなたがエキゾチックなものや「この範囲は計算されますか?」のような厄介な質問に興味がある場合を除きます。