Avatar billede Jakie Juniormester
24. september 2017 - 00:00 Der er 7 kommentarer

VBA - Inkludere kode i en function

Hej Eksperter,

Jeg har denne kode:

[code]
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
[/code]

Jeg bruger den første stykke koder i andre funktioner også:
[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")

[/code]
Hvordan kan jeg ligesom fjerne ovenstående kode i funktionen og så inkluderer koden?

Kan man lave den om til en sub og så kalde den i funktionen eller hvorledes?
Avatar billede Jan Hansen Ekspert
24. september 2017 - 08:05 #1
Enten Lav fælles koden i en function for sig selv som sender et eller andet retur til den function du kalder den fra, eller dim dine variable som det allerførste i dit modul og lave en sub der tildeler dine variable data når du kalder den inde fra dine functioner, så kan du bruge variablene senere i functionen.

En 3, løsning er at lave Class modul til at ludføre fælleskoden.

Jan
Avatar billede Dan Elgaard Ekspert
24. september 2017 - 09:12 #2
Det kommer lidt an på, hvor, og, hvordan du har implementeret 'JsonConverter' objektet?
Jeg kan ikke se koden til den???

Og, hvad der det for en 'code' som du giver som argument til funktionen?

Det ser også ud som om du mangler, at erklære flere af dine variabler, bl.a. 'FetchedData' og 'JSON'...
(Tip: Brug 'Option Explicit' for at være sikker på, at du har fået erklæret alle dine variabler, og erklæret dem rigtigt :-)

Skal den kode der implementeres i andre makroer, så skal den vist have en gevaldig 'overhaling' :-)
Avatar billede Jakie Juniormester
24. september 2017 - 10:15 #3
Ja, der mangler helt sikkert at deklareres nogle variable.

Jan Hansen: Ja, jeg har forsøgt med den første løsning, men det går ikke så godt :/
Avatar billede Jan Hansen Ekspert
24. september 2017 - 11:38 #4
Tror du skal lave noget i retning af:


Option Explicit

Function MEANVALUE(Code As String) As Double
Dim MyPriceData As Object
Dim Item As Variant, LastPrice As Double, yRerurn As Double, Total As Double
Dim lCount As Long

MyPriceData = PriceData(Code)

For Each Item In PriceData
   
    lCount = lCount + 1
   
    YReturn = Item("value") - LastPrice
   
    LastPrice = Item("value")
   
    Total = Total + YReturn
   
Next

MEANVALUE = Total / Count
End Function


Function PriceData(Code As String) As Object
'----------------------------------------
Dim sUrl As String
Dim dataRequest As WinHttp.WinHttpRequest
Dim FetchedData As String
Dim Json As Variant
'----------------------------------------
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 = Mid(FetchedData, 2, Len(FetchedData) - 2)

Set Json = JsonConverter.ParseJson(FetchedData)

Set PriceData = Json.Item("price")
End Function


nogle af variablene kan være af forkert type, så tjek
Ej testet

Jan
Avatar billede Jan Hansen Ekspert
24. september 2017 - 11:39 #5
Ups ret
For Each Item In PriceData
til
For Each Item In MyPriceData
Avatar billede Jakie Juniormester
24. september 2017 - 19:08 #6
Mange tak for svaret!

Hvordan får jeg første værdi af Item("value") ?
Avatar billede Jan Hansen Ekspert
24. september 2017 - 22:32 #7

Function MEANVALUE(Code As String) As Double
Dim MyPriceData As Object
Dim Item As Variant, LastPrice As Double, yRerurn As Double, Total As Double
Dim lCount As Long
dim MyItem as Double

MyPriceData = PriceData(Code)

For Each Item In PriceData
   
    lCount = lCount + 1
   
    YReturn = Item("value") - LastPrice
   
    LastPrice = Item("value")
   
    Total = Total + YReturn
    If lCount=1 then MyItem=  Item("value")
   
Next

'MEANVALUE = Total / Count
MEANVALUE =Myitem

End Function

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester