Hur gör jag för att lättast hämta enskild data från en sträng som denna... Det finns flera olika sätt !! Ett är. jojo... men det förutsätter att värdena i stängen alltid är dem samma.... Under förutsättning att inget av orden "passar in i" varandra, så kan du använda dig av InStr för att söka upp dina "taggar". <BR> Kommer med en mer generell lösning: Mycket bättre än min lösning, Andreas. :-) Såhär ungefär?Hämta ut ur en sträng....
string = "&ver=1423&acct=23465782663&amm=12.00&validthr=0202"
'vill få ut det som typ
ver = string(ver)
acct = string(acct)
amm = string(amm)
validthr = string(validthr)
Sv: Hämta ut ur en sträng....
St=Mid$(string,1,3) Satsen skall tolkas så här. Skicka tillbaka tre tecken, med start från det första tecknet, från stängen string. Sedan får du själv räkna fram vilka tecken som skall plockas ut.
MVH PeterSv: Hämta ut ur en sträng....
i mitt fall så varierar dem...Sv: Hämta ut ur en sträng....
Ett förslag på loop: <BR>
<code>
Sub FindTags()
Dim strString As String, strVer As String, strAcct As String
Dim strAmm As String, strValidthr As String, strTag As String
Dim intPos As Integer, intLen As Integer, strValue As String
strString = "&ver=1423&acct=23465782663&amm=12.00&validthr=0202"
intPos = 1 ' Sätt startposition
Do
' hitta förekomst av & som är avskiljaren
If IsNull(InStr(intPos, strString, "&")) Then
' finns inga fler förekomster
MsgBox "Klart"
Exit Do
ElseIf InStr(intPos, strString, "&") < intPos Then
' loopen har gått runt
MsgBox "Loopen har gått runt. Avbryter."
Exit Do
Else
' kör nästa
intPos = InStr(intPos, strString, "&") + 1
End If
' läs in nästa "tagnamn"
intLen = InStr(intPos, strString, "=") - intPos
strTag = Mid$(strString, intPos, intLen)
intPos = intPos + intLen + 1
intLen = InStr(intPos, strString, "&") - intPos
' Vid sista förekomsten finns inget "&"
If intLen < 0 Then intLen = Len(strString) - intPos + 1
strValue = Mid$(strString, intPos, intLen)
Select Case strTag
Case "ver"
strVer = strValue
Case "acct"
strAcct = strValue
Case "amm"
strAmm = strValue
Case "validthr"
strValidthr = strValue
Case Else
MsgBox "Taggnamnet " & strTag & " saknas!"
End Select
Loop While intPos > 0 And intPos < Len(strString)
End Sub
</code>
<BR>
Finns säkert bättre sätt att skriva det på, men ett förslag i alla fall. Jag skyller på att jag inte har VB framför mig och att jag är trött som en gnu ... :-) <BR>
Lycka till. <BR>
Mvh <BR>
/EESv: Hämta ut ur en sträng....
<code>
Public Function Test()
Dim ver As String
Dim acct As String
Dim amm As String
Dim validthr As String
Dim Text As String
Dim Data() As String
Dim Index As Long
Text = "&ver=1423&acct=23465782663&amm=12.00&validthr=0202"
Data = SplitValues(Text)
For Index = 0 To UBound(Data, 2)
Select Case Data(0, Index)
Case "ver"
ver = Data(1, Index)
Case "acct"
acct = Data(1, Index)
Case "amm"
amm = Data(1, Index)
Case "validthr"
validthr = Data(1, Index)
End Select
Next
Debug.Print "ver: " & ver
Debug.Print "acct: " & acct
Debug.Print "amm: " & amm
Debug.Print "validthr: " & validthr
End Function
Public Function SplitValues(Text As String, Optional ParameterDelimeter As String = "&", Optional ValueDelimeter As String = "=", Optional Compare As VbCompareMethod = vbBinaryCompare) As String()
Dim Index As Long
Dim Data() As String
Dim Values() As String
Dim Parameters() As String
Parameters() = Split(Text, ParameterDelimeter, , Compare)
ReDim Data(0 To 1, 0 To UBound(Parameters))
For Index = 0 To UBound(Parameters)
Values = Split(Parameters(Index), ValueDelimeter, 2, Compare)
Select Case UBound(Values)
Case 0
Data(0, Index) = Values(0)
Case 1
Data(0, Index) = Values(0)
Data(1, Index) = Values(1)
End Select
Next
SplitValues = Data
End Function
</code>Sv: Hämta ut ur en sträng....
En liten detalj bara, särskilt som du gör lösningen mer generell: kan vara bra att ha någon form av hantering av de "taggar" som inte faller inom de fördefinierade namnet. En lösning kan vara att lagra dem i en matris eller listruta för att sedan kunna lägga till hantering av även dessa senare.
Mvh
/EESv: Hämta ut ur en sträng....
<code>
Function getstring(strSearch As String, st As String)
Set RegEx = New RegExp
RegEx.Pattern = "[^&]+"
RegEx.IgnoreCase = False
RegEx.Global = True
Set Matches = RegEx.Execute(st)
For Each match In Matches
If Mid(match, 1, InStr(match, "=") - 1) = strSearch Then
getstring = Mid(match, InStr(match, "=") + 1)
Exit Function
End If
Next
Set RegEx = Nothing
End Function
Private Sub Command1_Click()
Call MsgBox(getstring("amm", "&ver=1423&acct=23465782663&amm=12.00&validthr=0202"))
End Sub
</code>
Du behöver sätta en referens till Microsoft VBScript Regular Expressions.
<br><br>
/Ivar