作成日:2014年12月07日、更新日:2015年 1月 1日 作成:太刀魚

EXCELのセルとVBA間のデータ受け渡しについての考察を行い、例としてオートシェィプで月を描画します。


EXCEL VBAでのデータ授受

EXCELで作成したTIDEforWIN付釣果記録用紙で月の満ち欠けを表示する為、EXCELのオートシェィプで月の変化を描画しました。そこで気付いた内容を記載します。 EXCELのセルとVBA間のデータ受け渡しで、読み書きするセルやセルの範囲を名前として定義すると、レイアウトを自由に変えられるようになります。 月の変化を描画するコーディングを例にして説明します。

目次

  1. なぜセル番号を直接指定してデータを読み書きするのか
  2. セルやセルの範囲を名前で定義するとどんな利点があるのか
  3. オートシェィプで月を描画
  4. 月を描画したコーディング例
  5. 月の写真を利用したコーディング例
  6. 謝辞

1. なぜセル番号を直接指定してデータを読み書きするのか

VBAで普通一般に紹介されているコーディング例は、下記の様になっています。そして、これだけで説明が終わっています。 この様な書き方では、例えば、A列の列追加や列削除および1行の行追加や行削除を行うと、VBAで読み書きするセル位置が変わらない為、 多くの場合、不具合を生じます。従って、一般的にVBAコーディング後のEXCELのセルのレイアウトの変更はできないことになります。(レイアウトを変えるとコーディングも変更しなければならなくなります。)

一般に紹介されているコーディング例

'B8セルの内容を読み出す
Dim B8セルの内容 As Variant
B8セルの内容 = Range("B8").Value
B8セルの内容 = Cells(8,2).Value

'範囲B3:B4にオートシェィプ三日月(Type:=msoShapeMoon)を書く
Dim L As Variant, T As Variant, H As Variant
With ActiveSheet.Range("B3:B4")
    L = .Left
    T = .Top
    H = .Height
End With
Dim 月 As Object
Set 月 = ActiveSheet.Shapes.AddShape(Type:=msoShapeMoon, Left:=L, Top:=T, Width:=H, Height:=H)

2. セルやセルの範囲を名前で定義するとどんな利点があるのか

下記のコーディング例は、セルやセルの範囲を名前で定義してVBAから指定しています。 この書き方では、A列の列追加や列削除および1行の行追加や行削除を行うと、読み書きするセル位置が自動的に変わってくれる為、 VBAコーディング後のEXCELのセルのレイアウトの変更も可能となります。(レイアウト変更してもコーディングを変更しなくてよい) また名前の定義を再設定することにより、自由にセル位置を指定できます。 これは、VBAを知らない人でもレイアウトを変更できることを意味します。

名前の管理 名前の一覧
名前の管理0 名前の管理1

名前で定義したコーディング例

'"月齢"という名前で定義したB8セルの内容を読み出す
Dim d月齢 As Variant
d月齢 = Range("月齢").Value

'"月描写セル"という名前で定義した範囲B3:B4にオートシェィプ三日月(Type:=msoShapeMoon)を書く
Dim L As Variant, T As Variant, H As Variant
With ActiveSheet.Range("月描写セル")
    L = .Left
    T = .Top
    H = .Height
End With
Dim 月 As Object
Set 月 = ActiveSheet.Shapes.AddShape(Type:=msoShapeMoon, Left:=L, Top:=T, Width:=H, Height:=H)

3. オートシェィプで月を描画

名前で定義したコーディングの実例を紹介します。VBA月齢図.xls(40KB)をダウンロードして、下図のように月を描画するセル3行と4行の高さを大きくしておきます。

VBA月齢図.xlsのsheet1 VBA月齢図.xlsの説明
VBA月齢図.xls

「月描写」ボタンを押すと、B2:B3の高さいっぱいに月が暦Wiki/月の満ち欠け - 国立天文台暦計算室のように表示されます。

月の満欠

このシートでは、A列の列追加や列削除および1行の行追加や行削除を行っても正しく機能します。 この黄色と黒色のオートシェイプ図形による月の満ち欠けの表示は、実際に「TIDEforWIN付釣果記録用紙」で使用しています。

4. 月を描画したコーディング例

