エクセルのマクロで地図ソフトを作成

パソコンで色々、作業していると案内図など簡単な地図をたまに作成します。ちょっとだけ小細工するときはエクセルソフトを使ってそれなりに体裁を整えてきましたが、意外と面倒。

なのでもっと作業を簡単にできないかと思い、良く使う地図変換機能をマクロでエクセルにアドインするソフト?を作ってみました。確認は「Excel 2016」でしか動作確認はしていませんが、特別なマクロは使ってないつもりなので少し前のバーションでも動くと思います。



マクロをエクセルへ挿入


先ずは、マクロコードをエクセルに挿入する必要があります。やり方は例えば、エクセルを立ち上げてメニューから

「開発」→「Visual Basic」→「挿入」→「標準モジュール」

で表示された画面にマクロコードをコピーします。次に、マクロ「Sub A_Map_Installer」を動させてソフトをエクセルにインストールします。動作の方法は色々あり、マクロコードをコピーした状態で直接実行してもいいし、エクセルのメニューボタンから「開発」→「マクロ」で選択でもOKです。




A_Map_Installerが動作するとアクティブなエクセルシートにソフトが自動的にインストールされます。




上記左画面のようになっていればインストール作業は終わりです。



地図ソフトの使い方


基本はエクセルの図形で色々書くのですが、このソフトで単純な線が、単純な「線」が鉄道や道路的な飾り付けに簡単に変換されます。もちろんエクセル機能で変更してもいいのですが、ワンクリックで動作させるのがこのソフトです。




線以外にも、簡単な建物も準備しました。基本はエクセルの図形で作ればいいのですが、ちょっとだけ私がよく使う建物を作っておきました。最後に描いたすべてのデータを一つにまとめて一枚の地図としてコピーできるようにしました。







「地図合成」すると丁度、選択状態になっているのでマウスの右クリックでそのまま、コピーして、他に貼り付けることができます。もし地図のサイズが大きければこの状態で縮小して下さい。




使い方は簡単で左側のボタンを押すだけで選択された線は鉄道などに変ります。建物などはボタンの上の部分に表示されるのでそれを移動して使用します。



地図ソフト用マクロコード


エクセルファイルをそのまま置ければいのですがブログなので自分でインストールするしかないようなので以下にマクロコードを載せておきます。エクセルのマクロは基本Visual Basicなので適当に変更して楽しんで下さい。マクロの詳細説明は後程...

取りあえず、使えそうだと思ったらインストールして試して下さい。



Sub text1()
'
'文字入力 Macro
'
'
    ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 46, 25, 70, 26). _
        Select

    Selection.ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = _
        msoAlignCenter
    With Selection.ShapeRange.TextFrame2
        .TextRange.Font.NameComplexScript = "Meiryo UI"
        .TextRange.Font.NameFarEast = "Meiryo UI"
        .TextRange.Font.Name = "Meiryo UI"
        .TextRange.Font.Size = 10
        .TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 0)
        .WordWrap = msoFalse
    End With
    With Selection.ShapeRange.TextFrame
            .HorizontalOverflow = xlOartHorizontalOverflowOverflow
            .VerticalOverflow = xlOartHorizontalOverflowOverflow
    End With
    
    Selection.ShapeRange.Fill.Visible = msoFalse
    Selection.ShapeRange.Line.Visible = msoFals

    Selection.Text = "文字入力"
        
 End Sub

Sub Building3()
'
' 目的位置 Macro
'
'
    Dim tshape As Shape
    
    With ActiveSheet.Range("DA3:Dd5")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeCan, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    With ActiveSheet.Range("DB1:Dc2")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeDownArrow, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    Set tshape = Nothing
    
    Call Group_part
    
'色の変更
    With Selection.ShapeRange.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(230, 0, 0)
        .Transparency = 0
        .Solid
    End With
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 10, 10)
        .Transparency = 0
        .Weight = 1
    End With
    
    Selection.ShapeRange.Width = Selection.ShapeRange.Width * 0.75
    Selection.Cut
    Range("B2").Select
    ActiveSheet.Paste
    
