セルと同じサイズでフローチャートを作成する

昨日は、セルを選択してオートシェイプが全解除された場合、ユーザーフォームのリストボックスについても全項目を選択解除させてみました。

infoment.hatenablog.com

今日は、オートシェイプのサイズをセルに合わせて作成することに挑戦です。

今日やりたいこと

もともと一連のフローチャート作成ツールを作成する切っ掛けとなった方からは、以下の希望が寄せられていました。

セルと同じサイズのオートシェイプを作成し、セルにピタリと合わせて配置したい。

そこで今日は、適当に配置していたオートシェイプの配置方法を変更します。
f:id:Infoment:20180928231134p:plain

必要なこと

  1. 行と列のサイズを、ある程度の幅に広げておく
  2. オートシェイプを、一行飛ばしあるいは一列飛ばしで、セルサイズに合わせて配置する。

1.行と列のサイズを、ある程度の幅に広げておく

今回は、以下の通り設定しました。

この辺りは、お好みに合わせて設定可能です。
f:id:Infoment:20180928225424p:plain

2.オートシェイプを、一行飛ばしあるいは一列飛ばしで、セルサイズに合わせて配置する。

今回は、下記手順で行うことにしました。

  1. シートをコピーする。
  2. セルの記載内容を削除する。
  3. A1セルから順に、一行飛ばし或いは一列飛ばしで、セルサイズに合わせて配置する。

i=1,2,3と数が増えるごとに、1,3,5と変化させる場合、
2×i-1とすればOKです。

これらをまとめた結果は、以下の通りです。

【標準モジュール】
Public Sub MakeBlock()
     
    Dim seq As Variant
        seq = Selection
        
        If IsArray(seq) = False Then
            MsgBox "空白セルが一つだけ選択されているため、処理を中断します。"
            Exit Sub
        End If
        ' ↓↓今回の追加個所↓↓
        ' シートをコピーしたうえで、不要な情報を削除しています。
        ActiveSheet.Copy After:=ActiveSheet
        ActiveSheet.UsedRange.Clear
        ' 開始セルをA1としています。
        Dim StartCell As Range
        Set StartCell = Range("A1")
        ' ↑↑今回の追加個所↑↑
        
    ReDim SFC(1 To UBound(seq, 1), 1 To UBound(seq, 2))
    Dim i As Long, j As Long
        For j = 1 To UBound(seq, 2)
            For i = 1 To UBound(seq, 1)
                If seq(i, j) <> "" Then
                    Set SFC(i, j) = New ShapeClass
                    ' ↓↓今回の変更箇所↓↓
                    ' 配置したいセルの位置情報とサイズ情報を元に、
                    ' オートシェイプを描画しています。
                    Set SFC(i, j).myShape = ActiveSheet.Shapes.AddShape(msoShapeFlowchartProcess, _
                                                                        StartCell.Cells(2 * i - 1, 2 * j - 1).Left, _
                                                                        StartCell.Cells(2 * i - 1, 2 * j - 1).Top, _
                                                                        StartCell.Cells(2 * i - 1, 2 * j - 1).Width, _
                                                                        StartCell.Cells(2 * i - 1, 2 * j - 1).Height)
                    ' ↑↑今回の変更箇所↑↑
                        SFC(i, j).myShape.TextFrame2.TextRange.Characters.Text = seq(i, j)
                        SFC(i, j).myShape.Name = SFC(i, j).myShape.Name & "_" & i & "_" & j
                        SFC(i, j).myShape.OnAction = "SelectShape"
                        SFC(i, j).SetFormat
                End If
            Next
        Next
        
End Sub

結果

セルに合わせて、フローチャートを作成できるようになりました。
f:id:Infoment:20180928230550p:plain

次回に続きます。

参考まで。