Добрый день, форумчане. На досуге решил разобраться в POST-запросах. Объектом изучения выбрал сайт http://en.excel-translator.de/, который переводит между разными языковыми версиями формул. Вот, что есть на данный момент: 1) URLencoder (взят с просторов сети - в работоспособности не возникает сомнений):
Код
Private Function URLEncode( _
StringVal As String, _
Optional SpaceAsPlus As Boolean = False _
) As String
Dim StringLen As Long: StringLen = Len(StringVal)
If StringLen > 0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String
If SpaceAsPlus Then Space = "+" Else Space = "%20"
For i = 1 To StringLen
Char = Mid$(StringVal, i, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
result(i) = Char
Case 32
result(i) = Space
Case 0 To 15
result(i) = "%0" & Hex(CharCode)
Case Else
result(i) = "%" & Hex(CharCode)
End Select
Next i
URLEncode = Join(result, "")
End If
End Function
2) Есть следующая рутина для запроса:
Код
Const val$ = "LC=DATE_TO_REPLACE=none&LK=&LG=EN&SO=0&FT=1&XL=excel.2010.sp1&SF=FORMULA_TO_REPLACE&SL=EN&TL=RU&PC=1&PAC=2&PAI=2&TF=&Submit=Translate+formula"
Sub foo()
Dim xhr As MSXML2.ServerXMLHTTP
Dim url$
Dim ParamVar$
Dim ExcelFormula$
ExcelFormula = "=SUMPRODUCT(--(A1:A100=""x""))"
url = "http://app.excel-translator.de/index.php"
ParamVar = Replace(val, "FORMULA_TO_REPLACE", URLEncode(ExcelFormula))
ParamVar = Replace(ParamVar, "DATE_TO_REPLACE", Format(Date, "yyyymmdd"))
Set xhr = New MSXML2.ServerXMLHTTP
xhr.Open "POST", url, False
'xhr.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2327.5 Safari/537.36"
'xhr.setRequestHeader "Referer", "http://app.excel-translator.de/index.php"
'xhr.setRequestHeader "Origin", "http://app.excel-translator.de"
'xhr.setRequestHeader "Cookie", "_ga=GA1.2.19748086509.1426328693"
xhr.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xhr.send (ParamVar)
ActiveCell = xhr.responseText
MsgBox xhr.responseText Like "*СУММ*" 'Здесь должно быть значение "True", а получается False
End Sub
3) В Python 3.4 (а значит и в Open Office) аналогичное делается на порядок легче (там то все сходится) вот так:
Код
import requests
dic = {'LC':'20150314', 'LU':'none', 'LK':'', 'LG':'EN', 'SO':'0', 'FT':'1', 'XL':'excel.2010.sp1', 'SF':'=SUMPRODUCT(--(A1:A100="x"))', 'SL':'EN', 'TL':'RU', 'PC':'1', 'PAC':'2', 'PAI':'2', 'TF':''}
r = requests.post("http://app.excel-translator.de/index.php",dic)
"СУММ" in r.text #проверяет то же что и msgbox в рутине 2
Наверное, я что-то упускаю. Может быть, чего-то в VBA не знаю. Поможете сделать перевод формулы с английского на русский? Это и мне хорошо, и, думаю, многим полезно. ПС В выработке решения использовал Chrome DevTools/Fiddler.
Если я добавляю в LK параметр значение со страницы,то работает <input type="hidden" name="LK" value="9UMTFLP7VLEG0F0NUBZDDRR1VDCT82ODKXMD9EEBAKNKQTEZN5RJOXODLS7VG5WT4PTUHVJQBE2EA3LFUARR">
Почему-то изначально думал, что Doober ответит. Так и получилось. По поводу предложения: интересно. Попробую. Другой вопрос, получится ли сделать функцию, которая бы работала на регулярной основе. Складывается ощущение, что значение для LK может меняться время от времени.
Только сейчас обнаружил,когда именно ваш код пробовал. Вы упустили в константе Const val$ = "LC=DATE_TO_REPLACE=none LU Const val$ = "LC=DATE_TO_REPLACE& LU=none Можно и без "LK" обойтись При отправке параметров в запросе не должно быть никаких явных переменных типа String. UDF в ячейке