2017-09-17 13 views
0
URL = "https://xxxx.xxxxxxxxxx.com/api/getPrice.php" 
    objHTTP.Open "POST", URL, False 
    objHTTP.setRequestHeader "Content-type", "application/json" 
    objHTTP.send JSONStringSend 
    result = objHTTP.responseText  
    Set Json = JsonConverter.ParseJson(result) 
    methodcount = Json("shipping").Count 

上記は、応答を取得するコードです。Excel VBA jsonペアのリストから最小値を見つけるにはどうすればよいですか?

以下は私が得た結果です。

{ 
       "shipping":[ 
      { 
      "name":"Speedpost via Singapore Post", 
      "price":27.6, 
      "delivery":"15-25 days" 
      }, 
      { 
      "name":"Registered Airmail via Swiss Post", 
      "price":5.89, 
      "delivery":"10 - 25 Days delivery" 
      }, 
      { 
      "name":"Unregistered Airmail via Singapore Post", 
      "price":2.27, 
      "delivery":"12 - 45 Days delivery" 
      }, 
      { 
      "name":"Registered Airmail via SF ", 
      "price":4.36, 
      "delivery":"10 - 15 business Days delivery" 
      }, 
      { 
      "name":"HK DHL", 
      "price":37.09, 
      "delivery":"4 - 7 Days delivery" 
      } 
      ] 
} 

API呼び出しによって出荷メソッドのリストをhttpオブジェクトとして取得しました。私は最も安価な方法を選択し、価格だけをセルに書きたいと思っています。

すべてのキーと値のペアから最小値を見つけるにはどうすればよいですか?

+0

JSONデータが壊れています。最低限、 '}'がありません。 – Jeeped

+0

ok、editted。ありがとう。 – user3394010

+0

JSONデータがどこから来るのか、どこに格納されているのかはまだ不明です。それはxmlhttp経由で取得され、?responseTextにありますか?それはTXTファイルにありますか?それは他の割り当てられたメモリにありますか?データを読み込んで解析する場合は、そのデータがどこにあるのかを知ることが大変です。 – Jeeped

答えて

0

ここのコメントで説明

Set Json = JsonConverter.ParseJson(result) 
Set shipping = Json("shipping") 
methodcount = shipping.Count 
targetCell.Value=getMinPrice(shipping) 'Display the min Price in the cell you want. 

そして、これはJSON APIのソリューション・ベースではありません

Public Function getMinPrice(shipping as Variant)As Double 'Variant is nothing but a convenient VBA way to specify that the shipping argument could be of any type. 
    getMinPrice=10000000.0  ' Set initial minPrice 
            'Iterate through each record in shipping list. For each loop rec is assigned the new set of price list record. The loop is run till all records are exhausted. 
    For Each rec In shipping  'rec is nothing but a variable like i=0, So you can replace rec here and in the following statements with whatever you like 
            'You could avoid using 'Val' function here, I put it as a precautionary measure 
     If getMinPrice > Val(rec("price")) Then 'Check if new price is less the minimum we already have 
      getMinPrice = Val(rec("price"))  'Set the new minimum Price. 
     End If 
    Next 
End Function 
+0

@ user3394010解決策はあなたのために働くのですか、同じことについてもっと説明が必要な場合はお知らせください。 – kaza

+0

はい、あなたのコードが動作します。私はセルに2.27を持っています。どうもありがとう。もっと説明できますか?私はVariantを使用することに慣れていません。 – user3394010

+0

私は 'Variant'と' rec'について説明するためにいくつかのコメントを書いています。 – kaza

0

最低価格を取得するための機能です参照してください。 これを参照してください(あなたのデータがすべて上記の内容である場合)。

Sub test() 
    Dim s As String 
    s = Range("a1") '<~~ if your json text in range("a1") else enter json instead 
    's = json.text 
    JsonToArray Range("b1"), s, "price" 
    JsonToArray Range("c1"), s, "name" 
    JsonToArray Range("d1"), s, "delivery" 
    JsonToArrayMin Range("a4"), s, "price" 
End Sub 
Sub test2() 
    Dim s As String 
    s = Range("a1") '<~~ if your json text in range("a1") else enter json instead 
    JsonToArrayMin Range("a4"), s, "price" 
End Sub 
Sub JsonToArray(rng As Range, Json As String, Item As String) 
    Dim vR() As Variant, vSplit, v 
    Dim n As Long, i As Long 
    Item = Item & Chr(34) & ":" 
    vSplit = Split(Json, Item) 
    For i = 1 To UBound(vSplit) 
     v = vSplit(i) 
     n = n + 1 
     ReDim Preserve vR(1 To n) 
     vR(n) = Split(v, ",")(0) 
     vR(n) = Replace(vR(n), Chr(34), "") 
     vR(n) = Replace(vR(n), ":", "") 
     vR(n) = Replace(vR(n), "}", "") 
     vR(n) = Replace(vR(n), "]", "") 

    Next i 
    If n > 0 Then 
     rng.Resize(n) = WorksheetFunction.Transpose(vR) 
    End If 
End Sub 

Sub JsonToArrayMin(rng As Range, Json As String, Item As String) 
    Dim vR() As Variant, vSplit, v 
    Dim n As Long, i As Long 
    Item = Item & Chr(34) & ":" 
    vSplit = Split(Json, Item) 
    For i = 1 To UBound(vSplit) 
     v = vSplit(i) 
     n = n + 1 
     ReDim Preserve vR(1 To n) 
     vR(n) = Split(v, ",")(0) 
     vR(n) = Replace(vR(n), Chr(34), "") 
     vR(n) = Replace(vR(n), ":", "") 
     vR(n) = Replace(vR(n), "}", "") 
     vR(n) = Replace(vR(n), "]", "") 
     vR(n) = Val(vR(n)) 
    Next i 
    If n > 0 Then 
     rng = WorksheetFunction.Min(vR) 
    End If 
End Sub 
+0

私はすぐにあなたのコードを試して、それが動作するかどうか教えてくれます。とにかくありがとう。 – user3394010

+0

はい、あなたのコードが動作します。私はそれらのすべてを完全に理解していませんが。私は時間があるときにそれらを学ぼうとします。ありがとう。 – user3394010

関連する問題