簡體   English   中英

Excel VBA:動態變量名稱

[英]Excel VBA: Dynamic Variable Name

注意:我僅限於 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

顯然,我可以將這些值放入一個數組中,並引用它,但是我特別想知道這是否可能,以便靈活地處理已經存在的腳本。

我希望這是有道理的,非常感謝我得到的任何答復。

謝謝你。

您可以使用集合:

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 序列也沒關系...

我不確定這是否可以幫助您,但據我了解您的問題,您希望能夠根據查詢字符串參數動態創建變量。 如果是這樣,那么這里是如何動態添加此變量的示例。 代碼需要名為“QueryStringVariables”的標准模塊。 在此模塊中,將解析查詢字符串,並將每個查詢字符串參數添加為 get-property。 如果您也希望能夠更改該值,那么您還需要添加 let-property。

在此處輸入圖片說明

添加對 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM