Chapter 02. Excelへのデータの送信
このチュートリアルは、Excel へ値を送信する解説を行います。 Excel への値の送信は、SGLXSend() 関数を使用します。 Chapter 02 では、Chapter 01で作った雛形から解説を始めます。
1. 準備

Chapter 02 で使用するサンプルファイルをご用意致しましたので、ダウンロードして下さい。 Excel ファイルを開きます。開く際に警告が表示された場合は、マクロを有効にする、を選択して下さい。もし、マクロを無効に してしまった場合は、Excel ファイルを一旦閉じ、もう一度開いて今度はマクロを有効にする、を選択して下さい。

中央のセルが緑色の背景色になっていると思います。これは、通常の Excel の操作で行いました。
2. キーの用意
SGLXSend 関数は、以下のように宣言されています。 SGLXSend 関数には、二つの引数が必要です。 まず最初の、key (int 型)を用意しましょう。キーは、Excel に送信する値に紐付けされます。 Excel は、C/C++ 言語から値を受信した際に、「これは何の値なのか」が分かりません。 例えば、5322 という値を受信した際に、「これは慶應義塾大学湘南藤沢キャンパスの番地番号なのか」、それとも 「私のお小遣いなのか」、分かりません。その値が何の意味を持つのか、を Excel は知らないからです。 SGLX では、値にキーを紐付けすることによって、値の意味を Excel の VBA で判別できるようにします。
/** * データを送信する (int) * @param int 任意の数値 * @param value (int) 送信する値 */ void SGLXSend(int key, int value); /** * データを送信する (double) * @param int 任意の数値 * @param value (double) 送信する値 */ void SGLXSend(int key, double value); /** * データを送信する (char*) * @param int 任意の数値 * @param value (char*) 送信する値 */ void SGLXSend(int key, char* value);
キーは、int 型の正の整数であれば、任意の数値を設定して下さって構いません。ただし、あまりに大きい数を指定しないで下さい。 Excel がオーバーフローを起こし、プログラムが停止します。 数値の設定は、変数を用意します。int 型の正の整数を、プログラムの冒頭で宣言・定義して下さい。 ここでは、money_key という名前の変数を宣言し、int 型の整数 1000 で定義します。
int money_key = 1000;
この表記は、以下のように、#define を用いても構いません。#define を用いる場合は、末尾に「;(セミコロン)」を書かないで下さい。 また、「=(イコール)」も必要ありません。「=(イコール)」の代わりに、半角の空白を入れます。
#define money_key 1000
Chapter 01で作った雛形に、上記を加えた状態のソースコードを以下に示します。
#include "sfcglx.h" // 2. キーを用意する // #define money_key 1000 int money_key = 1000; void display() { BGColor(200, 200, 200); SGBeginEdit(); // 形状の描画の開始. SGEndEdit(); // 形状の描画の終了. SGSwapFrames(); // フレームを入れ替える. } int main(int argc, char** argv) { SGInit(argc, argv); // SGL の初期化 // SGLX の初期化 SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\2"); SGOpenWindow(0,0,500,500); // 500x500のウィンドウ SGSetDisplay(display); // 描画 SGCallBack(); // コールバック関数を登録 return 0; }
3. 送信する値
Excel に送信する値を用意しましょう。送信することができる値の型は、int、double、std::string の3つです。ここでは、 5322 (int 型) を送信することにします。値を用意するためには、変数を宣言・定義します。
int money_value = 5322;
ここまでのコードを以下に示します。
#include "sfcglx.h" // 2. キーを用意する // #define money_key 1000 int money_key = 1000; // 3. 送信する値を用意する int money_value = 5322; void display() { BGColor(200, 200, 200); SGBeginEdit(); // 形状の描画の開始. SGEndEdit(); // 形状の描画の終了. SGSwapFrames(); // フレームを入れ替える. } int main(int argc, char** argv) { SGInit(argc, argv); // SGL の初期化 // SGLX の初期化 SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\2"); SGOpenWindow(0,0,500,500); // 500x500のウィンドウ SGSetDisplay(display); // 描画 SGCallBack(); // コールバック関数を登録 return 0; }
4. 送信する
「2. キーを用意する」、「3. 送信する値を用意する」で用意した二つの変数を、SGLXSend() 関数の引数に入れ、 送信します。
では、二つの変数を確認します。money_key(キー)と money_value (送信する値)です。
// 2. キーを用意する // #define sample_key 1000 int money_key = 1000; // 3. 送信する値を用意する int money_value = 5322;
あとは、SGLXSend() 関数に、その二つの変数を入れるだけです。以下のようになります。
SGLXSend(money_key, money_value);
以上になります。以下に全文を載せます。
#include "sfcglx.h" // 2. キーを用意する // #define money_key 1000 int money_key = 1000; // 3. 送信する値を用意する int money_value = 5322; void display() { BGColor(200, 200, 200); SGBeginEdit(); // 形状の描画の開始. SGEndEdit(); // 形状の描画の終了. SGSwapFrames(); // フレームを入れ替える. } int main(int argc, char** argv) { SGInit(argc, argv); // SGL の初期化 // SGLX の初期化 SGLXInit("C:\\Users\\Akito\\Documents\\MediaDesign3D\\2"); // 送信する SGLXSend(money_key, money_value); SGOpenWindow(0,0,500,500); // 500x500のウィンドウ SGSetDisplay(display); // 描画 SGCallBack(); // コールバック関数を登録 return 0; }
ソースコードは以上です。早速、保存し、コンパイルし、実行してみましょう。
何も変わりませんか?
その通りです。Excel は値を受信しましたが、受信した値をセルに入力していません。しかし、SGLXサーバーをご覧下さい。
「2010/02/17 11:04:44 : 取得5322」と出ているはずです(日付は、プログラムを実行した日付、日時によって変わります)。以下に、私の
SGLXサーバーの表示を載せます。

では、受信した値をセルに入力してみましょう。ここから先は、C/C++ 言語ではなく、VBA という言語を使用します。 余力がある方は、進んでください。プログラムが苦手...、プログラムなんか大嫌いという方は、C/C++ 言語から Excel のセルに直接 値を入力する関数、SGLXInput() を用意致しましたので、そちらをご覧下さい。 SGLXInput() を用いたチュートリアルは、こちらになります。合わせてご覧下さい。
5. 受信後
一旦、C/C++ プログラムを終了して下さい。次に、Excel をアクティブにします。どのセルでも良いので、適当にクリックして下さい。 次に、Excel の上部にある「ツール」から、マクロ -> Visual Basic Editor をクリックします。アクティブにした状態で、ALTキーとF11 を押して下さっても構いません。

見慣れない画面が表示されたと思います。この画面は、Excel 上で動くプログラムを作成するために使用するエディターの画面です。左側の「プロジェクト - VBAProject」という部分を ご覧下さい。もし表示されていない場合は、表示 -> プロジェクトエクスプローラ をクリックして下さい。CtrlキーとRキーを押して下さっても構いません。 たくさんファイルが表示されていますが、この中の SGLXHandler というファイル以外は、原則的に触れないで下さい。

SGLXHandler というファイルをダブルクリックして開いて下さい。その中に、GetDataFromSGLX() という関数があるはずです。 GetDataFromSGLX() 関数は、データを受信した際に Excel によって呼ばれます。
Public Function GetDataFromSGLX(ByVal event_name As Long, ByVal event_data As String) End Function
引数の event_name には、キーが入っております。思い出してください、SGLXSend() 関数の引数にキーを入れました。 それと同じ値が、event_name に入っております。受信した値は、event_data に入っております。 今回は、以下のようなキーを、SGLXSend() 関数のキーに設定しました。
int money_key = 1000;
SGLXSend() のキーに 2000 という値を入れた場合は、event_name には 2000 が入っております。 以下のようにして、event_name が money_key と等しい場合は、受信した値を出力するようにしましょう。出力は、 Debug.Print という関数を使用します。
Public Function GetDataFromSGLX(ByVal event_name As Long, ByVal event_data As String) If event_name = 1000 Then Debug.Print event_data End If End Function
Ctrlキーとsキーを押し、上書き保存します。プログラムを保存、コンパイル、実行してみましょう。 イミディエイトウィンドウに 5322 と表示されているはずです。Debug.Print は、イミディエイトウィンドウに出力されます。 イミディエイトウィンドウが表示されていない場合は、表示 -> イミディエイトウィンドウ をクリックして下さい。Ctrlキーとgキーを押して下さっても構いません。
では、最後に今度は、イミディエイトウィンドウではなく、セルに入力してみましょう。上記が出来ていれば簡単です。 アクティブなシートのセル AD7 に受信した値を入力するには、以下のようにします。
ActiveSheet.Range("AD7").Value = event_data
VBA のコードの全文です。
Public Function GetDataFromSGLX(ByVal event_name As Long, ByVal event_data As String) If event_name = 1000 Then 'Debug.Print event_data ActiveSheet.Range("AD7").Value = event_data End If End Function
VBA では、コメントアウトするために「'」を使用します。「//」や「/* */」ではありませんのでご注意下さい。では、上書き保存してから
プログラムを保存、コンパイル、実行してみましょう。緑色のセルに「5322」と表示されましたか?
おめでとうございます。セルのフォントや背景色などご自由に変更してみたり、違う値を送受信してみたりして、遊んでみてください。
お疲れ様でした。