ホーム > >

VBA配列とループステートメント

ここで、配列の入力や配列のメンバーの表示などのいくつかの操作を実行するために、他の記事で勉強したループステートメント(For … NextおよびFor Each …Nextループを参照してください。)が非常に便利になります。FavoriteCitiesプロセスを書き直して、各都市名が異なる情報ボックスに表示されるようにするにはどうすればよいですか? 以下に示すプロセスFavoriteCities2は、元のプロセスの最後の部分をFor Each … Nextループに置き換えます。

Sub FavoriteCities2()
'now declare the array
Dim cities(6) As String
Dim city As Variant
'assign the values to array elements
cities(1) = "Baltimore"
cities(2) = "Atlanta"
cities(3) = "Boston"
cities(4) = "Washington"
cities(5) = "New York"
cities(6) = "Trenton"
'display the list of cities in separate messages
For Each city in cities
MsgBox city
Next
End Sub

For Each … Nextループは、Variant型の変数cityを使用することに注意してください。他の記事の「For Each…Next」では、集合内のすべてのオブジェクト間または配列のすべてのメンバー間でループし、各オブジェクトまたはメンバーに対して同じ操作を実行できることを思い出してください。 プロシージャFavoriteCities2を実行すると、配列内に複数回実行されるいくつかのメンバーループがあります。

FavoriteCitiesプロシージャの別の変化をご覧ください。 他の記事では、引数を変数としてサブプロシージャと関数に渡す練習をしました。 プロシージャFavoriteCities3は、配列のメンバーを別のプロシージャに渡す方法を示しています。

1、現在のモジュールで、次の2つのプロシージャを入力します。

Sub FavoriteCities3()
'now declare the array
Dim cities(6) As String
'assign the values to array elements
cities(1) = "Baltimore"
cities(2) = "Atlanta"
cities(3) = "Boston"
cities(4) = "Washington"
cities(5) = "New York"
cities(6) = "Trenton"
'call another procedure and pass the array as argument
Hallo cities()
End Sub
Sub Hallo (cities() As String)
Dim counter As Integer
For counter = 1 to 6
MsgBox "Hello " & cities(counter)
Next
End Sub

Halloプロシージャの宣言に参照型引数がある——cities()。

2、プロシージャFavoriteCities3を実行します。 サブプロシージャの配列メンバーを別のサブプロシージャまたは関数プロシージャに渡すと、プログラムコードを繰り返すことなく、多くのプロシージャで同じ配列を使用できます。

ヒント:プロシージャ間で配列を渡します。

配列がプロシージャで宣言されている場合、それはローカルであり、他のプロシージャには認識されません。ただし、宣言ステートメントに配列の名前を記述し、その後に空白の括弧を書き込むことで、ローカル配列を他のプロシージャに渡すことができます。例えば、ステートメントHallo cities() は、Halloというプロシージャを呼び出し、配列cities()をそれに渡します。

次には、配列とループについて新しく学んだ知識を実際の生活に適用する方法の例です。あなたが宝くじに夢中し、運命数をVBで選ばせることができます。次のLottoプロシージは、配列に1から51までの6つの数値を入力します。

Sub Lotto()
Const spins = 6
Const minNum = 1
Const maxNum = 51
Dim t As Integer ‘looping variable in outer loop 外部ループ変数
Dim i As Integer ‘looping variable in inner loop 内部ループ変数
Dim myNumbers As String ‘string to hold all picks 選択した文字列を保存する
Dim lucky(spins) As String ‘array to hold generated picks 選択した配列を保存する
myNumbers = ""
For t = 1 To spins
Randomize
lucky(t) = Int((maxNum-minNum+1) * Rnd )+ minNum)
'see if this number was picked before この数値が前に選択されていたかどうかを確認する
For i = 1 To (t-1)
If lucky(t)=lucky(i) Then
lucky(t) = Int((maxNum–minNum+1) * Rnd)+ minNum) i = 0
End If
Next i
MsgBox "Lucky number is " & t & lucky(t)
myNumbers = myNumbers & " –" & lucky(t)
Next t
MsgBox "Lucky numbers are " & myNumbers
End Sub

Randomizeステートメントは、乱数生成器を初期化します。コマンドInt((maxNum-minNum+1) * Rnd + minNum)は、Rnd関数を使用して、minNumとmaxNumの間のランダムな値を生成します。Int関数は、乱数を整数に変換します。 minNumとmaxNumに定数を割り当てる以外、InputBox関数を使用してユーザーからデータを取得できます。
内部のFor…Nextループは、選択された各数値が唯一であることを保証できます。前に選択された数値にすることはできません。内部ループを無視してプロシージを複数回実行すると、この数値が重複する可能性があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です