【ExcelVBA・マクロ】フローチャートを自動作成する完全版|手順表から図形+矢印を一括生成するマクロ

フローチャートを自動作成 ExcelVBA

「手順を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


使い方(実行手順)

  1. 手順表を作る(B列に手順の文章)
  2. Alt + F11 でVBAエディタを開く
  3. 挿入 → 標準モジュール
  4. 上のコードを貼り付ける
  5. CreateFlowchart_Full を実行(F5)

コードのポイント(初心者向け解説)

① 何度でも作り直せる(削除→作成)

前回作った図形を消さずに作ると、図形が増え続けてしまいます。
そこで DeleteShapesByPrefix で、今回作った図形(FC_から始まるもの)だけ削除してから作り直しています。

② 図形の「接続点」に矢印をつなぐ

矢印はただの線ではなく、AddConnector を使うと図形にくっつく線になります。
図形を動かしても矢印が付いてくるので、フローチャート向きです。


応用:分岐(Yes/No)を入れたい場合の考え方

完全版の次のステップとしてよくあるのが「分岐」です。
分岐を作る場合は、手順表に「種類」を持たせると作りやすいです。

例:C列にタイプを入れる

  • PROCESS(通常工程)→ 角丸四角
  • DECISION(判断)→ ひし形(ダイヤ)

ダイヤ形は次のTypeで作れます。

msoShapeDiamond

※分岐の自動接続(Yesは右へ、Noは下へ等)まで含めると記事が長くなるため、必要なら「分岐完全版」も別記事として作れます。


よくあるエラーと対処法

① 図形が追加されない

  • シート保護が有効だと追加できないことがあります
  • 保護を解除してから実行してください

② 図形が重なってしまう

  • TOP_POSGAP_Y を大きくしてください
  • 手順の文字が長い場合は SHP_H を大きくすると見やすいです

③ 既存の図形まで消えてしまうのが不安

このコードは FC_ から始まる図形だけ削除します。
他の図形は消えません。心配なら PREFIX をさらにユニークにしてください(例:"IGAPI_FC_")。


まとめ|手順表からフローチャートを自動生成できる

  • 手順表(B列)を元に図形を自動作成
  • コネクタで矢印も自動接続
  • 削除→作成で何度でも作り直し可能
  • 応用で分岐(Yes/No)にも発展できる

フローチャート作りは手作業だと時間がかかりますが、VBAでテンプレ化すると一気にラクになります。
まずはこの「縦フロー完全版」を動かして、業務の手順表を自動図解してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました