Chapter 02. Excelへのデータの送信

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

1. 準備

サンプルファイル

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

Chapter 2 のファイルを開きました

中央のセルが緑色の背景色になっていると思います。これは、通常の 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 を押して下さっても構いません。

Visual Basic Editor を開きます

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

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」と表示されましたか?
おめでとうございます。セルのフォントや背景色などご自由に変更してみたり、違う値を送受信してみたりして、遊んでみてください。

お疲れ様でした。