Excel VBAメモ:UBound関数と多次元配列

現在仕事ではVBAをメインにプログラミングをしているのですが、今まで困っていた点が解決できたのでメモしておきます。
今回は下記の関数になります。

UBound()
配列の最大添え字(要素数-1)を返す関数


相変わらず初歩的なものです。
まず簡単な利用例を書こうかと思います。


'(利用例)
Dim test(3) As Long
Dim i As Long

For i = 0 To UBound(test)
  '配列の要素数だけループ
Next i

まぁこんな感じの配列のループ処理にはUBound()は重宝するかと思います。

さて、私がVBAを始めて数ヶ月間悩んでいたのは以下のような場合です。

'(NG例)
Dim test(3,5) As Long
Dim i As Long

For i = 0 To UBound(test)
  'エラーで処理できません
Next i

見てわかる人は多いと思いますが、これではエラーがでます。
UBoundの引数に多次元配列が指定されている為、エラーが出ます。

この為、私は多次元配列の最大添え字(要素数-1)は調べられないものと思い込み、不便だなーと思っていました。
…が、よくよく調べてみるとUBound関数で多次元配列の最大添え字(要素数-1)を確認する方法はありました。
というかExcelのヘルプに書いてましたよ…(ぉぃ


'(利用例)
Dim test(3,5) As Long
Dim i As Long

For i = 0 To UBound(test,1)
  '多次元配列1次元の要素数だけループ
Next i
For i = 0 To UBound(test,2)
  '多次元配列2次元の要素数だけループ
Next i


…これだけでした…orz
UBound関数の2次引数に次元番号を入れれば、その最大添え字(要素数-1)が返されるようです。

ヘルプとかマニュアルはちゃんと読まないといけないですね。
でもExcelのヘルプはわかりにくいので読む気がしないッス…(汗




コメント
有難うございます。同じ所で悩んでいたので、助かりました。
  • はぎ
  • 2008/08/08 12:19 PM
内容の説明も判り易いですし、こういう記事が「人のの為になる記事」と言うんでしょうね。
答えが解り、スッキリしました。有難う御座いました。
  • Ringo
  • 2009/06/10 11:03 AM
ありがとうございます。
自分も同じところで不便と感じてました。
ググるより、ヘルプを見ないといけないですね。
  • medaka
  • 2009/07/19 10:11 PM
Function ArrayCount(ByRef source As Varinat) As Long
Dim c As Varinat
Dim i As Long
For Each c In source
i = i + 1
next c
ArrayCount = i
End Function

これで配列が何次元であっても要素数が取得できると
思いますがどうなんでしょう?
  • ハモ
  • 2013/02/14 9:10 PM
訂正 <(_ _)>
Function ArrayCount(ByRef source As Variant) As Long
Dim c As Variant
Dim i As Long
For Each c In source
i = i + 1
Next c
ArrayCount = i
End Function
  • ハモ
  • 2013/02/14 9:14 PM
>ハモさん
確かにFor Eachで複数次元の全ての数がカウントできますね!
For Eachは配列のポインタの先頭から最後のポインタまでループするので
(VBなのでポインタといっていいかは疑問ですが)
配列(2, 3, 4)とあった場合、配列(0, 0, 0)〜(2, 3, 4)を順番にループします。
これは他の言語でも同じように動くでしょうね。
「VBだから」と思って使ったことなかったのですが、できたんですね。
ただ、本記事は次元ごとの個数を取得するのが目的だったので、内容はこのままにさせて頂きます。
ご指摘ありがとうございました!
参考になりましたm(__)m
  • SK
  • 2013/03/26 2:52 PM
Ubound関数は、配列の要素数ではなく、最大の添え字を返すのではないでしょうか。下が1から始まる配列では要素数と一致しますが、0から始まる場合は(要素数-1)が返ると思いますが。
  • oldLEVIN
  • 2014/04/06 4:38 PM
>oldLEVINさん
かなり遅くなりましたが、ご指摘ありがとうございます。
VBを始めたばかりの頃に書いた記事だったので理解不足ですね。。。
書き直しました。
  • 謎猫
  • 2014/12/28 11:38 PM
助かりました
  • 名前のない怪物
  • 2015/06/21 6:21 PM
コメントする








    
この記事のトラックバックURL
トラックバック