[[20190505185959]] 『VBA 配列』(パオパオ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA 配列』(パオパオ)

2次元配列で、要素数を取得できません。
なにをどのように、確認すればよいか、教えてください。
どこが間違えているか教えてください

Dim Ran As Variant

Set Ran=Workbooks("test.xslm").Worksheets(1)ge("A1A:Z100")

■確認事項
IsArray(Ran)→True
IsArray(Ran,1)→コンパイルエラー 引数が一致していない又不正なプロパティ
LBound(Ran)→実行時エラ:13 型が一致しません
LBound(Ran,1)→実行時エラ:13 型が一致しません
■ローカルウインド
下記でデータは取得できており、
Formulaに Variant/Variant(1to100,1 to 52)
Ran(1,1)でイミディエイトウィンドウで要素の内容を確認する事ができます。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 手打ちじゃなく、VBE画面からコピーペイストしてください。
 Sub test()
    Dim rng As Range
    Dim v As Variant

    Set rng = Range("A1:B3")
    v = rng.Value

    Debug.Print IsArray(v)  'True
    Debug.Print LBound(v, 1)    '1
    Debug.Print LBound(v, 2)    '1
    Debug.Print UBound(v, 1)    '3
    Debug.Print UBound(v, 2)    '2
    Debug.Print UBound(v)       '3  (省略は 1指定と同じ)
 End Sub
 UBOUND,LBOUNDのヘルプを読んで下さい。
(γ) 2019/05/05(日) 19:54

 >Set Ran=Workbooks("test.xslm").Worksheets(1)ge("A1A:Z100") 

  Set Ran=Workbooks("test.xslm").Worksheets(1).Range("A1:Z100")  ですね?

 そうだとして、Ranの実体は「Rangeオブジェクト」です。
 つまり配列じゃないんですよ。それ、分かっていますか?

 これがエラーにならず、Trueを返すのは謎ですが、多分こんな処理をする仕様だと考えるしかない。
    ↓                       ↓
 IsArray(Ran)                   IsArray(Ran.Value)

 通常の変数じゃないので、これがエラーになったって別に不思議じゃないです。
              ↓
 LBound(Ran)→実行時エラ:13 型が一致しません

 初めに戻って、なんでSetなんて書くんですか? 止めて、Valueプロパティを取得すればいいじゃないですか?
 ↓
 Set Ran=Workbooks("test.xslm").Worksheets(1).Range("A1:Z100") 

   Ran=Workbooks("test.xslm").Worksheets(1).Range("A1:Z100") 
   ↑
 普通にこうすれば、悩む必要ないです。

  ※ついでですが、よく分からない内は、チャンとプロパティも明示した方がいいです。
                                                                 ↓
   Ran=Workbooks("test.xslm").Worksheets(1).Range("A1:Z100").Value 

  (初心者の内から、下手に省略すると理解があやふやになります)

(半平太) 2019/05/05(日) 20:00


早速ありがとうございました。
Setを外す事で、エラー回避する事ができました。

意味を飲み込めないまま進めており、
配列に入れる際のプロパティの省略も気づいておりませんでした。

ありがとうございました。

(パオパオ) 2019/05/05(日) 20:34


 >これがエラーにならず、Trueを返すのは謎ですが、多分こんな処理をする仕様だと考えるしかない。

 これを思い出したので一応。
 http://scripting.cocolog-nifty.com/blog/2008/04/isempty_0816.html

 ここを見ると、Is〜(Isobjectを除く)関数は既定プロパティをもつオブジェクトの場合、
 それに対して評価するようです。

 それに対して、LBound関数は引数に「配列変数の名前を指定」するとなってますので、
 オブジェクト変数を指定することでエラーになったのでは。
 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/lbound-function
(2u) 2019/05/05(日) 20:35

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.