即効テクニック

図形操作関連のテクニック

オートシェイプで進行管理

(Excel 97/2000/2002/2003/2007)
Excelをガントチャートなどの進行管理に使っているユーザーも多いことでしょう。
ワークシートを利用して、何日から何日までといった期間を表すには、セルを塗りつぶしたり、オートシェイプの矢印を使ったりします。
ここでは、オートシェイプの四角形を横に配置するマクロを考えてみましょう。

オートシェイプの四角形を挿入するには次のようにします。

Sub Sample1()
  Dim Bar As Shape
  Set Bar = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 10, 20, 30, 40)
  Bar.Fill.ForeColor.SchemeColor = 10
End Sub
実行すると、A列の2行目あたりに赤い四角形が挿入されます。 引数に指定した「10, 20, 30, 40」は左から「Left, Top, Width, Height」を表します。 もし、四角形をセルB2からセルE2に合わせて配置するのなら、次のように考えます。 Left:セルB2の左端 Top:セルB2の上端 Width:セルB2の左端からセルE2の右端 Height:セルB2の高さ このうち、Left、Top、Heightは簡単です。
Left:Range("B2").Left
Top:Range("B2").Top
Width:
Height:Range("B2").Height
Widthは計算によって求めなければなりません。 セル(Range)には右端を表すプロパティがありません。 そこで「セルE2の右端」は、ひとつ右の「セルF2の左端」を取得します。 Widthは幅ですから、「セルF2の左端」-「セルB2の左端」となります。
Sub Sample2()
  Dim Bar As Shape
  Set Bar = ActiveSheet.Shapes.AddShape _
                (msoShapeRectangle, _
                 Range("B2").Left, _
                 Range("B2").Top, _
                 Range("F2").Left - Range("B2").Left, _
                 Range("B2").Height)
  Bar.Fill.ForeColor.SchemeColor = 10
End Sub
もう少しガントチャート風に考えてみましょう。 今、ワークシートのB列から右方向に「1日」「2日」と日付が入力されているとします。 上の「セルB2からセルE2」というのは「1日から4日間」を表しています。 セルB2が"始まり"の日で、セル範囲B2:E2が"期間"です。 つまり、四角形の位置と大きさは Left:始まりの日の左端 Top:始まりの日の上端 Width:始まりの日+期間の左端 Height:始まりの日の高さ となります。 Widthが「始まりの日+期間+1の左端」ではない点に留意してください。 次のコードは、始まりの日と期間をInputBoxで受け取って四角形を挿入します。
Sub Sample3()
  Dim Bar As Shape, S As Long, W As Long
  S = Val(InputBox("開始日は?"))
  If S < 0 Then Exit Sub
  W = Val(InputBox("期間は?"))
  If W < 0 Then Exit Sub
  Set Bar = ActiveSheet.Shapes.AddShape _
            (msoShapeRectangle, _
             Cells(2, S).Left, _
             Cells(2, S).Top, _
             Cells(2, S).Offset(0, W).Left - Cells(2, S).Left, _
             Cells(2, S).Height)
  Bar.Fill.ForeColor.SchemeColor = 10
End Sub
あとは、塗りつぶしの色を変えたり、挿入する行を指定するなど応用しだいです。