2017-09-23 13 views
0

私はグーグルで多くのことを行っていますが、私が間違っていることを理解することはできません。関数内でafサブ関数を呼び出す際の問題

Public Sub ConnectToBloomberg(Code) 

Dim sUrl As String 
Dim rawJson As Dictionary 
Dim pricedata As Object 
Dim dataRequest As WinHttp.WinHttpRequest 

sUrl = "http://www.bloomberg.com/markets/api/bulk-time-series/price/" & Code & "?timeFrame=1_YEAR" 

Set dataRequest = New WinHttp.WinHttpRequest 

With dataRequest 
    .Open "GET", sUrl, True 
    .Send 
    .WaitForResponse 
    FetchedData = .ResponseText 
End With 

FetchedData = Right(FetchedData, Len(FetchedData) - 1) 
FetchedData = Left(FetchedData, Len(FetchedData) - 1) 

Set Json = JsonConverter.ParseJson(FetchedData) 

Set pricedata = Json.Item("price") 

End Sub 

Function MEANVALUE() As Double 

ConnectToBloomberg (Code) 

For Each Item In pricedata 

    Count = Count + 1 

    YReturn = Item("value") - LastPrice 

    LastPrice = Item("value") 

    Total = Total + YReturn 

Next 

Mean = Total/Count 

MEANVALUE = Mean 

End Function 

問題は、私がSubを呼び出そうとする2番目の関数にあるはずです。

私はVBAのかなりのnoobieです! :-)

私は間違っていますか?

ありがとうございます!


別の方法で説明します。

Function MEANVALUE(Code) As Double 

Dim sUrl As String 
Dim rawJson As Dictionary 
Dim pricedata As Object 
Dim dataRequest As WinHttp.WinHttpRequest 

sUrl = "http://www.bloomberg.com/markets/api/bulk-time-series/price/" & Code & "?timeFrame=1_YEAR" 

Set dataRequest = New WinHttp.WinHttpRequest 

With dataRequest 
    .Open "GET", sUrl, True 
    .Send 
    .WaitForResponse 
    FetchedData = .ResponseText 
End With 

FetchedData = Right(FetchedData, Len(FetchedData) - 1) 
FetchedData = Left(FetchedData, Len(FetchedData) - 1) 

Set Json = JsonConverter.ParseJson(FetchedData) 

Set pricedata = Json.Item("price") 

For Each Item In pricedata 

    Count = Count + 1 

    YReturn = Item("value") - LastPrice 

    LastPrice = Item("value") 

    Total = Total + YReturn 

Next 

Mean = Total/Count 

MEANVALUE = Mean 

End Function 

をしかし、私は他の関数でこのコードを使用しています:このコードは、実際に動作する

Dim sUrl As String 
Dim rawJson As Dictionary 
Dim pricedata As Object 
Dim dataRequest As WinHttp.WinHttpRequest 

sUrl = "http://www.bloomberg.com/markets/api/bulk-time-series/price/" & Code & "?timeFrame=1_YEAR" 

Set dataRequest = New WinHttp.WinHttpRequest 

With dataRequest 
    .Open "GET", sUrl, True 
    .Send 
    .WaitForResponse 
    FetchedData = .ResponseText 
End With 

FetchedData = Right(FetchedData, Len(FetchedData) - 1) 
FetchedData = Left(FetchedData, Len(FetchedData) - 1) 

Set Json = JsonConverter.ParseJson(FetchedData) 

Set pricedata = Json.Item("price") 

だから私は代わりに、各機能に手動でコードを使用するのではなく、それを呼び出すことができるようにしたいです。

+0

(a)はどのようなコードを、あなたは関数を呼び出すために使用して、またはそれはUDFでいますか? (b)関数では、決して値を割り当てていない変数 'Code'を使用しています。また値を割り当てたことのない 'pricedata'という変数も使用しています。 (c)あなたのサブは、多くの仕事をしていますが、実際にはその仕事の結果で何もしていません - ちょうどそれをいくつかの一時的な値に割り当ててから終了します。 (おそらく、その一時変数をSubという関数に戻すことを意味していたでしょうか?) – YowE3K

+0

(d)本当にこの質問に "su"タグを付けるつもりでしたか? – YowE3K

+0

私はWorkbook = MEANVALUE(C3)の関数を呼び出しています。 関数は実際に私がサブプロシージャから手動でティル関数にコードを追加したときに前に働いていましたが、何度もそのコードを使用しています。 –

答えて

1

現在のConnectToBloombergサブルーチンは実際には何も生産的ではありません。サブルーチンの終わりにはすべての計算が失われます。あなたはこの問題を解決する方法はいくつか持っている

:あなたのMEANVALUE機能があなたのConnectToBloombergサブルーチンとしてだけでなく、それをアクセスできるように

  1. pricedataモジュールレベルを作るには、変数をスコープ。代わりに、サブルーチンの(価格データを返す)Functionなるように変更ConnectToBloombergConnectToBloomberg
  2. への呼び出しでパラメータを経由して
  3. パスバックpricedata。以下は

第三のアプローチを使用していくつかのコードです:

Public Function ConnectToBloomberg(Code As String) As Object 

    Dim sUrl As String 
    Dim rawJson As Dictionary 
    Dim dataRequest As WinHttp.WinHttpRequest 
    Dim Json As Object 
    Dim FetchedData As String 

    sUrl = "http://www.bloomberg.com/markets/api/bulk-time-series/price/" & Code & "?timeFrame=1_YEAR" 

    Set dataRequest = New WinHttp.WinHttpRequest 

    With dataRequest 
     .Open "GET", sUrl, True 
     .Send 
     .WaitForResponse 
     FetchedData = .ResponseText 
    End With 

    FetchedData = Right(FetchedData, Len(FetchedData) - 1) 
    FetchedData = Left(FetchedData, Len(FetchedData) - 1) 

    Set Json = JsonConverter.ParseJson(FetchedData) 

    Set ConnectToBloomberg = Json.Item("price") 
End Sub 

Function MEANVALUE(Code As String) As Double 
    Dim pricedata As Object 
    Dim Item As Variant 
    Dim Count As Long 
    Dim YReturn As Double 
    Dim LastPrice As Double 
    Dim Total As Double 

    Set pricedata = ConnectToBloomberg(Code) 

    For Each Item In pricedata 
     Count = Count + 1 
     YReturn = Item("value") - LastPrice 
     LastPrice = Item("value") 
     Total = Total + YReturn 
    Next 
    If Count > 0 Then 
     MEANVALUE = Total/Count 
    Else 
     MEANVALUE = 0 
    End If 
End Function 
+0

よろしくお願いします!ありがとうございました!解決策3を選んだ理由は何ですか? –

+0

@JacobKildetoftHenriksenオプション3は、ConnectToBloombergから返される「もの」が1つしかないときに、コードについて最も直感的な考え方であるように思えます。私の意見では、 'Sub'は何かを行い、' Function'は何かを返します。 – YowE3K

関連する問題