2017-05-31 129 views
0

我想用VBA代碼分析字符串。 我讀到一個String,它看起來像這樣:用VBA操縱字符串

myStringInput = "FRAG_INST = someValue,DR = otherValue, FRAG = anotherValue" 

而且在我的代碼,我想一些變量根據字符串中讀出的值聯繫起來,我想初始化我的變量這樣的:

Dim dr, frag, fraginst As String 

fraginst = someValue 
dr = otherValue 
frag = anotherValue 

我已經嘗試過修剪/拆分/ InStr組合,但我總是以錯誤的值結束。 我不能只用「中」功能,因爲該值的長度改變玉米從一個執行到另一個...

更清晰,我需要設計功能,這樣

fraginst = NiceFunction("FRAG_INST",myStringInput) 

,它會返回「someValue」

有沒有簡單的方法來做我想要的?

感謝

回答

2

此解決方案工作正常。可能是你可以試試這個。儘管我沒有使用任何正則表達式。

方法: 我首先通過分隔符(逗號)分割字符串。穿過每個數組元素並按'='分隔每個元素。將值與'='左側的字符串進行比較,並在修剪後將值返回到'='的右側。 需要Mid功能。

myStringInput = "FRAG_INST = someValue,DR = otherValue, FRAG = anotherValue" 
fraginst = NiceFunction("FRAG_INST",myStringInput) 
MsgBox fraginst 

Function NiceFunction(str1, str2) 
    tempArr1 = Split(str2,",") 
    For i=0 To UBound(tempArr1) 
     tempArr2 = Split(tempArr1(i),"=") 
     If StrComp(Trim(tempArr2(0)),str1,1)=0 Then 
      NiceFunction = Trim(tempArr2(1)) 
      Exit For 
     End If 
    Next 
End Function 
+0

它的工作對我很好,謝謝 – LostReality

+0

快樂幫:) – Gurman

1

而是堅持「單」變量(DR,...),這將需要在運行時動態創建的變量,你應該使用一個dictionary

Option Explicit 

Function s2d(s) 
    If IsEmpty(gR) Then 
    Set gR = New RegExp 
    gR.Global = True 
    gR.Pattern = "(\w+)\s?=\s?(\w+)" 
    End If 
    Set s2d = CreateObject("Scripting.Dictionary") 
    Dim m 
    For Each m In gR.Execute(s) 
     If s2d.Exists(m.SubMatches(0)) Then 
     ' Error: dup key 
     Else 
     s2d.Add m.SubMatches(0), m.SubMatches(1) 
     End If 
    Next 
End Function 

Function qq(s) 
    qq = """" & s & """" 
End Function 

Dim gR ' "static" in s2d() 
Dim s : s = "FRAG_INST = someValue,DR = otherValue, FRAG = anotherValue" 
If 0 < WScript.Arguments.Count Then s = WScript.Arguments(0) 
Dim d : Set d = s2d(s) 
Dim k 
For Each k In d.Keys() 
    WScript.Echo qq(k), "=>", qq(d(k)) 
Next 
If d.Exists("DR") Then WScript.Echo "DR:", d("DR") ' access 'single' var 

輸出:

cscript 44282497.vbs 
"FRAG_INST" => "someValue" 
"DR" => "otherValue" 
"FRAG" => "anotherValue" 
DR: otherValue 

PS

我使用了RegExp,因爲變量名稱必須是'words'/ match「\ w +」和您的樣本數據值dito,而分隔符看起來像是一個混亂/創造性地使用空格。有關如何在VBA中使用RegExps,請參見here

1
Function NiceFunction(varName, inputString) 
Dim match 
    With CreateObject("VBScript.RegExp") 
     .IgnoreCase = True 
     .Global = False 
     .Pattern = "(?:^|,)\s*" & varName & "\s*=\s*([^,]*)" 
     For Each match in .Execute(inputString) 
      NiceFunction = match.subMatches.Item(0) 
     Next 
    End With 
End Function 

您可以使用一個RegExp對象來提取您需要的字符串部分。

+0

感謝您的幫助,我根本沒想用正則表達式 – LostReality