Excel VBAで1~10などの重複しない乱数を作成し、セルへ書き出す処理では、配列の扱い方によって出力方向が変わります。特にRange.Resizeを使った書き込みでは、縦方向と横方向で配列の次元を合わせる必要があります。この記事では、重複しない乱数を行方向(横方向)に出力する方法と、VBAで配列を使う際のポイントを解説します。
VBAで配列を書き込む方向が決まる仕組み
Excel VBAで配列の内容をセル範囲へ一括出力する場合、配列の行数と列数がそのままExcel上の配置方向になります。
例えば、以下のような2次元配列を用意した場合は、縦方向への書き込みになります。
<pre><code>Dim d(1 To 10, 1 To 1)</code></pre>
これは「10行1列」の配列なので、Range.Resize(10,1)へ代入するとA1からA10まで縦にデータが並びます。
横方向へ出力したい場合は、「1行10列」の配列を作成する必要があります。
横方向に乱数を書き出すには配列を1行10列に変更する
現在のコードでは、最後の書き込み部分で以下のようになっています。
<pre><code>Range(“A1”).Resize(UBound(d), 1) = d</code></pre>
UBound(d)は配列の行数を取得しているため、Resize(10,1)となり、結果的に縦方向へ出力されます。
横方向へ変更する場合は、配列を「1 To 1, 1 To 10」の形に変更し、Resizeの指定も「1行10列」に合わせます。
重複しない乱数を横方向へ出力するVBAサンプル
以下のコードでは、1~10までの重複しない数字を作成し、A1からJ1まで横方向に表示します。
<pre><code>Sub Macro1()
Dim i As Long
Dim x()
Dim y()
Dim d()
Dim Ld As Long
Dim Ud As Long
Ld = 1
Ud = 10
ReDim x(1 To Ud – Ld + 1)
ReDim y(1 To Ud – Ld + 1)
ReDim d(1 To 1, 1 To Ud – Ld + 1)
Randomize
For i = 1 To Ud – Ld + 1
x(i) = Rnd()
y(i) = i + Ld – 1
Next i
For i = 1 To Ud – Ld + 1
d(1, i) = y(Application.Match(Application.Small(x, i), x, 0))
Next i
Range(“A:A”).ClearContents
Range(“A1”).Resize(1, UBound(d, 2)) = d
End Sub</code></pre>
ポイントは、配列dの宣言を「ReDim d(1 To 1, 1 To 10)」に変更している部分です。これにより、データが1行10列として扱われます。
Transpose関数を使って縦配列を横配列に変換する方法
既存のコードをできるだけ変更したくない場合は、Transpose関数を利用する方法もあります。
Transposeは縦方向の配列を横方向へ、横方向の配列を縦方向へ変換するExcelの機能です。
例えば、現在のd配列が縦方向の場合は、以下のように書き換えることで横方向へ出力できます。
<pre><code>Range(“A1”).Resize(1, UBound(d)) = Application.Transpose(d)</code></pre>
ただし、Transposeは大量データを扱う場合や配列サイズによって制限があるため、長期的に使うマクロでは最初から横向きの配列を作成する方法がおすすめです。
Resizeを使うときの行方向・列方向の考え方
Range.Resizeの指定順序は「行数, 列数」です。この順番を間違えると、意図しない方向へデータが配置されます。
| 出力方向 | Resize指定 | 配列サイズ |
|---|---|---|
| 縦方向 | Resize(10,1) | 10行1列 |
| 横方向 | Resize(1,10) | 1行10列 |
今回のように乱数を横一列に並べたい場合は、「データの数=列数」と考えて配列を作成すると分かりやすくなります。
例えば、1~10の数字を横に並べる場合は、Excel上ではA1~J1の10個のセルを使うため、VBA配列も1行10列に合わせる必要があります。
まとめ|VBAで横方向へ出力するには配列の形を合わせる
VBAで重複しない乱数をセルへ横方向に出力する場合、重要なのは配列の行数と列数をExcelの配置方向に合わせることです。
縦方向へ出力される原因は、配列が10行1列になっているためです。横方向へ変更するには、1行10列の配列を作成し、Resize(1,10)のように指定します。
既存コードを活用したい場合はTransposeを利用する方法もありますが、基本的には最初から目的の方向に合わせた配列を作成する方が、処理が分かりやすく安定したVBAになります。


コメント