Отправить строку массива внутри POST-запроса VBA Excel

#excel #vba #winhttp #winhttprequest

#excel #vba #winhttp #winhttprequest

Вопрос:

Я пытаюсь отправить post-запрос в API, который принимает массив строк в качестве аргумента.

Выдается ошибка, указывающая, что типы не разрешены, и когда запрос отправляется правильно, все данные остаются в первой позиции массива (keyArray[0]).

Код, который я использую, следующий:

 Dim lastRow As Variant
lastRow = Range("B" amp; Rows.Count).End(xlUp).Row

Dim vvArray As Variant
vvArray = Range("B12:B" amp; lastRow).Value

Dim vvArrayString() As String
ReDim vvArrayString(1 To UBound(vvArray))
For i = 1 To UBound(vvArray)
    vvArrayString(i) = vvArray(i, 1)
Next

Dim TCRequestItem As Object
Set TCRequestItem = CreateObject("WinHttp.WinHttpRequest.5.1")
TCRequestItem.Open "POST", "url", False
TCRequestItem.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
TCRequestItem.send ("keyArray="   vvArrayString)
  

Комментарии:

1. Когда вы вводите F8 в код, где он прерывается?

2. Выдает ошибку компиляции, в которой говорится, что типы не разрешены, проблема в последней строке кода TCRequestItem.send ("keyArray=" vvArrayString) .

3. Я пытался это сделать, и это работает, но я думаю, что должен быть другой способ получить его: TCRequestItem.send ("keyArray[0]=" vvArrayString(1) "amp;keyArray[1]=" vvArrayString(2) ...)

4. on error resume next 🙂

Ответ №1:

Я не понимаю, почему вы установили vvArray and then vvArrayString ? Почему бы не перейти прямо к vvArrayString , прокручивая столбец B?

 Dim LastRow as Long 
LastRow = Range("B" amp; Rows.Count).End(xlUp).Row

Dim vvArrayString(1 to LastRow-11)
For i = 12 to LastRow
    vvArrayString(1-11) = Range("B" amp; i).text
Next
  

Это должно правильно настроить массив для вас, затем вы можете перейти к следующему фрагменту кода (http-запросу).

РЕДАКТИРОВАТЬ: http-запрос также может использовать аналогичный цикл, поскольку он имеет такой простой повторяющийся шаблон. Однако для этого вам понадобится отдельная переменная;

 Dim strPostReq as String 'here's your separate variable

For x = 1 to LastRow-11
    'Just add the same pattern to the end of the string each time
    strPostReq = strPostReq amp; "keyArray[" amp; x-1 amp; "]=" amp; vvArrayString(x) amp; "amp;"
Next
'Then remove the last 'amp;' from the string
strPostReq = Left(strPostReq, Len(strPostReq) - 1)
  

Затем вместо длинной предыдущей строки вы просто делаете TCRequestItem.send(strPostReq)

Комментарии:

1. Для следующего фрагмента кода я попытался это сделать, и это сработало TCRequestItem.send ("keyArray[0]=" vvArrayString(1) "amp;keyArray[1]=" vvArrayString(2) ...) , возможно, объявление функции, которая возвращает эту строку, может решить проблему…

2. Похоже, вы могли бы использовать для этого другой цикл? Потерпите, я отредактирую это в своем ответе