Примечание: я ограничен PHP <-> VBA. Пожалуйста, не предлагайте ничего, для чего требуется надстройка Excel или какой-либо другой язык / метод.

У меня есть функция, которая подключается к указанному URL-адресу, отправляет данные, а затем извлекает другие данные. Это прекрасно работает. Я пытаюсь написать его, чтобы использовать его как общую функцию, которую я могу использовать для подключения к любому файлу, к которому мне нужно подключиться - каждый будет возвращать разные данные (одни могут быть пользовательскими данными, другие могут быть сложными вычислениями и т. Д.).

Когда он извлекает данные из PHP, есть ли способ динамически устанавливать переменные на основе того, что было получено, даже если я не знаю, что было получено.

Я могу заставить PHP возвращать VBA строку в любом формате, поэтому я использую в качестве примера следующее:

Строка, полученная в vba:

myValue1=Dave&someOtherValue=Hockey&HockeyDate=Yesterday

Если бы я проанализировал это в PHP, я мог бы сделать что-то подобное (неточно, просто написано для примера);

$myData = "myValue1=Dave&someOtherValue=Hockey&HockeyDate=Yesterday"
$myArr = explode("&",$myData)
foreach($myArr as $key => $value){
    ${$key} = $value;
}
echo $someOtherValue; //Would output to the screen 'Hockey';

Я хотел бы сделать что-то подобное в VBA. Строка, которую я получаю, получена из файла PHP, поэтому я могу отформатировать ее любым способом (json и т. Д.), Я просто хочу иметь возможность определять ПЕРЕМЕННЫЕ при выводе строки из PHP. Возможно ли это в VBA ?.

Текущее состояние функции, которая отлично работает с подключениями, показано ниже: -

Function kick_connect(url As String, formdata)

'On Error GoTo connectError
Dim http
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", url, False
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

http.send (formdata)
kick_connect = http.responseText
Exit Function

connectError:
kick_connect = False

End Function

В конце концов, я хочу иметь возможность делать что-то вроде

sub mySub
    myData = "getId=" & Range("A1").Value
    myValue = kick_connect("http://path-to-my-php-file.php",myData)
    if myValue = False then
        'Handle connection error here
        exit sub
    end if

    'do something snazzy here to split "myValue" string (eg "myValue1=Dave&someOtherValue=Hockey&HockeyDate=Yesterday") into own variables

    msgbox(myValue1) 'Should output "Dave"


end sub

Очевидно, я мог бы поместить значения в массив и сослаться на него, однако я специально хочу знать, возможно ли именно это, чтобы обеспечить гибкость с уже существующими сценариями.

Я надеюсь, что это имеет смысл, и очень благодарен за любые ответы, которые я получаю.

Спасибо.

2
user3205578 24 Апр 2014 в 12:53

2 ответа

Лучший ответ

Вы можете использовать Коллекцию:

Dim Tmp As String
Dim s As String
Dim i As Integer
Dim colVariabili As New Collection

Tmp = "myValue1=Dave&someOtherValue=Hockey&HockeyDate=Yesterday"

Dim FieldStr() As String
Dim FieldSplitStr() As String
FieldStr = Split(Tmp, "&")

For Each xx In FieldStr
    FieldSplitStr = Split(xx, "=")
    colVariabili.Add FieldSplitStr(1), FieldSplitStr(0)
Next

Debug.Print colVariabili("myValue1")
Debug.Print colVariabili("someOtherValue")
Debug.Print colVariabili("HockeyDate")

Ничего страшного, если у вас нет правильной последовательности var ...

2
user3514930 24 Апр 2014 в 10:33

Я не уверен, может ли это помочь вам, но, насколько я понимаю ваш вопрос, вы хотите иметь возможность динамически создавать переменные на основе параметров строки запроса. Если да, то вот пример динамического добавления этих переменных. Коду нужен стандартный модуль с именем QueryStringVariables. В этом модуле строка запроса будет проанализирована, и каждый параметр строки запроса будет добавлен как свойство get. Если вы хотите иметь возможность изменить значение, вам также нужно будет добавить let-property.

enter image description here

Добавить ссылку на Microsoft Visual Basic для расширения приложений

Option Explicit

Private Const SourceQueryString As String = "myValue1=Dave&someOtherValue=Hockey&HockeyDate=Yesterday"

Sub Test()
    
    Dim queryStringVariablesComponent As VBIDE.vbComponent
    Dim queryStringVariablesModule As VBIDE.CodeModule
    Dim codeText As String
    Dim lineNum As Long: lineNum = 1
    Dim lineCount As Long
    
    Set queryStringVariablesComponent = ThisWorkbook.VBProject.VBComponents("QueryStringVariables")
    Set queryStringVariablesModule = queryStringVariablesComponent.CodeModule
    queryStringVariablesModule.DeleteLines 1, queryStringVariablesModule.CountOfLines
    
    Dim parts
    parts = Split(SourceQueryString, "&")

    Dim part, variableName, variableValue
    For Each part In parts
        variableName = Split(part, "=")(0)
        variableValue = Split(part, "=")(1)
        
        codeText = "Public Property Get " & variableName & "() As String"
        queryStringVariablesModule.InsertLines lineNum, codeText
        lineNum = lineNum + 1
        
        codeText = variableName & " = """ & variableValue & ""
        queryStringVariablesModule.InsertLines lineNum, codeText
        lineNum = lineNum + 1
        
        codeText = "End Property"
        queryStringVariablesModule.InsertLines lineNum, codeText
        lineNum = lineNum + 1
        
    Next
    
    DisplayIt
End Sub

Sub DisplayIt()
    MsgBox myValue1 'Should output "Dave"
End Sub
0
Community 20 Июн 2020 в 09:12