End Sub

Sub Building2()
'
' 横長ビル Macro
'
'

    Dim tshape As Shape
    
'建物作成
    With ActiveSheet.Range("DA1:DL4")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeCube, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    With ActiveSheet.Range("DC3:DH4")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeRectangle, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    Set tshape = Nothing
    
    Call Group_part
    
'色の変更
    With Selection.ShapeRange.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(180, 180, 180)
        .Transparency = 0
        .Solid
    End With
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(20, 20, 20)
        .Transparency = 0
        .Weight = 1
    End With
    
    Selection.ShapeRange.LockAspectRatio = msoTrue
    Selection.ShapeRange.Height = Selection.ShapeRange.Height * 0.75
    Selection.Cut
    Range("B2").Select
    ActiveSheet.Paste

End Sub

Sub Building1()
'
' 縦長ビル Macro
'
'

    Dim tshape As Shape
    
'建物作成
    With ActiveSheet.Range("DA1:DF5")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeCube, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    With ActiveSheet.Range("DB3:DC3")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeRectangle, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    With ActiveSheet.Range("DB4:DC4")
        Set tshape = ActiveSheet.Shapes.AddShape(Type:=msoShapeRectangle, _
        Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    End With
    Set tshape = Nothing
    
    Call Group_part
    
'色の変更
        With Selection.ShapeRange.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(150, 150, 150)
        .Transparency = 0
        .Solid
    End With
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(10, 10, 10)
        .Transparency = 0
        .Weight = 1
    End With
    
    Selection.ShapeRange.LockAspectRatio = msoTrue
    Selection.ShapeRange.Height = Selection.ShapeRange.Height * 0.75
    Selection.Cut
    Range("B2").Select
    ActiveSheet.Paste

End Sub


Sub Railway()
'
' 鉄道 Macro
'
'
    On Error GoTo myError
    
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        .Transparency = 0
        .Weight = 8
        .DashStyle = msoLineSolid
    End With
    Selection.ShapeRange.Line.Style = msoLineThinThin
'
    Selection.Copy
    ActiveSheet.Paste
    Selection.ShapeRange.IncrementLeft -12
    Selection.ShapeRange.IncrementTop -12
'
    Selection.ShapeRange.Line.Style = msoLineSingle
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .Weight = 8
        .DashStyle = msoLineDash
    End With
    Exit Sub
myError:
    MsgBox "ラインを選択してください"
    
End Sub

Sub LINE1()
'
' 幅広道路LINE1 Macro
'
    On Error GoTo myError
    
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(150, 150, 150)
        .Transparency = 0
        .Weight = 14
        .DashStyle = msoLineSolid
    End With
    Exit Sub
myError:
    MsgBox "ラインを選択してください"
   
End Sub

Sub LINE2()
'
' 細め道路 Macro
'
    On Error GoTo myError
    
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(150, 150, 150)
        .Transparency = 0
        .Weight = 8
        .DashStyle = msoLineSolid
    End With
    Exit Sub
myError:
    MsgBox "ラインを選択してください"
  
End Sub

Sub LINE_dot()
'
' 点線 Macro
'
    On Error GoTo myError
    
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(10, 10, 10)
        .Transparency = 0
        .Weight = 2.5
        .DashStyle = msoLineSysDot
    End With
    Exit Sub
myError:
    MsgBox "ラインを選択してください"
    
End Sub

Sub Group_part()
'
' 部品合成 Macro
'
'
Dim cRng As Range
Dim Sh As Shape
Dim ShCnt As Integer

Set cRng = Range("DA1:DZ20")
For Each Sh In ActiveSheet.Shapes
If Not Intersect(Range(Sh.TopLeftCell, Sh.BottomRightCell), cRng) Is Nothing Then
ShCnt = ShCnt + 1
If ShCnt = 1 Then Sh.Select Else Sh.Select Replace:=False
End If
Next Sh
If ShCnt > 1 Then Selection.Group.Select
End Sub

Sub Group_Pic()
'
' 地図合成 Macro
'
'
Dim cRng As Range
Dim Sh As Shape
Dim ShCnt As Integer

Set cRng = Range("D2:BZ42")
For Each Sh In ActiveSheet.Shapes
If Not Intersect(Range(Sh.TopLeftCell, Sh.BottomRightCell), cRng) Is Nothing Then
ShCnt = ShCnt + 1
If ShCnt = 1 Then Sh.Select Else Sh.Select Replace:=False
End If
Next Sh
If ShCnt > 1 Then Selection.Group.Select
End Sub



Sub A_Map_Installer()
'
' 作画マクロインストール Macro
'
'
    Columns("A").Select
    Selection.ColumnWidth = 5
    Columns("D:CZ").Select
    Selection.ColumnWidth = 1
    Columns("DA:DZ").Select
    Selection.ColumnWidth = 0.5
    Rows("1:100").Select
    Selection.RowHeight = 10
    Range("A1").Select

'作画エリア指定
    Range("D2:BZ42").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    
'--ボタンを作成--

For i = 0 To 9

    ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 34, 32 * i + 71.25, 91.5, 28.5). _
        Select
    With Selection.ShapeRange.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 255)
        .Transparency = 0
        .Solid
    End With
    Selection.ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = _
        msoAlignCenter
    With Selection.ShapeRange.TextFrame2.TextRange.Font
        .NameComplexScript = "Meiryo UI"
        .NameFarEast = "Meiryo UI"
        .Name = "Meiryo UI"
    End With
    Selection.ShapeRange.TextFrame2.TextRange.Font.Size = 12
    
