結合セルにマクロで連番を振る方法についてです。MergeAreaプロパティの使い方といいつつ、使わない使い方も紹介します。
成果物
![mergearea9](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea9.png)
結合セルに連番を振ります。
方法①作業列を使う
![mergearea1](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea1.png)
こういう表に連番を振っていきたいとして、
![mergearea2](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea2.png)
たとえば単純にfor nextとかでセル番号を振った場合、
![mergearea3](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea3.png)
こうなります。結合セルの場合、左上に入力した値以外は無効になります。
![mergearea6](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea6.png)
連番を振るひとつの方法としてこの性質を利用し、順番に結合セルの値を別のセルに代入することで、
![mergearea7](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea7.png)
結果的に連番を振ればいい行があぶり出されるので、
![mergearea8](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea8.png)
D列に何か値がある場合はB列(結合セル)に1から順に数字を振る、というマクロを実行し、最後にD列を削除していけば、
![mergearea9](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea9.png)
作業列が必要ですが、目的は達成できます。たぶんこのやりかたが一番簡単です。
' 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](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea4.png)
MergeAreaプロパティは、Rangeオブジェクトが所属する結合セルを取得するプロパティで、たとえばRange(“D” & i).Value = Range(“B” & i).MergeArea.Valueを実行すると、
![mergearea5](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea5.png)
3行目でも4行目でも、所属する結合セルの値が表示されます。
![mergearea12](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea12.png)
Range(“B” & i).Offset(1).MergeAreaのようにOffsetと組み合わせる使い方をした場合は、
![mergearea13](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea13.png)
こういった結果になります。MergeArea単位でoffsetするので、Offset(1).MergeArea.Selectでひとつ下の結合セルを選択することができます。
![mergearea15](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea15.png)
ただし(作業列に一回出すならともかく)、MergeAreaは「範囲」なので、If文でセルと対比させるような使い方はできません。
なのでMergeAreaで作業列を使わずに結合セルに連番を振る場合は、
なのでMergeAreaで作業列を使わずに結合セルに連番を振る場合は、
![mergearea17](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea17.png)
たとえばDo whileで「右のセルが空白じゃない限り」処理を繰り返すなどの方法を取り、
![mergearea18](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea18.png)
連番を振りながらMergeArea単位で下に降りていく、というような処理を実装すると、
![mergearea19](https://sunagitsune.com/wp-content/uploads/2021/08/mergearea19.png)
概ね目標が達成できます(他のやりかたもあります)。元の場所に帰ってきたい場合は、現在位置を記録して最後に処理で戻ってくるようにします。
' 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
![](https://sunagitsune.com/wp-content/uploads/2018/12/mathematics-1509559_1280-160x90.jpg)
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。
コメント