こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

QNo.9391372

暇なときに回答ください

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

>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)