Excel VBA:动态变量名称

时间:2014-04-24 08:53:11

标签: php excel vba variables excel-vba

注意:我仅限于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输出字符串时定义VARIABLES。这可能在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 个答案:

答案 0 :(得分: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序列,那就好了。

答案 1 :(得分:0)

我不确定这是否可以帮助您,但据我了解您的问题,您希望能够根据查询字符串参数动态创建变量。如果是这样,那么这里是如何动态添加这些变量的示例。代码需要标准模块,名称为“QueryStringVariables”。在此模块中,将解析查询字符串,并将每个查询字符串参数添加为get-property。如果您希望能够更改该值,那么您还需要添加let-property。

enter image description here

  

添加对Microsoft Visual Basic for Applications Extensibility的引用

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