VBA月齢図.xls(39KB)をダウンロードして頂いて内容を見て頂く方が良いのですが、 気の短い方や検索エンジンの為にコーディング内容を以下に示します。 尚、日曜プログラマなので、コーディングのレベルが低いのは、ご容赦ください。

  1. sheet1の内容

    「月描写」ボタンが押された場合の処理内容を示します。

    sheet1の内容

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Sub btn月描写_Click()
        Dim d月齢 As Double
        Dim s月描写セル As String
    
    '    Dim Nameセル名 As Name
    '    For Each Nameセル名 In ActiveWorkbook.Names
    '        Debug.Print "btn月描写_Click 名前"; Nameセル名.Name; " "; Nameセル名.Value
    '    Next
        ' ワークシートの「月描写」という名前で定義されたセル範囲の文字列を読出す
        s月描写セル = Range("月描写セル").Name.Value
    
        Dim type月 As 月の図形
        type月 = gfunc月描写初期化(s月描写セル)
    
        Application.Calculation = xlCalculationManual
        For d月齢 = 0 To c朔望月 Step 0.1
    '        Application.ScreenUpdating = False
            Range("月齢").Value = d月齢             ' ワークシートの「月齢」という名前で定義されたセルに書込む
            Call gsub月描写(d月齢, type月)
    '        Application.ScreenUpdating = True
            DoEvents
            Sleep 10
        Next d月齢
        Application.Calculation = xlCalculationAutomatic
        Call gsub月描写領域解放(type月)
    End Sub
    

    c朔望月などの定数は、下記の標準モジュールで定義しています。

  2. 標準モジュール の内容

    汎用性のある処理内容をsheet1に記載せずに標準モジュールに記載しました。

    標準モジュールの内容

5. 月の写真を利用したコーディング例

月の輝いている黄色部分を満月の写真にしたコーディングの実例を紹介します。 背景に写真を使うことによって、実際の動画(APOD: November 8, 1999 - Lunation)に近い状態が表現できます。
満月の写真は、満月の写真:フリー写真素材集のmoon02.JPGから頂きました。ありがとうございました。

月の満ち欠け 説明
月の満ち欠け

VBA月齢背景写真.xls(91KB)をダウンロードして、実行すれば、左図の様になります。

気の短い方や検索エンジンの為にコーディング内容を以下に示します。
満月の写真を下表のように月齢に応じて、黒色のオートシェイプ図形で塗りつぶしていくようにしています。

月齢 オートシェイプ半円 オートシェイプ三日月 オートシェイプ一楕円
1~7日 黒塗りつぶし 黒塗りつぶし、幅縮小
8~15日 面積幅縮小
16~22日 鏡像、面積幅拡大
23~29日 鏡像、黒塗りつぶし 黒塗りつぶし、幅拡大

前項4とは、標準モジュールだけが異なりますので、標準モジュールの内容だけを下記に示します。

標準モジュールの内容

6. 謝辞

下記のWebページを参考にして、月描写が出来ました。有用なページ、有難うございました。

  1. EXCEL/Shape - a羅針盤 の「5.オブジェクトのプロパティー構成の調べ方」
  2. ラビのブログ17 の「IncrementRotationの使い方」
  3. 名前付きセル範囲の参照範囲を表示する:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug の「名前付きセル範囲」
  4. 満月の写真は、満月の写真:フリー写真素材集のmoon02.JPGから頂きました。
  5. このWebページのアニメーションGIFは、Microsoft Officeを除く、下記のサイトのフリーウェアのお蔭で無償で作成することができました。有難うございました。
    1. 選択範囲を画像として保存(高画質) | ヴィーバ VeaBa! Excel VBA Tipsに記載されている画像として保存する処理(高品質)により、月齢0日から29日の画像GIFファイルを一気に作成し、
    2. Microsoft Office Picture Manager で、トリミング処理やリサイズ処理を一括して行い、
    3. フリーのGIF/MNG-LC アニメーション作成ソフト Giam ダウンロード(Version 2.09)により、一括して読込み、一括して透過処理を施して、作成しました。
    詳しくは、アニメーションGIF作成覚書に記載しています。

© 2014-2015 太刀魚 Released under the MIT license

目次▲頁先頭