dimを使わずにredimを使う場合の違いは?

このQ&Aのポイント
  • VBAを使っていて、配列数を変数で定義したい場合、通常は`Dim`で配列を定義し、`Redim`でサイズを変更しますが、`Dim`を省略して直接`Redim`で配列を定義することも可能です。
  • ただし、後者の方法は配列の値の型を指定することができません。つまり、`Redim aaa(xxx, yyy) as integer`のように明示的に型指定を行うことができないため、省略する場合は注意が必要です。
  • また、後者の方法では配列の初期化も行えません。つまり、`Dim`の後に要素数を指定して初期化することができないため、初期化が必要な場合は`Dim`を使用する必要があります。
回答を見る
  • ベストアンサー

dimを使わずにredimを使う場合

VBAを使っていて、 配列数を変数で定義したいのですが、 ネットで検索すると Dim aaaa() as integer Redim aaa(xxx, yyy) あるいは Dim aaaa() Redim aaa(xxx, yyy) as integer のようにdimで変数を定義した後にredimで定義しなおす方法が書かれてあります。 一方で、 Redim aaa(xxx, yyy) as integer のように、dimの定義を省略して、いきなりredimで配列を定義しても 問題なくプログラムは実行できることに気がついたのですが これら二つの方法に違いはあるのでしょうか? 後者を使っても問題ないでしょうか?

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

  • ベストアンサー
  • nofx35
  • ベストアンサー率82% (14/17)
回答No.1

ReDimのヘルプより メモ 宣言した変数がモジュール レベルまたはプロシージャ レベルにない場合、 ReDim ステートメントは宣言ステートメントと同様の働きをします。同じ名前を 持つほかの変数が後で作成されると、その変数の適用範囲 (スコープ) が広く、 Option Explicit ステートメントが指定されている場合でも、 ReDim ステートメントは後で作成された変数を参照し、コンパイル エラーは発生しません。 このような名前の競合を避けるには、ReDim ステートメントは宣言ステートメント として使わず、配列を再定義するためだけに使用します。 と、ありますので宣言なしでRedimはしない方がいいでしょうね。 バグの温床になりそうな気配です。

