3

私は、奇数サイズの空の正方行列を取り、それを数字で埋めるvba関数をExcelで書いています。ただし、関数が呼び出される前に、スプレッドシートで動的に選択された配列のサイズを取得できません。どうすればいいですか?

ありがとう!

4

1 に答える 1

7

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 つの問題があります。

  1. i と j を検査することで解決される元の問題

  2. 単一セル範囲の値が配列バリアントではない特殊なケース

したがって、これが必要になります:

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

それがすべての驚きだと思います。あなたがエキゾチックなものや「この範囲は計算されますか?」のような厄介な質問に興味がある場合を除きます。

于 2012-08-20T17:29:28.643 に答える