次の方法で共有


Microsoft Excel 2002 から XML Web サービスを利用する

Siew-Moi Khor
Microsoft Corporation

July 2002

Applies to:
    Microsoft® Excel 2002

対象 :
    Microsoft® Excel 2002

概要 : この資料では、Microsoft Office XP Web Services Toolkit 2.0 と Microsoft Excel 2002 を使用して、 インターネットで天気情報を確認する XML Web サービスのサンプルについて説明します。

サンプル コードのダウンロード この資料のサンプル (ZipCodeWeatherReport.zip) のダウンロード

目次

はじめに
サンプルの実行
コードのウォークスルー
トラブルシューティング
まとめ

はじめに

Microsoft Office XP Web Services Toolkit 2.0 を使用することにより、 クライアント アプリケーションから XML Web サービスにアクセスし、使用する処理を大幅に単純化できます。 このツールキットに含まれる Web Service References Tool 2.0 を使用すると、 Microsoft Excel 2002 などのクライアント アプリケーションで、 WSDL ファイルまたは Visual Studio .NET 探索ファイル (.vsdisco) から、 Microsoft Visual Basic for Applications® (VBA) のプロキシ クラスやその他の関連するクラスを容易に作成できます。 このツールキットの詳細については、 「Office XP Web Services Toolkit 2.0 を使用して XML Web サービスで複合データ型と対話する」およびツールキットのヘルプ ファイルを参照してください。

プロキシ クラスには XML Web サービスが公開しているメソッドが含まれています。 したがって、その公開されているメソッドが提供する XML Web サービスの呼び出しや対話が可能です。 この資料で説明しているサンプルでは、 Web Service References Tool 2.0 を使用して、 プロキシ クラスやその他の関連するファイルを作成します。 このサンプルは、XMethods 社が提供する WeatherRetriever XML Web サービスを呼び出し、 Excel 2002 を使用してインターネット経由で天気情報を確認します。 この資料は、 Microsoft Office XP Web Services Toolkit 2.0 が既にコンピュータにインストールされていることを前提としています。

サンプルの実行

サンプルをダウンロードしたら、 Excel 2002 を使用して ZipCodeWeatherReport.xls ファイルを開きます。 図 1 に示すような、郵便番号の異なる 5 つの地域の天気情報を記録したワークシートが表示されます。

Aa140334.odc_wsrxl01(ja-jp,office.10).gif
図 1. ZipCodeWeatherReport.xls サンプル

  1. このサンプルを実行するには、まず [Clear Worksheet] をクリックしてワークシートの内容を消去します。 ワークシート上の A 列の郵便番号を除くすべての値が消去されます。
  2. 特定の郵便番号の地域の天気情報のレポートを取得するには、A 列に郵便番号を入力します。
  3. [Get Weather Report] をクリックします。B 列から G 列に、最新の天気情報の詳細が格納されます。

コードのウォークスルー

WeatherRetriever XML Web サービスは、 郵便番号を String 値として受け取る GetWeather というメソッドを提供します。 このメソッドは、struct_CurrentWeather という複合データ型構造体を返します。 複合データ型構造体 struct_CurrentWeather は、 4 つの String 値と 3 つの Single 値から構成されます。 以下に、struct_CurrentWeather クラス モジュールから抜粋したコードを示します。

Public LastUpdated As String
Public IconUrl As String
Public Conditions As String
Public CurrentTemp As Single
Public Humidity As Single
Public Barometer As Single
Public BarometerDirection As String
  • LastUpdated は、天気情報のデータの最終更新日時です。
  • IconUrl は、晴れ、曇りなどの現在の天気情報を表現するアイコンへの URL です。 このサンプルでは、XML Web サービスから URL を取得していません。
  • Conditions は、晴れ (clear)、曇り (overcast) など現在の天気情報を返します。
  • CurrentTemp は現在の気温を返します。
  • Humidity は現在の湿度を返します。
  • Barometer は現在の気圧の値を返します。
  • BarometerDirection は、気圧の値が現在、上昇と下降のどちらに向かっているかを返します。

WeatherRetriever XML Web サービスを呼び出す VBA コードを調べてみましょう。 まず、4 つのオブジェクトを宣言しています。

    Dim clsWeather As clsws_WeatherRetriever
    Dim objCurWeather As struct_CurrentWeather
    Dim rngZipCodes As Range
    Dim rngZip As Range

宣言されている変数が表す内容は以下のとおりです。

  • clsWeather は XML Web サービスを表します。
  • objCurWeather は、天気情報の値を示す複合データ型構造体です。
  • rngZipCodes は、A 列のすべてのセルを表します。
  • rngZip は、アクティブ セルの郵便番号を表します。

以下に抜粋したコードでは、 clsWeather オブジェクト変数は、 VBA プロキシ クラス clsws_WeatherRetriever オブジェクトのインスタンスで初期化されます。 同様に、objCurWeather オブジェクトは、 上記で複合データ型構造体を返すと説明した struct_CurrentWeather オブジェクトのインスタンスで初期化されます。 clsws_WeatherRetriever クラス、struct_CurrentWeather クラスは共に、 Web Service References Tool 2.0 が生成します。

Set clsWeather = New clsws_WeatherRetriever
Set objCurWeather = New struct_CurrentWeather

次に rngZipCodes がセル A2 から A65536 までを含むように設定します。 その後、以下に示すように、最初の郵便番号を格納するセル A2 をアクティブにします。

Set rngZipCodes = Range(Range("a2"), Range("a65536").End(xlUp)) Application.ActiveSheet.Range("A2").Activate