関連するQ&A

  • array関数に指定する引数が可変個の場合どうしたらよいでしょうか?

    array関数に指定する引数が可変個の場合どうしたらよいでしょうか? arrValue = Array("a","b","c") 上記のように、array関数を使ってvariant型の変数に格納したいのですが、 arrayに指定する個数が可変個の場合、どうやったらよいのでしょうか? arrayに指定する値は、他のプログラムによって 配列型変数"aaa"に格納済みです。 aaaに格納される配列数は可変個のため、 dim aaa() as string で定義して、取得できた数によって Redim で再定義しています。 aaaの配列数に応じて、if文などで、 配列数が1個だったら、arrValue = Array(aaa(0)) 配列数が2個だったら、arrValue = Array(aaa(0),aaa(1)) とすればできないことはないのですが、何個までを想定すればよいかも わからないため、困っています。 何かよい方法はないでしょうか?

  • Dim は何の略ですか?

    エクセルで変数の型宣言をするとき、例えば Dim 変数 As Integer と書きますが、このDimは何の略でしょうか? 宣言はdeclarationだし、Dimから考えられるのは Dimensionですが、これは次元とかの意味で少し 違うような気がするのですが。

  • ASPにおいてのRedim

    ASPにおいて配列数を再定義するRedimはつかえないようですが、これにかわる方法はないのでしょうか?? 宣言する際に固定で配列数を決めておくほかにないのでしょうか?? よろしくおねがいします!!!!

  • VBA Redim において変数で次元を増やすには?

    お世話かけます。 Dim Rd(),Ar as variant Ar="1,1,1" ReDim Rd(Ar) 上記の様な変数(Ar)で結果として、3次元 Rd(1,1,1)としたいのですが、 一次元として処理されます。 ''''' Rd=Array(1,1,1) 否応なく、Rd(1)(1)(1)一次元として処理しています。 変数設定で多次元配列にする記述式か処理方法をご教示願います。

  • DictionaryとRedim

    Windows XP & Visual studio2005を使用しています。 以下のようなコードを書きました。 Sub Main() Dim dic1 As New Dictionary(Of Integer, Integer()) Dim dic2 As New Dictionary(Of Integer, Integer()) Dim arr1(3) As Integer Dim arr2(3) As Integer arr1(0) = 0 arr1(1) = 1 arr1(2) = 2 arr1(3) = 3 dic1.Add(0, arr1) arr1(0) = 100 arr1(1) = 101 arr1(2) = 102 arr1(3) = 103 dic1.Add(100, arr1) arr2(0) = 0 arr2(1) = 1 arr2(2) = 2 arr2(3) = 3 dic2.Add(0, arr2) ReDim arr2(3) arr2(0) = 100 arr2(1) = 101 arr2(2) = 102 arr2(3) = 103 dic2.Add(100, arr2) '*ここで止めてdic1とdic2の内容をみる dic1 = Nothing dic2 = Nothing End Sub コメントの位置で止めて、dic1とdic2の内容を見ると dic1の方は、keyの値にかかわらず、100~103が入っていますが dic2の方は、それぞれ0~3と100~103が入っています。 どうしてこのような違いが出てくるのでしょうか?

  • ReDim PreserveよりもReDimが遅い

    こんにちは、配列がいくつまで取得できるのか計算するマクロを作っている時に変なことに気が付きました。 エクセルでフォームとラベルを1つ用意し、下記のようなプログラムをモジュールに書きます。 実行すると、10万ずつ数字が増えていき、数字が1000~2000万超えたあたりで、メモリ不足ですという 表示がでます。 ここで、ReDim PreserveのPreserveをとって、ReDimだけにすると、数字の増え方が目に見えて遅くなります。 ReDim Preserveとしたときは9.5秒ぐらいですが ReDim の時は 30秒以上かかっています 3台のマシンでテストしましたが、どれも似たような結果になりました 普通に値を保持するredim Preserveの方が遅いと思うのですがなぜこのような結果になるのでしょうか? ご教授お願いいたします。 Public Sub 配列上限取得計算() On Error GoTo ErrEnd Dim i As Long Const kankaku As Long = 100000 ReDim ans(1 To kankaku) As String ans(1) = 1 i = 2 UserForm1.Show vbModeless Do If i Mod kankaku = 0 Then DoEvents UserForm1.Label1 = i 'ここのPreserveをなくすと明らかに遅くなる ReDim Preserve ans(1 To i + kankaku) As String End If ans(i) = i i = i + 1 Loop Erase ans Unload UserForm1 Exit Sub ErrEnd: MsgBox "これ以上の配列を設定できません。" & vbCrLf & "上限は" & i & "です。" & vbCrLf & Err.Description Erase ans Unload UserForm1 End Sub

  • VBで配列に格納されているデータをUPDATEや INSERTするには

    配列変数にあるデータを一度に更新や追加したい場合SQL文を(繰り返し)ループするのが良いのでしょうか?ほかに方法はありますか 例えば dim AAA(100) as integer dim BBB(100) as string にさまざまな値データが入っているとしてそれらを、SQL文にして書き込みしたい 場合です。データテーブルはあるものしますが、何番目の配列までデータが 入っているか可変です よろしくお願い致します

  • メモリ不足になってしまう。

    教えてください。 現在陥っている現象:「メモリ不足になってしまう」配列の領域をRedimで動的に確保しようとしています。 例えば、 dim A() as byte dim B() as byte dim C() as byte redim A(8000,60000) redim B(8000,60000) redim C(8000,60000) 上記のように配列を確保する予定なのですが、 メモリ不足になってしまいます。 ひとつの変数の容量が480MB程度であると思います。 3つ全部でも1440MBであるのですが、物理的な メモリ容量は、512M*4を実装しています。 上記の変数名で言いますと、 Aの変数の領域確保には問題なく成功するのですが、 その次の行のBのところでエラーになります。 現在、物理的なメモリには空きがあるにもかかわらず このような現象になってしまい、困っています。 どなたか原因解決の糸口になるような回答をお持ちの方、 教えてください。

  • データ数の定まらないデータをもれなく配列変数に格納する方法

    あるときは10個またあるときは100個のデータがあるとします。 しかし、データの数は1000個になるかもしれませんし、1個になるかもしれません。 ただし、データ数が0個以下になることはありません。 このような、データ数の定まらないデータを確実にもれなく配列変数に代入したいのですが、方法がわかりません。 変数で dim hairetu(kazu) as integer として配列の数を設定できれば良いのですが、どうも無理のようです。 データの最大数(仮に1000個)を決めて dim hairetu(1000) as integer とするしかないのでしょうか。 何か良い方法はありませんでしょうか。

  • VB.NET 2次元配列

    二次元配列に関して質問があります。 二次元配列を定義します。 Dim a(,) As Integer = _ {{0, 0, 0, 0, 0, 0, 1, 1, 1}, _ {0, 0, 0, 0, 0, 1, 0, 0, 1}, _ {0, 0, 0, 0, 0, 0, 1, 1, 1}} 一次元配列を定義します。 Dim b() As Integer 一次元配列のb()に二次元配列a(,)の {0, 0, 0, 0, 0, 0, 1, 1, 1}の部分を 入れようとした場合、 どのように記載すればよろしいでしょうか? イメージ的には b = a(0) で出きると思ったのですが、 構文エラーとなってしまいます。 よろしくお願いします。

専門家に質問してみよう