複数Subから使用する配列変数の大きさを可変にするには?

解決


町や空に  2009-04-26 17:01:10  No: 141869

複数Subから使用する配列変数の大きさを可変にするには?
Win-XP上のVB2005です。
  通常,配列変数は Dim A(100) As Integer のように要素数を固定して指定します。しかし,例えば
①宣言部分でPublic n As integerを定義する。
②FormのLoadイベントSubで,あるファィルを読み込んでそのデータ数nを調べる。
③FormのLoadイベントSub又は別のイベントのSub内で,このnを使ってDim A(n) As Integerを定義する。
としてやれば,A(n)を正常に使用できます。
  しかし,このA(n)を複数のイベントSubから使用したい場合に Dimではなく宣言部分でPublic  A(n) As Integrと定義してやると,定義部分ではエラーにはならないのですが,実際にSub内で代入をしようとするところで,エラーになります。
  固定の定義 Public A(100) As Integerではもちろんどこでもエラーになりません。
  この目的を達成させる方法を御教示下さい。


カッツ  2009-04-26 18:06:59  No: 141870

>通常,配列変数は Dim A(100) As Integer のように

Dim strA() As String のように要素数を固定しない方法も日常使っています。


我龍院  2009-04-26 20:01:39  No: 141871

>複数Subから使用する配列変数の大きさを可変にするには?
ではなくて「配列の大きさを変更するには」ですよね。

で、質問の中には配列の大きさを変更しているコードは無いのですが。
エラーが出るのは配列の大きさを指定しないで値を代入しているのではないのかな。
どんなエラーが出ますか?
配列の大きさを変更するのはReDim ステートメントです。
元の配列の値を保持するにはReDim  Preserve ステートメントです。
ただし.NETの場合基本的に配列の大きさは固定で、ReDim  Preserveは
新しい配列を用意して要素をコピーするだけで、頻繁に配列のサイズを
変更する場合はListクラスを使いましょう。
それと同じクラスの中で使用するのなら、アクセス修飾子をPublicにする必要は無く
Privateで良いです。


町や空に  2009-04-27 02:28:35  No: 141872

カッツ様,我龍院さま御指導ありがとうございました。
要素数を固定しない方法,ReDim,ReDim Preseveいずれも未経験でした。
これから試して見ます。
ありがとうございました。


町や空に  2009-04-27 03:30:59  No: 141873

私の質問の仕方が不適切だったと思います。要素数を固定しない配列定義と,ReDim Preserveは下記のようにうまく動作しました。
しかし,例えばFormにボタンを2つ置いて
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim A() As Integer = {1, 2, 3}
        ReDim Preserve A(5)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        A(1) = 1
    End Sub
End Class
とすると,Button2のSubのA(1) = 1と代入するところでエラーになります。Aという配列をButton1のSubでもButton2のSubでも両方で使えるようにするにはどうすればいいかという質問です。よろしくお願いします。


たみとき  2009-04-27 06:01:56  No: 141874

・Form1クラスの宣言部で、配列Aを宣言する。
  例  Private A() As Integer
・コンストラクタまたはLoadイベント等で、配列AをRedimする。
これでボタンイベント等でA配列を使えるのでは?


町や空に  2009-04-27 06:41:20  No: 141875

たみとき様,うまくいきました。何と素晴らしいことか!
これまでReDimを使ったことがありませんでした。皆さんありがとうございました。

Public Class Form1
    Private A() As Integer

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ReDim A(5)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        A(1) = 123
        MsgBox(A(1))
    End Sub
  
End Class


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加