2011年5月10日火曜日

VBAで図形描画

業務マニュアルを作成していると業務フロー図を描くことがしばしばあります。
フロー図を描くための便利なソフトもありますが、みんなが使えるお手軽ソフトということでExcelを使って描くことが多いです(恐ろしく効率が悪いので私は好きじゃないけどね)。

そこで、どうやったら簡単に図形描画ができるかなと考えるわけです。


ワークシートにあるデータの個数分だけ図形を作成し、セルのデータを図形のテキストとして挿入する


こんな要件で作ることにしました。
使う部品は2つ。

  • 対象となるデータが入力された範囲をループする
  • 取得した内容で図形を作成する

使えるプログラムは書きためておきたいと思っているので部品であることがポイントです。
現段階ではこれから記述する内容になっていますが、もっと賢い書き方があるかもしれないし、部品にすべきポイントが違っているかもしれません。
どうであれ、書かないことには上達しません。

ということで。






○部品1:対象となるデータが入力された範囲をループする

Sub データ範囲の繰り返し処理()

  '処理開始位置行
  Dim i As Integer
  '処理終了位置行
  Dim m As Integer
  '処理対象カウンタ
  Dim cCNT As Integer

  '条件:処理開始位置をセレクトした状態にする

  i = Selection.Row

  Selection.End(xlDown).Select
  m = Selection.Row

  For cCNT = i To m

    'ここに処理を記述
    Debug.Print cCNT

  Next cCNT

End Sub





○部品2:取得した内容で図形を作成する


Sub リストから図形を作成する()

  '作成した図形
  Dim myShape As Shape

  '操作対象ワークシート
  With ActiveSheet

    '作成する図形のタイプ,表示位置TopLeft,サイズ幅高さ
    '四角形:msoShapeRectangle
    Set myShape = .Shapes.AddShape(msoShapeRectangle, 200, cCNT * 25, 100, 25)

    '参照したセルの値を図形に挿入
    myShape.TextFrame.Characters.Text = .Cells(cCNT, 2).Value

    'テキスト表示位置
    myShape.TextFrame.HorizontalAlignment = xlHAlignCenter

  End With

End Sub





○フュージョン!!:要件を実現する(リストデータから図形を作成)

Sub リストから図形を作成する()

 '処理開始位置行
  Dim i As Integer
  '処理終了位置行
  Dim m As Integer
  '処理対象カウンタ
  Dim cCNT As Integer

  '条件:処理開始位置をセレクトした状態にする

  i = Selection.Row

  Selection.End(xlDown).Select
  m = Selection.Row

  For cCNT = i To m

  '作成した図形
    Dim myShape As Shape

    '操作対象ワークシート
    With ActiveSheet

      '作成する図形のタイプ,表示位置TopLeft,サイズ幅高さ
      '四角形:msoShapeRectangle
      Set myShape = .Shapes.AddShape(msoShapeRectangle, 200, cCNT * 25, 100, 25)

      '参照したセルの値を図形に挿入
      myShape.TextFrame.Characters.Text = .Cells(cCNT, 2).Value

      'テキスト表示位置
      myShape.TextFrame.HorizontalAlignment = xlHAlignCenter

    End With

 Next cCNT

End Sub




依存しまくっている部品ですね 苦笑。

繰り返し処理はDo LoopよりForで処理した方が速いんだとか(大村あつしさんの本で読みました)。
以前はDo Until cells(cCNT,2).value = ""を使ってループ処理を書いていたのですが、最近はForを使って書くようにしています。

VBAは私が楽に仕事をするための道具です。
なのであくまでも"道具"として、磨きをかけていこうかなと思っています。
("手段"が"目的"になりがちな自分へのメッセージを改めて。笑)

0 件のコメント:

コメントを投稿