「手順をExcelでまとめたけど、フローチャート(流れ図)も作りたい…」
「毎回、図形を並べて矢印をつなぐのが面倒…」
そんなときは、VBAでフローチャートを自動作成できます。
この記事では、手順表(テキスト)から、図形(工程)+矢印(コネクタ)を自動生成する完全版を紹介します。
初心者でもコピペで動かせるように、手順・解説・よくあるエラーまでまとめました。
この記事でできること
- 手順表(A列:番号 / B列:内容)からフローチャートを自動生成
- 工程(四角)を縦に並べて作成
- 工程どうしを矢印で自動接続
- 同じシート上で何度でも作り直せる(前回の図形を削除)
完成イメージ(超シンプルな縦フロー)
今回は初心者でも扱いやすいように、まずは縦に並ぶフローチャートを自動生成します。
(横配置・分岐(Yes/No)版は「応用」で紹介します)

準備:手順表を作る(これが元データ)
次のようにシートに入力してください(例)。
B列の手順がフローチャートの図形の文字になります。

ポイント
・データは 2行目から(見出しがある想定)でもOKです。
・空白行が出るまでを読み取ります。
フローチャート自動作成マクロ(完全版・コピペOK)
標準モジュールに貼り付けて実行してください。
(Alt + F11 → 挿入 → 標準モジュール)
Option Explicit
'========================
' メイン:フローチャート自動作成
'========================
Sub CreateFlowchart_Full()
Dim ws As Worksheet
Set ws = ActiveSheet
' ---- 設定(必要ならここだけ調整) ----
Const START_ROW As Long = 2 ' 手順表の開始行(見出しが1行目なら2)
Const COL_STEP As String = "B" ' 手順の列(文字)
Const LEFT_POS As Double = 60 ' 図形の左位置
Const TOP_POS As Double = 60 ' 図形の上位置(開始位置)
Const SHP_W As Double = 260 ' 図形の幅
Const SHP_H As Double = 60 ' 図形の高さ
Const GAP_Y As Double = 40 ' 図形の間隔(縦)
Const prefix As String = "FC_" ' 今回作る図形の名前プレフィックス(削除用)
' ------------------------------------
Dim lastRow As Long
lastRow = GetLastRow(ws, COL_STEP, START_ROW)
If lastRow < START_ROW Then
MsgBox "手順(" & COL_STEP & "列)にデータがありません。", vbExclamation
Exit Sub
End If
' 既存のフローチャート図形を削除(同じPREFIXのものだけ)
DeleteShapesByPrefix ws, prefix
Dim r As Long
Dim shpPrev As Shape, shpNow As Shape
Dim stepText As String
For r = START_ROW To lastRow
stepText = CStr(ws.Cells(r, COL_STEP).Value)
If Trim(stepText) = "" Then Exit For
' 図形(工程)を作成
Set shpNow = AddProcessShape( _
ws:=ws, _
nameKey:=prefix & "STEP_" & CStr(r), _
textValue:=stepText, _
leftPos:=LEFT_POS, _
topPos:=TOP_POS + (r - START_ROW) * (SHP_H + GAP_Y), _
widthValue:=SHP_W, _
heightValue:=SHP_H)
' 1つ前の図形があれば、矢印(コネクタ)で接続
If Not shpPrev Is Nothing Then
AddDownConnector ws, shpPrev, shpNow, prefix & "CONN_" & CStr(r)
End If
Set shpPrev = shpNow
Next r
MsgBox "フローチャートを作成しました。", vbInformation
End Sub
'========================
' 図形:工程(角丸四角)を作成
'========================
Private Function AddProcessShape( _
ByVal ws As Worksheet, _
ByVal nameKey As String, _
ByVal textValue As String, _
ByVal leftPos As Double, _
ByVal topPos As Double, _
ByVal widthValue As Double, _
ByVal heightValue As Double) As Shape
Dim shp As Shape
Set shp = ws.Shapes.AddShape( _
Type:=msoShapeRoundedRectangle, _
Left:=leftPos, _
Top:=topPos, _
Width:=widthValue, _
Height:=heightValue)
shp.Name = nameKey
' 文字
shp.TextFrame2.TextRange.Text = textValue
shp.TextFrame2.TextRange.Font.Size = 12
shp.TextFrame2.MarginLeft = 8
shp.TextFrame2.MarginRight = 8
shp.TextFrame2.MarginTop = 4
shp.TextFrame2.MarginBottom = 4
shp.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 0)
shp.TextFrame2.VerticalAnchor = msoAnchorMiddle
shp.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
' 色(好みで変更OK)
shp.Fill.ForeColor.RGB = RGB(235, 243, 255)
shp.Line.ForeColor.RGB = RGB(0, 112, 192)
shp.Line.Weight = 1.5
Set AddProcessShape = shp
End Function
'========================
' コネクタ:上の図形 → 下の図形へ矢印で接続
'========================
Private Sub AddDownConnector( _
ByVal ws As Worksheet, _
ByVal shpFrom As Shape, _
ByVal shpTo As Shape, _
ByVal connName As String)
Dim conn As Shape
' 直線コネクタ
Set conn = ws.Shapes.AddConnector(msoConnectorStraight, 0, 0, 10, 10)
conn.Name = connName
' 図形の「下」→ 次の図形の「上」へ接続
conn.ConnectorFormat.BeginConnect shpFrom, 3 ' 3=下
conn.ConnectorFormat.EndConnect shpTo, 1 ' 1=上
conn.ConnectorFormat.Type = msoConnectorStraight
' 見た目(矢印)
conn.Line.ForeColor.RGB = RGB(0, 112, 192)
conn.Line.Weight = 1.5
conn.Line.EndArrowheadStyle = msoArrowheadTriangle
End Sub
'========================
' 指定列の最終行を取得(START_ROW以降)
'========================
Private Function GetLastRow( _
ByVal ws As Worksheet, _
ByVal colLetter As String, _
ByVal startRow As Long) As Long
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, colLetter).End(xlUp).Row
If lastRow < startRow Then
GetLastRow = startRow - 1
Else
GetLastRow = lastRow
End If
End Function
'========================
' PREFIX一致の図形だけ削除(安全に作り直すため)
'========================
Private Sub DeleteShapesByPrefix(ByVal ws As Worksheet, ByVal prefix As String)
Dim i As Long
Dim shp As Shape
' 後ろから消す(番号ズレ防止)
For i = ws.Shapes.Count To 1 Step -1
Set shp = ws.Shapes(i)
If Left(shp.Name, Len(prefix)) = prefix Then
shp.Delete
End If
Next i
End Sub
使い方(実行手順)
- 手順表を作る(B列に手順の文章)
- Alt + F11 でVBAエディタを開く
- 挿入 → 標準モジュール
- 上のコードを貼り付ける
CreateFlowchart_Fullを実行(F5)
コードのポイント(初心者向け解説)
① 何度でも作り直せる(削除→作成)
前回作った図形を消さずに作ると、図形が増え続けてしまいます。
そこで DeleteShapesByPrefix で、今回作った図形(FC_から始まるもの)だけ削除してから作り直しています。
② 図形の「接続点」に矢印をつなぐ
矢印はただの線ではなく、AddConnector を使うと図形にくっつく線になります。
図形を動かしても矢印が付いてくるので、フローチャート向きです。
応用:分岐(Yes/No)を入れたい場合の考え方
完全版の次のステップとしてよくあるのが「分岐」です。
分岐を作る場合は、手順表に「種類」を持たせると作りやすいです。
例:C列にタイプを入れる
- PROCESS(通常工程)→ 角丸四角
- DECISION(判断)→ ひし形(ダイヤ)
ダイヤ形は次のTypeで作れます。
msoShapeDiamond
※分岐の自動接続(Yesは右へ、Noは下へ等)まで含めると記事が長くなるため、必要なら「分岐完全版」も別記事として作れます。
よくあるエラーと対処法
① 図形が追加されない
- シート保護が有効だと追加できないことがあります
- 保護を解除してから実行してください
② 図形が重なってしまう
TOP_POSやGAP_Yを大きくしてください- 手順の文字が長い場合は
SHP_Hを大きくすると見やすいです
③ 既存の図形まで消えてしまうのが不安
このコードは FC_ から始まる図形だけ削除します。
他の図形は消えません。心配なら PREFIX をさらにユニークにしてください(例:"IGAPI_FC_")。
まとめ|手順表からフローチャートを自動生成できる
- 手順表(B列)を元に図形を自動作成
- コネクタで矢印も自動接続
- 削除→作成で何度でも作り直し可能
- 応用で分岐(Yes/No)にも発展できる
フローチャート作りは手作業だと時間がかかりますが、VBAでテンプレ化すると一気にラクになります。
まずはこの「縦フロー完全版」を動かして、業務の手順表を自動図解してみてください。


コメント