見出し画像

#番外3 マクロを併用してシェイプでお絵かき

ExcelにはプログラムでExcelを操作できるマクロ機能が備わっています。と、いうことは、お絵かきをする操作もプログラムで制御できるということです。一例として、シート上に描いたドット絵を、プログラムでシェイプに起こしてみましょう。

個々のシェイプはShapeオブジェクトで管理される

プログラム(マクロ/VBA)で個々のシェイプを扱う場合、個々のシェイプはShapeオブジェクトで管理されます。VBAに関しての説明は割愛しますが、この仕組みを利用すると、プログラムでお絵かきできるのです。

基本的には、シート(Worksheetオブジェクト)のシェイプコレクション(Shapesコレクション)に対してAddメソッドで追加します。

Worksheet.Shapes.Add(種類, 左端, 上端, 幅, 高さ)

追加したシェイプの色など、個々のシェイプに関する細かな操作は、Shapeオブジェクトの各種プロパティ経由で行います。

'塗りの色を変更
Shape.Fill.ForeColor.RGB = RGB(赤, 緑, 青)
'線を非表示
Shape.Line.Visible = False

VBAでの色管理の方法は、何パターンか用意されているのですが、とりあえずの雰囲気はこんな感じです。

セルの背景色と位置からシェイプを作成

と、いうわけで実践です。今回はセルと背景色を利用して描いたドット絵状のイラストから、プログラムで色や位置の情報を取得し、対応するシェイプを配置します。元のセルはこうなっています。

この情報をもとに、プログラムを使って[角丸四角形]のシェイプを配置すると、こうなります。

ぱっと見ただけで、「これは手作業ではしんどい」というのが伝わりますね。でも、プログラムで配置してしまえばあっという間です。

大まかな配置などをプログラム任せで作成し、その後に手作業で微調整する、等の方法をとっても良いですね。実は上図の場合も、書き出し後に全選択して[影]の効果を付けています。

なお、今回は、見た目にわかりやすいように、セルの背景色からシェイプを起こしてみましたが、もちろん、座標情報や色情報などのキッチリした数値から絵を起こすことも可能です。

なんなら、SVGなどのベジェ曲線の情報を使って、その通りに描画することも可能です(BuildFreeFormメソッドというメソッドを利用します)。

手作業のお絵かきは苦手というプログラマの皆さん、ぜひお試しください。これはこれで楽しいですよ。

豆:実際に使ったコード

今回実際に使ったコードはこちらです。仕組みとしては、「背景色の設定してあるセル範囲を選択してから実行」するとシェイプを配置します。

Sub drawShapes()
    'シェイプの大きさ定義
    Dim size As Long
    size = 15
    

    '選択セル範囲から描画位置情報の取得
    Dim maxRow As Long, maxCol As Long
    maxRow = Selection.Rows.Count
    maxCol = Selection.Columns.Count

    'シェイプを配置する基準となる位置のセルを指定
    Dim baseRng As Range
    Set baseRng = Range("S4")
    
    
    '選択セル範囲を走査してシェイプを描画
    Dim rowPos As Long, colPos As Long, curColor As Long
    
    For rowPos = 1 To maxRow
        For colPos = 1 To maxCol
            'セルの背景色を取得
            curColor = Selection.Cells(rowPos, colPos).Interior.Color
            '背景色無し(16777215)かをチェック
            If Not curColor = 16777215 Then
                'シェイプを配置して調整
                With ActiveSheet.Shapes.AddShape( _
                    Type:=msoShapeRoundedRectangle, _
                    Left:=baseRng.Left + size * colPos, _
                    Top:=baseRng.Top + size * rowPos, _
                    Width:=size, Height:=size _
                )
                    .Fill.ForeColor.RGB = curColor
                    .Line.Visible = False
                    .Adjustments.Item(1) = 0.2
                    .Rotation = Rnd() * 60  'せっかくなので角度をランダムに
                End With
            End If
        Next
    Next
End Sub

おまけ:バブルチャートのデータに変換してみました

ついでなので、マクロでセルの情報を座標情報に変換し、バブルチャートで表示してみました。コツとしては、バブルチャートのバブルの表示サイズは、全ての値の相対的な大きさの関係によって決まってくるので、ドット部分とは大きさの異なる、基準となる系列をひとつ追加することです。

上のグラフですと、左下にある「大きさ12(セルU3の値)」の系列ですね。他のバブルの値はすべて「1」です。基準となる値の大きさを変えると、相対的に「1」のデータの表示サイズ、つまり、ドットの大きさが変わっていきます。

この記事が気に入ったらサポートをしてみませんか?