今日は、初中級速習コース修了生程度の方を想定した、やや高度なお話。
先日、セミナー受講生から受けた質問で、こういうものがあった。
早速なのですが、先程作成したマクロに関して添削をお願いできればと存じます。
選択範囲を特定の書式に変換(1行目は灰色で塗りつぶして中央にインデント、その他は太枠で囲んで中は点線)するマクロですが、selectionを使ったマクロに関して最初の行だけ設定を変えるやり方を知らないためマクロが2つに分割されてしまっています。
Sub Range_Border_Whole()
With Selection.Borders()
.LineStyle = xlContinuous
.Weight = xlThick
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
End Sub
Sub Range_Border_First()
With Selection
.HorizontalAlignment = xlCenter
.Interior.ColorIndex = 15
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThin
End With
End Sub
つまり
1, タイトル行を選択してから Range_Border_Whole を実行し
2, データの入っている行を選択してから、 Range_Border_First を実行し
ということで、二度手間になっている。
これを、もっと効率よくできないものか、というのが質問の趣旨。
———————————————-
で、この手のことをするには、 .Resize メソッドを使うと良い。
以下は、小川の添削例。
Sub Range_Border_Whole()
Dim rgAll As Range
Dim rg1st As Range ‘タイトル行
Dim rg2nd As Range ‘データ行
Set rgAll = Selection
Set rg1st = rgAll.Resize(1)
Dim lngRowsCount As Long
lngRowsCount = rgAll.Rows.Count
Set rg2nd = rgAll.Resize(lngRowsCount – 1) ‘タイトル行から、元データ範囲の一番下から2番目の行まで
Set rg2nd = rg2nd.Offset(1) ‘タイトル行の次の行から元データ範囲の一番下まで
‘タイトル行の設定
With rg1st
.HorizontalAlignment = xlCenter
.Interior.ColorIndex = 15
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeBottom).Weight = xlThin
End With
‘データ行の設定
With rg2nd.Borders()
.LineStyle = xlContinuous
.Weight = xlThick
End With
With rg2nd.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With rg2nd.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
End Sub