#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. Похоже, вы могли бы использовать для этого другой цикл? Потерпите, я отредактирую это в своем ответе