• 締切済み

VBAの配列のLengthについて

はじめまして。 配列の要素の数を出力したいのですが、「修飾子が不正です」と表示されてしまいます。 ネット上の入門サイトで記載されている通りに.Lengthを配列に付けているのに謎です。 どなたか助言をいただければ幸いです。よろしくお願いいたします。 Sub debag() Dim xxx(10) Dim count xxx(1) = 1 xxx(2) = 3 count = xxx.Length MsgBox (count) End Sub

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

VBAにはLengthが無いからUboundを使うというのはNo.1の方の回答通り。 でも、もしかして配列の中で何か値が入っている要素数を求めたいという事でしたら、UBoundでも、もちろんLengthでも求まりません。 #UBound(xxx)では要素数である10が返ります。 その場合、以下のようにします。 count = 0 For i = 0 To UBound(xxx)   If IsEmpty(xxx(i)) = False Then count = count + 1 Next i MsgBox (count)

newquarter33
質問者

お礼

ご丁寧にありがとうございます! 便利なやり方を教えていただき幸いです。 是非利用させていただきます。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

VB.net以降(VB2005等)と違って VBAでは、.Lengthなんてありませんが。 配列の最大要素を求めるときは、 ubound(xxx) を使います。 なお、通常、0から始まります(option baseの指定で1からに変更も可能。lbound(xxx)で 調べることができます)ので、lengthとは1ずれるかと思います。

