73964


VBAでWeb APIに接続してデータを取得しようと試みています。  
参考にしたのは以下のページです。

[VBA で Web API を呼び出す -
Qiita](https://qiita.com/MakotoIshikawa/items/be902e6bd3fa2e5c5fe5)

まず、下記手順でVBA-JSON のインポートを行いました。

> ### VBA-JSON のインポート
>
>   1. VBA-JSON の最新版 (.zip) をダウンロードする。
>   2. ダウンロードしたファイルを解凍する。
>   3. 解凍したフォルダを任意の場所に配置する。
>   4. Excel を起動し、VBA の開発ツールを開く。
>   5. [ファイル(F)] > [ファイルのインポート(I)]
> を選択し、解凍したフォルダ内にある「JsonConverter.bas」を選択しインポートします。
>   6. [ツール(T)] > [参照設定(R)] から「Microsoft Scripting Runtime」にチェックを入れます。  
>  チェックすることで、Dictionary 型を使用できるようになります。
>

その後、下記のコードを書き test_get を実行したところ、KickWebApiOfJson関数の最後のEnd
Functionのところで、「型が一致しません」というエラーが出てしまいました。

試したことは、KickWebApiOfJson関数の戻り値指定をAs ObjectをAs Dictionaryとして実行しましたが、同じエラーが出ました。

また、typ = VarType(KickWebApiOfJson)として、型を確認しましたが、値は9だったのでObjectということでした。

WatchでKickWebApiOfJson変数の方を確認すると、Object/Dictionaryとなっています。

エラーの解決方法をご教示お願いいたします。

* * *

**ThisWorkbook**

[code]

    Public Function KickWebApiOfJson(ByVal request As String, ByVal url As String, Optional ByVal param As Object) As Object
        Dim json
        json = ConvertToJson(param)
    
        Dim http As Object
        Set http = CreateObject("MSXML2.XMLHTTP")
        With http
            .Open request, url, False
            .SetRequestHeader "Content-Type", "application/json; charset=UTF-8"
            .send json
    
            If .ResponseText <> "" Then
                Set KickWebApiOfJson = ParseJson(.ResponseText)
                Dim typ
                typ = VarType(KickWebApiOfJson)
            End If
        End With
    End Function
    
    Sub test_get()
        Dim res As Collection
        
        Set res = KickWebApiOfJson("GET", "https://httpbin.org/get")
    End Sub
    
[/code]


CC BY-SA 4.0
2021-02-12T16:14:52.617
73961
2021-02-13T05:43:32.523
2021-02-12T16:34:09.000
3060
43941
question
vba
戻り値としてObjectを指定している関数がDictionary型オブジェクトを返す際、「型が一致しません」というエラーが出る。


おそらく戻り値として何が返ってくるかで受け取る側の変数を変える必要があると思われます。  
質問のソースの`As Collection`を`As Dictionary`に変えることでエラーは出なくなりました。

元のコード：

[code]

    Sub test_get()
        Dim res As Collection
    
[/code]

変更後：

[code]

    Sub test_get()
        Dim res As Dictionary
    
[/code]

* * *

参照先の記事でも、依頼内容に応じて`Collection`か`Dictionary`かを切り替えているようですし。

>
[code]

>     Sub OnClick_GetAllButton()
>         Dim res As Collection
>         Set res = KickWebApiOfJson("GET", "http://localhost/api/Values/")
>  
[/code]

>
[code]

>     Sub OnClick_GetButton()
>         Dim res As Dictionary
>         Set res = KickWebApiOfJson("GET", "http://localhost/api/Values/" &
> id)
>  
[/code]


CC BY-SA 4.0
2021-02-13T05:41:00.193
73964
2021-02-13T05:43:32.523
2021-02-13T05:43:32.523
3060
26370
73961
answer