フロー図を描くための便利なソフトもありますが、みんなが使えるお手軽ソフトということでExcelを使って描くことが多いです(恐ろしく効率が悪いので私は好きじゃないけどね)。
そこで、どうやったら簡単に図形描画ができるかなと考えるわけです。
ワークシートにあるデータの個数分だけ図形を作成し、セルのデータを図形のテキストとして挿入する
こんな要件で作ることにしました。
使う部品は2つ。
- 対象となるデータが入力された範囲をループする
- 取得した内容で図形を作成する
使えるプログラムは書きためておきたいと思っているので部品であることがポイントです。
現段階ではこれから記述する内容になっていますが、もっと賢い書き方があるかもしれないし、部品にすべきポイントが違っているかもしれません。
どうであれ、書かないことには上達しません。
ということで。
○部品1:対象となるデータが入力された範囲をループする
'処理開始位置行
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
○フュージョン!!:要件を実現する(リストデータから図形を作成)
'処理開始位置行
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 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
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
End Sub
依存しまくっている部品ですね 苦笑。
繰り返し処理はDo LoopよりForで処理した方が速いんだとか(大村あつしさんの本で読みました)。
以前はDo Until cells(cCNT,2).value = ""を使ってループ処理を書いていたのですが、最近はForを使って書くようにしています。
VBAは私が楽に仕事をするための道具です。
なのであくまでも"道具"として、磨きをかけていこうかなと思っています。
("手段"が"目的"になりがちな自分へのメッセージを改めて。笑)
0 件のコメント:
コメントを投稿