関連するQ&A

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • 配列のメリットは?

    下記のコードは同じ動作をします。 Sub 普通() Dim moji1 As String Dim moji2 As String moji1 = Range("a1").Value moji2 = Range("a2").Value MsgBox moji1 & moji2 End Sub --------------------------------------------- Sub 配列() Dim moji(2) As String moji(1) = Range("a1").Value moji(2) = Range("a2").Value MsgBox moji(1) & moji(2) End Sub こういう場合は配列を使ったほうがいいのでしょうか? それとも配列は避けたほうがいいのでしょうか?

  • VBAの動的配列について

    いつもお世話になっております。 エクセルVBAを学習中の者です。 動的配列についてお伺いします。 添付資料を見て頂きたいのですが、 シート名1~4に同一レイアウトの表があります。 これらの表をを2次元配列に格納し、その後、同一レイアウトのシートに一括転記したいと考えています。 転記の事を考えて、条件としては、 シート1から2行目以降のデータを配列『data』に格納、変数『dataCnt』が転記先の行番号と同じになるように考えています。 当初は、配列の定義を『Dim data(100,3) As Variant』と、多めに要素数を定義して、コードを記述していました。 正直、凄く気持ちが悪い感じでした・・・ 最近、動的配列を学習しまして、 シートごとにデータの行数を変数『lastRow』に格納して、配列を再定義して【データ数=要素数】とならないか? と思い、下記のようなコードを書いてみました。 が、『ReDim Preserve~』で実行エラーが発生してしまいます。 原因がなぜかわかりません! そもそも、動的配列はこのような使い方は出来ないのでしょうか? Sub テスト() Dim data() As Variant Dim x As Long Dim i As Long Dim ii As Long Dim lastRow As Long Dim dataCnt As Long dataCnt = 2 For x = 2 To 5 Worksheets(x).Activate lastRow = Cells(Rows.Count, 1).End(xlUp).Row If x = 2 Then ReDim data(2 To lastRow, 3) Else ReDim Preserve data(2 To dataCnt + lastRow - 1, 3) End If For i = 2 To lastRow For ii = 1 To 3 data(dataCnt, ii) = Cells(i, ii) Next ii dataCnt = dataCnt + 1 Next i Next x End Sub どなたかご指導をよろしくお願いいたします。

  • マクロ Publicでの配列定義

    Excelマクロで、Publicステートメントで配列を定義し、 プロシージャ内で配列要素を増やすことはできないのでしょうか? 下記ロジックで2つのMsbBoxが表示されるようにしたいです。 よろしくお願いします。 Public pubTMP Sub test() pubTMP(2,2)="aaa" test222 Msgbox pubTMP(2,2) Msgbox pubTMP(3,3) End Sub Sub test222() pubTMP(3,3)="bbb" End Sub

  • 配列変数を引数として(参照)値渡しをしたいのですが

    プロシージャ間で配列変数を引数として(参照)値渡ししたいのですが、例えば以下のような場合、2箇所のXXX部分はどのように記述したらよいのでしょうか。 よろしくお願いします(Excel2000使用) Public Sub give()   Dim a(2) As Byte   a(0) = 3   a(1) = 15   take XXX End Sub Public Sub take(XXX)   (処理省略。受け取り側でも配列変数で処理したい) End Sub ※上記の例では配列の要素数が2ですが、実際はもっと多いので、例えば「take a(0),a(1),・・・」というふうな記述は(仮に適切なものであったとしても)記述しきれません。

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • 配列

    エクセルvbaなのですが Sub test() ' 配列 Dim arr() As Integer= {0, 1, 2, 3, 4, 5} ' 抜き出した要素を格納するための変数 Dim i As Integer ' すべての要素について繰り返す For Each i In arr Console.WriteLine (i) Next End Sub これって何でエラーになるのでしょう? Dim arr() As Integer= {0, 1, 2, 3, 4, 5} でエラーになりますが、なぜだかわかりません。

  • VBAで配列内のエラー値の取得

    エクセルのシートのセル範囲を配列に取り込み処理(他のでーたとの比較)をしようとしています。 ところがデータにエラー値があると型が一致しないというエラーになり失敗します。 非常に単純化して書くとこんな場合です。 myW(1, 2)はエラー値です。 Sub test001()   Dim myW   myW = Selection.Value   MsgBox myW(1, 2) End Sub しょうがないのでエラー値だった場合は文字列にしてしようと試行錯誤の結果、functionを使って下記のようになりました。 Sub test002()   Dim myW   myW = Selection.Value   If IsError(myW(1, 2)) Then     MsgBox Emsg(myW(1, 2))   Else     MsgBox myW(1, 2)   End If End Sub Function Emsg(ByVal x As Variant) As String   Select Case x     Case CVErr(xlErrDiv0): Emsg = "#DIV/0!"     Case CVErr(xlErrNA): Emsg = "#N/A"     Case CVErr(xlErrName): Emsg = "#NAME?"     Case CVErr(xlErrNull): Emsg = "#NULL!"     Case CVErr(xlErrNum): Emsg = "#NUM!"     Case CVErr(xlErrRef): Emsg = "#REF!"     Case CVErr(xlErrValue): Emsg = "#VALUE!"   End Select End Function 現在、これで動いてはおりますが、。もっと簡単にエラー値を文字列として取得できる方法はないでしょうか?たとえばセルの値ならエラー値でも Sub test0001()   MsgBox Cells(1, 2).Text End Sub で取得できますが、いったん配列に入れてしまうとできません。

  • 配列と互換性のない型の要素にアクセスしようとしまし

    以下のソースでサブルーチン呼び出し行で例外「配列と互換性のない型の要素にアクセスしようとしました」が出ます。 -------------------------------------------------------------------------- Private Sub メインルーチン()  Dim Rows() As Data.DataRow = MyDataSet.Tables(MyTableName).Select("条件") if Rows.Count <> 0 then サブルーチン (Rows(0)) end if End Sub Private Sub サブルーチン(ByRef Row As Data.DataRow) '処理 End Sub ---------------------------------------------------------------------------- サブルーチンを呼び出す前に以下のようにするとエラーはでません。 Dim Row as Data.DataRow = Rows(0) サブルーチン (Row) これはなぜなのでしょうか?RowはData.DataRow型であり、配列の要素Rows(0)もData.DataRow型でありエラーが出る意味が分からないのですが。

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

専門家に質問してみよう