'--ボタン名を設定--
    If i = 0 Then
        Selection.Text = "テキスト"
    ElseIf i = 1 Then
        Selection.Text = "幅広道路"
    ElseIf i = 2 Then
        Selection.Text = "細い道路"
    ElseIf i = 3 Then
        Selection.Text = "地下鉄(点線)"
    ElseIf i = 4 Then
        Selection.Text = "鉄道"
    ElseIf i = 5 Then
        Selection.Text = "縦長ビル"
    ElseIf i = 6 Then
        Selection.Text = "横長ビル"
    ElseIf i = 7 Then
        Selection.Text = "目的地"
    ElseIf i = 8 Then
        Selection.Text = "--------"
    Else
        Selection.Text = "地図合成"
    End If
  
'--ボタンにマクロを登録--
    If i = 0 Then
        Selection.OnAction = "text1"
    ElseIf i = 1 Then
        Selection.OnAction = "LINE1"
    ElseIf i = 2 Then
        Selection.OnAction = "LINE2"
    ElseIf i = 3 Then
        Selection.OnAction = "LINE_dot"
    ElseIf i = 4 Then
        Selection.OnAction = "Railway"
    ElseIf i = 5 Then
        Selection.OnAction = "Building1"
    ElseIf i = 6 Then
        Selection.OnAction = "Building2"
    ElseIf i = 7 Then
        Selection.OnAction = "Building3"
    ElseIf i = 8 Then
        Selection.OnAction = ""
    Else
        Selection.OnAction = "Group_Pic"
    End If

 Next i
    
    Range("a1").Select
    
End Sub



マクロは基本、ネットで検索したり「マクロ記録」で大まかな動作を記録してそのコードから余分なところを省いたりして作っているので余りスマートとは言えませんが、悪しからず。




マクロを使ったソフトを作ってみるといろいろ、新しいマクロの使い方を発見します。たまには頭の体操になるので楽しいかも(笑)


なぜ、こんなソフトを作ってるのかと言うと、以前は『グーグルマップを簡単につかうには「API」でなくて「iframe」』で書いたように、著作権の関係でオンライン系マップを埋め込んで使ってブログ等に乗せていましたが、情報が多過ぎてブログで使うと意外と見た目がゴチャゴチャした感じになってしまいました。

シンプル画像として使うために取り出して変更すると著作権に引っかかりそうだし、地図はブログやSNSでは取り扱い注意な案件ですね!!