vba boolean変数を開放する方法
エクセルのセルに「○○○○○○○○○○××××××××××」と入っているものをランダムに並べ代えるマクロを探してみました。
Sub macro2()
Dim i, m As Integer
Dim b, c As String
Dim flg(1 To 20) As Boolean
b = Cells(1, 1).Value
Randomize
For i = 1 To 20
Do
m = Int(20 * Rnd + 1)
If flg(m) = False Then
flg(m) = True
Exit Do
End If
Loop
c = c & Mid(b, m, 1)
Next i
Cells(1, 2).Value = c
End Sub
これはうまく動くのですが、10行分やろうとして、以下のように変更すると暴走(終わらない)します。
Sub macro2()
Dim i, m, n As Integer
Dim b, c As String
Dim flg(1 To 20) As Boolean
For n = 1 To 10
b = Cells(n, 1).Value
Randomize
For i = 1 To 20
Do
m = Int(20 * Rnd + 1)
If flg(m) = False Then
flg(m) = True
Exit Do
End If
Loop
c = c & Mid(b, m, 1)
Next i
Cells(n, 2).Value = c
next n
End Sub
一行目が終わってもboolean変数の値がそのまま残っているのが原因らしいのですが開放する方法がわかりません。
取りあえずもう一つマクロを追加してやりたいことはできたのですが、
Sub macro1()
Dim n As Integer
For n = 1 To 10
Call macro2(n)
Next n
End Sub
Sub macro2(n As Variant)
以下略
なんかスッキリしません。
boolean変数を開放し、マクロひとつですます方法を教えて頂きたくお願いします。
flg(m) = Falseを挿入してもダメでした。
投稿日時 - 2017-10-29 18:49:57
>Dim i, m, n As Integer
>Dim b, c As String
この場合i とm とb は、Variant型と扱われますよ
Sub macro3()
Dim i As Long, m As Long, n As Long
Dim b As String, c As String
Dim flg(1 To 20) As Boolean
For n = 1 To 10
b = Cells(n, 1).Value
Randomize
For i = 1 To 20
Do
m = Int(20 * Rnd + 1)
If flg(m) = False Then
flg(m) = True
Exit Do
End If
Loop
c = c & Mid(b, m, 1)
Next i
Cells(n, 2).Value = c
Erase flg '配列の初期化
c = "" 'cの初期化
Next n
End Sub
投稿日時 - 2017-10-29 20:05:04
うまくできました!
他の細かな点も教えて頂き、どうもありがとうございました。
投稿日時 - 2017-10-29 21:52:55
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(1)