Excel VBA(マクロ)で結合セルに連番を振る方法/MergeAreaプロパティの使い方

couple IT

結合セルにマクロで連番を振る方法についてです。MergeAreaプロパティの使い方といいつつ、使わない使い方も紹介します。

スポンサーリンク

成果物

mergearea9
結合セルに連番を振ります。

方法①作業列を使う

mergearea1
こういう表に連番を振っていきたいとして、
mergearea2
たとえば単純にfor nextとかでセル番号を振った場合、
mergearea3
こうなります。結合セルの場合、左上に入力した値以外は無効になります。
mergearea6
連番を振るひとつの方法としてこの性質を利用し、順番に結合セルの値を別のセルに代入することで、
mergearea7
結果的に連番を振ればいい行があぶり出されるので、
mergearea8
D列に何か値がある場合はB列(結合セル)に1から順に数字を振る、というマクロを実行し、最後にD列を削除していけば、
mergearea9
作業列が必要ですが、目的は達成できます。たぶんこのやりかたが一番簡単です。
' vba
Dim i As Integer
Dim j As Integer
Dim k As Integer

For i = 2 To 7
Range("B" & i).Value = i
Range("D" & i).Value = Range("B" & i).Value
Next

k = 1
For j = 2 To 7
If Range("D" & j).Value <> "" Then
Range("B" & j).Value = k
k = k + 1
End If
Range("D" & j).ClearContents
Next

MergeAreaプロパティを使う方法

mergearea4
MergeAreaプロパティは、Rangeオブジェクトが所属する結合セルを取得するプロパティで、たとえばRange(“D” & i).Value = Range(“B” & i).MergeArea.Valueを実行すると、
mergearea5
3行目でも4行目でも、所属する結合セルの値が表示されます。
mergearea12
Range(“B” & i).Offset(1).MergeAreaのようにOffsetと組み合わせる使い方をした場合は、
mergearea13
こういった結果になります。MergeArea単位でoffsetするので、Offset(1).MergeArea.Selectでひとつ下の結合セルを選択することができます。
mergearea15
ただし(作業列に一回出すならともかく)、MergeAreaは「範囲」なので、If文でセルと対比させるような使い方はできません。
なのでMergeAreaで作業列を使わずに結合セルに連番を振る場合は、
mergearea17
たとえばDo whileで「右のセルが空白じゃない限り」処理を繰り返すなどの方法を取り、
mergearea18
連番を振りながらMergeArea単位で下に降りていく、というような処理を実装すると、
mergearea19
概ね目標が達成できます(他のやりかたもあります)。元の場所に帰ってきたい場合は、現在位置を記録して最後に処理で戻ってくるようにします。
' vba
Dim i As Integer

Range("B2").Select
i = 1
Do While ActiveCell.Offset(, 1).Value <> ""
ActiveCell.Value = i
i = i + 1
ActiveCell.Offset(1).MergeArea.Select
Loop
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント