VBAでマクロを組んでいたところ、問題が出てきたので質問させてください。
1.任意の列を全選択する(たとえばA列とC列という離れた列です)
2.その列の中でも、すべての行にではなく、数行にだけセル結合解除という処理を施す
というマクロを組もうとしています。
しかし、全選択した列の一部の行(画像参照)にだけ処理を施す、というのができません。
1列だけ全選択→セル結合解除、というのはできるのですが、複数の列(しかも列同士が隣り合っていない)に対して処理を施すというのがうまくいかず…。
以下のようにマクロを作成してみたのですが、どこが問題になってるのでしょうか?
アドバイスいただけると幸いです。
Sub test1()
Dim intX_1 As Long
Dim intX_2 As Long
Dim rg1 As Range
Dim rg2 As Range
Set rg1 = Range(CStr(ActiveWindow.RangeSelection.Address))
For Each rg2 In rg1
'選択した列のうち、2行目~最後のデータが存在する行まで処理を行う
intIX_1 = 2
While rg2(intIX_1) <> ""
rg2(intIX_1).MergeCells = False
intIX_1 = intIX_1 + 1
If rg2(intIX_1) = "" Then
Exit For
End If
Wend
Next
End Sub
個別の範囲なら処理できる、しかし複数の選択範囲を個別の範囲にバラす方法が分からない、というのが質問の核のようなので…。
Excel VBAのヘルプでRangeオブジェクトのプロパティを見ていくと、Areasというのがあります。
これでインデックスを指定して個別に参照できます。
Sub aaaa()
Dim i As Integer
Dim r As Range '列を参照する
For i = 1 To Selection.Areas.Count
Set r = Selection.Areas(i)
'列ごとの処理を実施
MsgBox r.Address & " -> " & r.Rows("3:5").Address
Next
End Sub
ちょっと横からおじゃまさせていただきます。
オブジェクト変数を使わずに、たとえば
Range("$A:$A,$D:$E")
から、スマートに単独の列をとりだす方法は思いつきませんので、オブジェクト変数を用います。
Sub test1()
Dim targetRange As Range, myArea As Range, myColumn As Range
'一旦、オブジェクト変数に受けると、インテリセンスが効いて
'Rangeオブジェクトの様々なメンバが表示されるので、参考になります
Set targetRange = Selection
'Range("$A:$A,$D:$E")の様な場合に対応するため、下記が常道
For Each myArea In targetRange.Areas
For Each myColumn In myArea.Columns
Debug.Print myColumn.Address
Next myColumn
Next myArea
'下記でも結果は同じでした
' For Each myColumn In targetRange.Columns
' Debug.Print myColumn.Address
' Next myColumn
'しかし
'Debug.Print targetRange.Columns.Count
'は最初の群の列数1を戻し、総列数の3は戻しません
End Sub
さて、本題に戻って、
Sub test2()
Dim myColumn As Range
For Each myColumn In Selection.Columns
'一列に対する処理を記述
Next
End Sub
とすれば良いですが、ご質問の文中のロジックでは、一列に対する処理の方も動かないと思います。
intIX_1 = intIX_1 + 1
では、次の結合セルに移りません。次の行に行くだけです。
intIX_1 = intIX_1 + 当該結合セルの行数(Range(...).MergeArea.Rows.Count)
にしなければいけませんね。
(他にOffset(1,0)で移る方法もあります)
ご参考まで。
初心者にとって、大事なことを忘れていませんか。
それはマクロの記録を採って、それでは記録が採れない問題化、使えないか検討し、修正箇所・方法を勉強することです。
ーー
本件はマクロの記録を採ってみると
C列とF列の例で
Sub test01()
Range("C1:C12,F1:F12").Select
With Selection
.MergeCells = False
End With
End Sub
となりました。(一部行を不要として削除してます。)
まずこれ(または一部修正して)を実行して、質問者が検討をして、それではニーズに合わない場合、それを柱にして質問をするぐらいしてほしい。
ーー
範囲全域の結合セルをすべて解除するなら、全セルについて繰り回しをする必要ないのは知っているのかな。
書式はセル範囲の全体に一発で設定できるのだ。
お礼
ご回答ありがとうございます。Areaを使うと複数の連続してない範囲についての処理ができるんですね。これを改造した結果、無事に目的のマクロを作成することができました。とても助かりました。ありがとうございました。