|
|
| Excel VBA Macro ・ セル制御 ・ FAQ |
|
3カ月に跨る工程表の月の見出しを括って罫線を区切りだけに設定するには?
|
|
|
|
Question 81.3 |
Excel VBA Borad (掲示板)より |
 |
 |
|
|
Excel2003を使用しております。 説明がうまくできないので、画像を添付しました。

開始日付が可変する工程表を作成しております。画像では27日が開始日付になっておりますが、
開始日付が5日や18日や23日など、色々変化します。
日付が可変するので月はVBAのFindとDo〜Loopを使い、日付行の「1」を検索して見つけたセルの一つ上のセルに月を表示させていくというものを作りました。
ここからなのですが、下図のように月の部分を結合し、月を分ける罫線を引きたいのです。

日付が可変する事により、結合させる領域も罫線をひく場所も変化してくるので困っています。
Findメソッドを使用してできるのかな・・・と漠然と思っておりますが・・・
ご指導いただけませんでしょうか?
|
|
|
ややこしいのは、結合させる領域を選択するところですね。
下記サンプルは、工程表の月(5行目)が、上図の状態で実行してください。
Sub 工程表の月の見出しを括って罫線で区切る()
左端列 = 7
右端列 = Range("G6").End(xlToRight).Column '日付の右端列を取得
Range(Cells(5, 左端列), Cells(5, 右端列)).MergeCells = False
右 = 右端列
月別処理開始:
For 左 = 右 To 左端列 Step -1
If Cells(5, 左).Value <> "" Then 'n月と入力があれば
GoTo 月で括る
End If
Next
Exit Sub
'
月で括る:
With Range(Cells(5, 左), Cells(5, 右))
.HorizontalAlignment = xlCenter '文字の配置・横位置・中央揃え
.MergeCells = True '文字の制御・セルを結合する
' (ここで罫線を引く)
End With
If 左 <> 左端列 Then '1番左まで済んでなければ
右 = 左 - 1
GoTo 月別処理開始
End If
End Sub
罫線を引くマクロは自動記録してみれば分かるでしょうから、ご自分で追加してください。
|
|
|
結合のほうは無事処理できました、ありがとうございます!
Range("G6").End(xlToRight).Column で右端列を取得するというのは勉強になりました!
右端から処理を始めていますが、やっぱり訳があるんですよね・・・。 左右逆にしてもいいのかな?と思ったりしたのですが・・・。
前回の質問で添付した画像には表示していませんでしたが、
A列は空白列、B列は現場名を入力する列、C・D・E・F列には
開始日後の祝日設定(5月の連休、9月の連休、振替休日等)の為に
開始日より前の4日間が入力(休日設定にはVBAを使用していない為)されており、
C・D・E・F列は表示しない設定になっていますので、
右端列は取得できますが左端列は取得するのが難しくなるのでしょうか・・・。 う〜ん、VBA、難しいです・・・;;
罫線の設定は自分でやってみたところ・・・。
月ごとの罫線(画像の緑矢印の線)は実線(xlContinuousとxlThin)を使用し、
日付ごと罫線(画像の黒矢印の線)は細線(xlContinuousとxlHairline)を使用したいのに、
xlEdgeRightやLeftを使用すると全ての罫線が実線に、
B5〜B7の右に設定している太線(青矢印の線)と
B6〜B41の右に設定している二重線(赤矢印の線)までをも実線にしてしまうんですね::
また、xlInsideVerticalを実線に指定してみると、
月ごとの線はそのまま細線なのに、日付ごとの線が実線になってしまう・・・。
そこで逆なのかと思い、ファイルを開いた時点の罫線の設定を全部実線にし、
With Range(Cells(41, 左), Cells(5, 右)).Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
を追加してみました。
うまくいった!と思いきや・・・。
開始日が月末以外だとうまくいくのですが、月末(28日、30日、31日)だと
「BorderクラスのLineStyleプロパティを設定できません」
と言われてしまうのです。
1列しかないからなんですよね・・・。
対処する方法はあるのでしょうか? よろしくお願いします。
|
|
|
日付ごと罫線は細線とかの初期状態がきっちり作ってあれば、マクロでは、3カ月に跨る真ん中の月の1日の左側と末日の右側に、実線を引くだけで済みますね。
前述マクロの後半を下記のようにすれば(6行追加)、実現すると思います。
月で括る:
With Range(Cells(5, 左), Cells(5, 右))
.HorizontalAlignment = xlCenter '文字の配置・横位置・中央揃え
.MergeCells = True '文字の制御・セルを結合する
End With
If 左 <> 左端列 And 右 <> 右端列 Then '真ん中の月なら(罫線を引く)
Range(Cells(5, 左), Cells(41, 左)).Borders(xlEdgeLeft).LineStyle = xlContinuous
Range(Cells(5, 左), Cells(41, 左)).Borders(xlEdgeLeft).Weight = xlThin
Range(Cells(5, 右), Cells(41, 右)).Borders(xlEdgeRight).LineStyle = xlContinuous
Range(Cells(5, 右), Cells(41, 右)).Borders(xlEdgeRight).Weight = xlThin
End If
If 左 <> 左端列 Then '1番左まで済んでなければ
右 = 左 - 1
GoTo 月別処理開始
End If
End Sub
|
|
|
これ<>をうまく使うのがミソですねぇ・・・。
言われるとなるほどと理解できるのですが、なかなか自分から発想が・・・(^-^;
お教えいただいたものを実行してみましたところ、
3ヶ月にまたがる時(月によって前後しますが、開始日が24日頃からの場合)は適用できますが、
2ヶ月だけにまたがる時(開始日が1日〜23日頃の場合)は適用できませんでしたので、
ElseIf 左 = 左端列 Then
Range(Cells(5, 右), Cells(41, 右)).Borders(xlEdgeRight).LineStyle = xlContinuous
Range(Cells(5, 右), Cells(41, 右)).Borders(xlEdgeRight).Weight = xlThin
というものも追加し、みごと!全ての日付に対応することができました!
本当にありがとうございました!
|
サンプルブックのダウンロードは ここをクリック
(YNxv9583_Kouteihyou.xls 94KB) ※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。
|
|
|
|
|