
Collectionで複数のRangeを返す関数を作ったところ、
戻り値のCollection要素からRange型の変数に取り出す時にエラーとなる為
デバッガで見たところ、Range型そのものではなくRangeの展開された内容と
思しきものが入ってました。おそらく、Addするときに意図しない型変換が
かかってしまったものと思いますが、これを抑制する方法はありますか?
(写真添付)
もし無理なら、
・要素数可変の1次元配列(リスト構造)で複数のRangeを扱える。
・要素番号の指定により目的のRangeを取得する。
ことが出来れば手段は問いません。

No.2ベストアンサー
- 回答日時:
> 関数のカッコの有無は戻り値を使うか否かの為とあり、
> まったくキツネにつままれたようです。
こちらなどは分かりやすいと思いますが。
VBAにおける括弧()の使い方
http://excel-ubara.com/excelvba4/EXCEL244.html
bonaronさん よい情報源ありがとうございます。
この現象にハマった時、値渡してとして、無理やりRangeの中のデータが、Objectの中に展開されてこんな結果になったのだろう、だから強制的に参照にする方法があれば試してみるのに(最悪ポインター使おうかとも思いました)が、まさかカッコにこんな意味があったとは…目から鱗です。他の言語の類推から、おそらく大した意味は無いだろうと、何と無く文法エラーにならない書き方を選んでました。
とても勉強になりました。
No.1
- 回答日時:
画像が見ずらいので、ご質問の趣旨を勘違いしているかもしれませんが
以下では、Rangeオブジェクトを読み出せている様です。
--------------------
Sub test()
Dim c As Collection
Set c = New Collection
'複数のセルを選択したRangeオブジェクトを3つAddする。
c.Add Range("A1,A3,A5"), CStr(1)
c.Add Range("B2,B4,B6"), CStr(2)
c.Add Range("C3,C5,C7"), CStr(3)
' セルB1,B3,B5が選択される。
test1(CStr(2), c).Select
Set c = Nothing
End Sub
' collectionとkeyを引数に与え対応するItemを返す。
Function test1(ByRef key As Long, ByRef rngs As Collection) As Range
Set test1 = rngs.Item(key)
End Function
確認ありがとうございました。
出来るはずのようですので少し粘ってみました。
こちらのコードはサンプルとは逆で呼び出される側で
CollectionにRangeを積んで呼び出した側でとりだしています。
積むときに
Collection変数.Add (Range変数) '・・・NG
と書いていたものを
Collection変数.Add Range変数 '・・・OK
のようにカッコを外すと正常に積めました。
改めてカッコの有無の意味を調べるためにググってみたのですが関数のカッコの有無は戻り値を使うか否かの為とあり、
まったくキツネにつままれたようです。
Excel 2010です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBA コレクションに2次元配列を追加して取り出す方法
Visual Basic(VBA)
-
collection型を引数にしたファンクションでコンパイルエラー
Visual Basic(VBA)
-
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
-
4
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
5
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
Excel VBAで文字列の可視長を得るにはどうしたよいでしょうか?
Visual Basic(VBA)
-
8
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Columns("A:C")」の列文字を...
-
worksheetFunctionクラスのVloo...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
テキストボックス中の文字列の...
-
オブジェクト変数の取得について
-
UserForm1.Showでエラーになり...
-
Excel VBAでIEにアクセスするプ...
-
実行時エラー 3265「要求された...
-
EXCEL VBA オートシェイプナン...
-
VBAで別のシートに図形描画
-
PowerPointVBAでスライドマスタ...
-
VB6.0上でExcelオブジェクトを生成
-
CreateObjectとGetObjectの違い
-
Visual Basic.NETのエラー("オ...
-
VBAで Set wb = Sheets(1).Cop...
-
VBScriptからDLL参照設定したい
-
コンパイルエラーの対処がわか...
-
[C#]static void 関数内でthis
-
AccessVBAで「dim dbs as datab...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
テキストボックス中の文字列の...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
上下の位置揃えについて
-
ExcelVBAでのNZ関数について
-
VBAで既に開いている別アプリケ...
-
VBAで Set wb = Sheets(1).Cop...
-
AccessVBAで「dim dbs as datab...
-
EXCEL VBA オートシェイプナン...
-
オブジェクト変数またはWITHブ...
-
[VBA]CDOメッセージ送信エラー
-
エクセルマクロエラー「'Cells'...
-
findメソッドの変数について
-
オブジェクトが見つかりません
-
ある文字列が全て数字であるか...
-
オブジェクト変数の取得について
-
CreateObjectとGetObjectの違い
おすすめ情報