セル A2 以下、A 列の各セルに対して郵便番号の値の有無をチェックします。 郵便番号の値が存在しない場合、サブルーチンを終了します。

For Each rngZip In rngZipCodes
     ...
        With rngZip
            ...
        End With
    
        ' 次の郵便番号に移動します。
        Next rngZip
    Exit Sub

郵便番号の値が存在する場合、 その郵便番号がパラメータとして clsws_WeatherRetriever クラスの wsm_GetWeather メソッドに渡され、 XML Web サービスの GetWeather メソッドにマップされます。 wsm_GetWeather メソッドは郵便番号を XML Web サービスに渡し、 複合データ型構造体 struct_CurrentWeather を返します。 構造体の値は、上記で初期化した objCurWeather 変数を設定することによって、 その変数に代入されます。

返された天気情報の値は郵便番号の値の隣のセルに格納されます。 コードが A 列内の次の郵便番号の値に移動し、その郵便番号のセルをアクティブにして、処理を繰り返します。 以下に、このサブルーチンのコードを抜粋します。

    For Each rngZip In rngZipCodes
      Set objCurWeather = clsWeather.wsm_GetWeather(rngZip)
        With rngZip
            .Offset(0, 1).Value = objCurWeather.CurrentTemp
            .Offset(0, 2).Value = objCurWeather.Conditions
            .Offset(0, 3).Value = objCurWeather.Humidity
            .Offset(0, 4).Value = objCurWeather.Barometer
            .Offset(0, 5).Value = objCurWeather.BarometerDirection
            .Offset(0, 6).Value = objCurWeather.LastUpdated
        End With
     Next rngZip
Exit Sub

wsm_GetWeather メソッドの呼び出しは、 clsws_WeatherRetriever クラス モジュールの以下のコードに対応します。

...
Private sc_WeatherRetriever As SoapClient30
Private Const c_WSDL_URL As String = "http://www.learnxmlws.com/services/weatherretriever.asmx?wsdl"
...
    Set sc_WeatherRetriever = New SoapClient30
    sc_WeatherRetriever.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
...
Public Function wsm_GetWeather(ByVal str_zipCode As String) As struct_CurrentWeather
...
    Set wsm_GetWeather = sc_WeatherRetriever.GetWeather(str_zipCode)
...
End Function

このサンプルでは 2 つのコマンド ボタンを使用しています。 また、ワークシートの内容を消去するプロシージャと、エラー処理を行うプロシージャが存在します。 Excel 2002 の非常に役立つデータ検証機能も利用しています。 サンプル コードを調べてみると、コメントも多く、上記の処理が Excel 2002 では容易に行われていることがわかります。

トラブルシューティング

ここでは、有益と思われるトラブルシューティングのためのヒントを紹介します。

  • プロキシ サーバーを使用する場合、 コンピュータに最新のプロキシ クライアントがインストールされている必要があります。 たとえば、Microsoft Internet Security & Acceleration (ISA) Server を使用する場合は、 ISA Firewall Client がインストールされている必要があります。

  • マクロに署名がないので、セキュリティを [中] に設定して、 [組み込み済みのアドインとテンプレートをすべて信頼する] 設定を無効にする必要があります。 このセキュリティ設定を行うと、ZipCodeWeatherReport.xls を有効にするか無効にするかを問い合わせるダイアログ ボックスが表示されます。 実行するには [マクロを有効にする] をクリックします。

注意 サンプルの表示後は、以前のセキュリティ レベルにかかわらず、 以下に示す手順に従って [セキュリティ] ダイアログ ボックスで適切な変更を行い、セキュリティをリセットします。

セキュリティ設定を変更するには、以下の手順に従います。

  1. Microsoft Excel 2002 を起動します。
  2. [ツール] メニューの [マクロ] をポイントし、[セキュリティ] をクリックします。 [セキュリティ] ダイアログ ボックスが表示されます。
  3. [セキュリティ レベル] タブの [中] をクリックします。
  4. [信頼のおける発行元] タブをクリックします。 [組み込み済みのアドインとテンプレートをすべて信頼する] チェック ボックスをオフにします。
  5. Excel を終了します。
  • WeatherRetriever XML Web サービスが機能せず、 現在 XML Web サービスが利用できない、接続がタイムアウトしたなどのエラー メッセージが表示される場合は、 以下のテストを行ってみてください。
  1. クリップボードに WeatherRetriever WSDL の URL http://www.learnxmlws.com/services/weatherretriever.asmx?wsdl をコピーします。
  2. Alt + F11 キーを押して、VBA エディタを起動します。
  3. [ツール] メニューの [Web Service References] をクリックします。
  4. WSDL の URL を [Web サービス URL] ボックスに貼り付けます。
  5. [検索] をクリックします。

[検索結果] ボックスに WeatherRetriever XML Web サービスのメソッドが返される場合は、 XML Web サービスにアクセスできるので、問題は他にあるはずです。 XML Web サービスへのインターネット アクセスが遅いなど、待ち時間が生じることが原因でエラーになることがときどきあります。 XML Web サービスが検出されないのに Microsoft Internet Explorer やその他のブラウザで WSDL の URL を参照できる場合は、 プロキシ クライアントがインストールされていないか、または機能していません。

まとめ

XML Web サービスを利用する開発者が行う必要のあるコーディングを Web Service References Tool 2.0 で削減できます。 この資料からわかるように、 Excel 2002 などのクライアント アプリケーションから XML Web サービスを利用、対話するサンプルを容易に作成できます。