【VBA】配列の宣言時の要素数について

このQ&Aのポイント
  • VBAで配列を宣言する際、要素数には定数式が必要です。
  • 上記のコードでは、要素数を変数(SampleCount)として指定していますが、これではエラーが発生します。
  • 要素数を変数として指定する場合は、配列を動的に宣言する必要があります。
回答を見る
  • ベストアンサー

配列の宣言時の要素数について

VBAで、配列を始めて使うものです。ここで、以下のコードを実効すると「定数式が必要」とエラーがでてきます。どうも配列の宣言時の要素数[SampleCount-1]に問題あるようです。SampleCountは、このコードを使用するにあたり変化する値で、実際には変数として使用するつもりです。したがってここでは仮に[SampleCount = 5]としています。上述の意図を満たすにはこのコードをどうのように変化すればよいのでしょうか?教えてください。 Dim SampleCount As Integer Sub DiameterAndRatio() SampleCount = 5 Dim AAA(SampleCount - 1) As integre For i = 1 To SampleCount AAA(i - 1) = Cells(5 + i - 1, 2) MsgBox AAA(i - 1) Next i End Sub

  • e-l
  • お礼率45% (158/349)

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

こんな感じでしょうか。 Dim SampleCount As Integer Dim AAA() As Integer Sub DiameterAndRatio()   SampleCount = 5   ReDim AAA(SampleCount - 1) As Integer   Dim i As Integer      For i = 1 To SampleCount     AAA(i - 1) = Cells(5 + i - 1, 2)     MsgBox AAA(i - 1)   Next i End Sub

e-l
質問者

お礼

有難う御座います。Redimで動的配列変数を再定義するのですね。よく分かりました。

関連するQ&A

  • 配列を引数で渡したりするには?

    初心者なので困っています。配列をほかのサブルーチンへ渡して、その中で配列の値を書き換えて、上層のルーチンへ渡すにはどうしたらよいのでしょうか? 初心者なので、みなまさまのお知恵を拝借させてください。よろしくお願いします。 Private Sub Print() Dim C_ALL(3) As Integer Dim D_ALL(3) As Integer Data_Set(C_ALL(), D_ALL()) MsgBox(C_ALL() & " " & D_ALL()) '配列内容すべて表示 End Sub Private Sub Data_set(ByRef C_ALL As Integer, ByRef D_ALL As Integer) Dim i As Integer For i = 0 To 4 C_ALL(i) += i D_ALL(i) += i i += 1 Next End Sub

  • 配列を関数に渡す方法

    VB6.0のプログラムで質問があるのですが 下のプログラムのように配列num、num1を関数AAAに 渡したいと思うのですがどうすればいいのでしょうか? よろしくお願いいたします。 Option Explicit Private num(10) As Integer Private num1(10) As Integer Private Sub Write_Click()    AAA(num)    AAA(num1) End Sub Private Function AAA(???)    Dim i As Integer    For i = 1 To 10       ???(i) = i    Next i End Function

  • 配列

    エクセル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で、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • 以下のデータがあり、これをExcel VBAの連想配列として格納したい

    以下のデータがあり、これをExcel VBAの連想配列として格納したいと考えています。 MsgBoxでキーとアイテムを表示させると表示されるのですが、 最後に一例としてExistsで確認するとFalseが返ってきます。 これは配列に格納されていないのでしょうか。 また格納されていないとすると、どうすれば格納できるのでしょうか。 A 列   B列 35   apple 37   orange 40   banana 以下がコードです。 sub test() Dim i as integer Dim myDic as Object Dim keys as Variant Set myDic = CreateObject("Scripting.Dictionary") For i = 1 to 3 myDic.Add Cells(i, 1), Cells(i, 2) Next i keys = myDic.keys For Each keys In myDic MsgBox "キー名:" & keys & vbCr & "値:" & myDic.Item(keys) Next keys MsgBox myDic.Exists(35) End Sub

  • 配列 変数の宣言 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の最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • ExcellVBA ForNextについて

    VBA勉強中の者です。 早速ですが、質問させて頂きます。 A1からC3に数値があります。 なるだけCellsプロパティを使用し、直接的なセルのアドレス指定をせずに A1+A1をA5、B1+B1をB5、C1+C1をC5、 A1+A2をA6、B1+B2をB6、C1+C2をC6、 A1+A3をA7、B1+B3をB7、C1+C3をC7、と返したいのです。 コードは以下の通りです。 Sub test() Dim rng1 As Range Dim aaa As Integer Dim i As Integer Dim bbb As Integer '------------------------- For aaa = 1 To 3 '------------------------- For bbb = 5 To 7 '------------------------- For i = 1 To 3 '------------------------- Set rng1 = Cells(aaa, i) Cells(bbb, i) = Cells(1, i) + rng1 MsgBox (Cells(1, i) + rng1) '------------------------- Next i '------------------------- Next bbb '------------------------- Next aaa '------------------------- End Sub 数値を返すセルを指定するコードが間違っていると思われ、 複数のセルに同じ数値を何度も返してしまいます。 数日間調べつつ改善しましたがどうしても解決できず、どなたかご助力お願い致します。

  • 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の質問です。 環境は下記になります。 OS=windowsXP SP3 Office=Excel2003(11.8347.8403) SP3 会社などで一般的にVBAを使用してデータの処理をする場合、自動で吐き出されるcsvファイルを読み込んで、そのデータを加工し、使いたいデータに成型する。というケースが往々にしてあると思うのですが、吐き出されるcsvファイルのタイトル行が今までのものと同一でない(フィールドが知らないうちに増えたり減ったりしている)場合を想定し、csvファイルを取り込んだ時点でタイトル行の検査をしたいのですが、csvファイルのタイトル行を一旦配列に格納し、あらかじめ用意しておいたタイトル行のデータと比較する場合、配列内の一要素ずつ検査するしかないのでしょうか? 例としてはタイトル行が "品名", "4月", "5月", "6月", "7月", "8月", "9月" と仮定し、 Sub test()  Dim EndClm As Long  Dim TitleA As Variant  Dim TitleB As Variant  Dim i As Long  EndClm = Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column  TitleA = Workbooks("aa.csv").Sheets(1).Range(Sheets(1).Cells(1, 1),Sheets(1).Cells(1, EndClm)) 'csvファイルのタイトル行  TitleB = ThisWorkbook.Sheets(1).Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(1, EndClm)) '検証用 "品名", "4月", "5月", "6月", "7月", "8月", "9月"  For i = 1 To UBound(TitleA, 2)   If TitleA(1, i) <> TitleB(1, i) Then MsgBox "項目が変更されています"  Next i End Sub のようなコードで1つずつ検証できますが、配列内の要素を一気に検証する方法はありますか? 当然通りませんが If TitleA <> TitleB Then MsgBox "項目が変更されています" のような感じです。 短いコードで確実にタイトル行の検査が行われれば、上記の配列に取り込んで要素を検証することに特に頓着はしていません。 今このテストコードを自宅のWindows7,Excel2010で書いていて思ったのですが、TitleA、TitleB共に配列に取り込む際、ブックをアクティブにしないとエラーが起きてしまいます。 もしよろしければこの原因も併せて教えていただいてもよろしいでしょうか。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

専門家に質問してみよう