2008年07月17日

図形を描画できるエクセルVBA関数(2)

役立つExcel(エクセル)自作VBA関数

「役立つExcel(エクセル)自作VBA関数」の新着情報

ケロ丸 はじめまして、ケロ丸です。
今回の追加分は、エクセルワークシートとフォームで図形を描画できるエクセルVBA関数と、新たに作ったワークシートやイベントルーチンです。
このページでは、「図形を描画できるエクセルVBA関数(2)」というタイトルのページで、当サイトの管理人である私(ケロ丸)が作ったフォーム上に図形を描画できるVBA関数について解説の続きです。
最初から見たい場合は、このページの一番下の1ページ目に戻るをクリックして下さい。
また、サイトマップなどがあるトップページへは、以下のリンクをクリックすると行けます。
役立つExcel(エクセル)自作VBA関数




図形を描画できるエクセルVBA関数(2)

図形を描くための自作VBA関数.xlsというエクセルファイルの中身を見ながらこのページを読んで下さい。
このエクセルファイルのダウンロードは、このページの一番下の1ページ目に戻るをクリックすると説明があり、実際にダウンロードできます。
プログラムの説明を始めます。
このエクセルファイルを開きます。
すぐ図形を描くためのフォームもワークシートとともに自動的に表示されます。
フォームを閉じなくても、バックのワークシートに何か入力できるようにしてあります。
「描画」と表示されているボタンをクリックすると、楕円や四角形や直線や点線の図形が描画されます。
消したい時は、「消す」と表示されているボタンをクリックすると、描いた図形が消えます。
本来、エクセルVBAには、図形を描画するための関数やサブルーチンはありません。
そこで、Windowsが本来備えているAPI(Win32API)を使用します。
これは、Windowsのいろいろな機能を提供してくれる関数の集合体で、VisualC++Visual Studioに含まれるMSDNライブラリーのCDを見ると、ほとんどの関数の説明があります。
また、マイクロソフトのサイトにMSDNのホームページがあり、ここには最新のものがあります。
しかし、C言語のプログラムが読めないとわかりません。
C言語を知らない人はきついです。
今回使ったような図形の描画関連なら、MSDNの以下のページを見るとWin32APIの関数の説明があります。

SDK ドキュメント ( Windows GDI )

VBAVisual Basicのプログラマーの人にはあまり馴染みがないかもしれません。
Win32APIを使いこなせればいろいろ応用できて、VBAのプログラム作成も楽しくなります。
Win32APIの各関数を自分で作ったVBAのプログラムの中で使う時は、以下のようにVBAのモジュールの中で宣言する必要があります。

' Win32APIの定数の宣言
Const PS_SOLID = 0&
Const NULL_BRUSH = 5&
Const R2_WHITE = 16
Const R2_XORPEN = 7&

' Win32APIの関数の宣言
Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Declare Function Ellipse Lib "gdi32" (ByVal hDC As Long, ByVal nLeftRect As Long, ByVal nTopRect As Long, ByVal nRightRect As Long, ByVal nBottomRect As Long) As Long
Declare Function Rectangle Lib "gdi32" (ByVal hDC As Long, ByVal nLeftRect As Long, ByVal nTopRect As Long, ByVal nRightRect As Long, ByVal nBottomRect As Long) As Long
Declare Function MoveToEx Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, pt As Any) As Long
Declare Function LineTo Lib "gdi32" (ByVal hDC As Long, ByVal nXEnd As Long, ByVal nYEnd As Long) As Long
Declare Function SetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Declare Function SetROP2 Lib "gdi32" (ByVal hDC As Long, ByVal fnDrawMode As Long) As Long

Win32APIの決まった定数も自分で宣言する必要があります。
上の例は、ほんの一部に過ぎません。膨大な量の定数や関数があります。
図形の表示処理は、すべて私(ケロ丸)自作のVBA関数(DrawGraphForExcel)の中で行っています。
まず、ワークシートと同時に開いたフォームのウィンドーハンドルを取得し、続いてデバイスコンテキストを取得します。
これだけ最初に行っておくと、ペンやブラシの作成や選択などができるようになります。
関数の引数を見るとわかりますが、hWndやhDCの変数を使用している関数では、フォームのウィンドーハンドルやデバイスコンテキストが必要だということを示しています。
続いて、ペンやヌルブラシの作成と選択を行います。
Win32APISetROP2 という関数を使うと、以前描画してあった図形を消すこともできます。
この場合も普通に図形を描画します。
フォーム上に表示したい場合は、この関数を実行しません。
次に、Ellipse 関数を使って楕円を描きます。
続いて、ヌルブラシの選択解除、塗り潰すためのソリッドブラシの作成と選択を続けて行います。
続いて、Rectangle 関数を使って矩形を描画します。
既に作成したペンの色で長方形の枠を描画し、中をソリッドブラシの色で塗りつぶします。
次は、ペンの色で直線を描きます。
続いて、点線を赤で横に描画します。この場合は、SetPixel 関数を使います。
図形の描画に関してはここまでです。
最後に、ペンやブラシの解放や削除など、使ったリソース関連の後処理を行い、自分で作ったDrawGraphForExcel関数を抜けます。
長い処理は、このDrawGraphForExcel関数だけで、他に幾つかイベントルーチンを作りましたが、大したことはやっていません。
後は、図形を描くための自作VBA関数.xlsの中身を御覧下さい。

1ページ目に戻る

「図形を描画できるエクセルVBA関数(2)」のページトップ
ケロ丸自作のエクセル用ツールのダウンロード
「役立つExcel(エクセル)自作VBA関数」の新着ページ
「役立つExcel(エクセル)自作VBA関数」のトップページ

© 2008 Toyozi Masuda All rights reserved.

【エクセルVBAで図形を描く方法の最新記事】

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。