2014-10-11 3 views
1

Этот сайт был настоящим сундуком с сокровищами ответов и идей для многих моих проблем с vba в прошлом, но я не смог найти ни одного, что я уверен для многих, если не большинство, вот в этом форуме простая задача. Мне приходится иметь дело с большим количеством файлов отчетов xml, у всех есть строка заголовка, и моя проблема заключается в том, как разбирать строку для нужного я требую для моего макроса. Это пример строки:извлечение из строки без разделителей excel

<Function IDREF="TST_RxRccsMatrix_Rx64" Start="2011-04-07T14:21:35.593000+02:00" Status="Success" Tags="SystemSerialNumber:41009" End="2011-04-07T14:29:16.625000+02:00"> 

Мне нужно извлечь - тип отчета: TST_RxRccsMatrix (длина этой строки не является постоянным) - начало отметки времени и даты: 2011-04-07T14: 21 : 35.593000 + 02: 00 (длина постоянна) - серийный номер: 41009 (длина постоянна)

Я пробовал методы, используя Split и InStr, а Find, но ни один не дает желаемых результатов для всех трех выделений.

Я по-настоящему ценю любую помощь по этому поводу!

ответ

0

Старый способ моды - использовать instr для начала. Затем используйте instr, чтобы найти окончание. Затем используйте середину, чтобы высушить ее.

Begin = instr(1,xmlstring,"IDREF=") + Len("IDREF") 
'look for first space after IDREF= in string 
End = instr(Begin, xmlstring, " ") 
Report = mid(xmlstring, begin, end - begin) 

Я не тестировал его.

Но я раскололся на пространство, а затем перешел через массив, разбивающийся на =. Это даст вам массив из 2 массивов элементов со значением name в (0) и значением в (1).

Но xml имеет собственный язык запросов и библиотеки для доступа к материалам.

Это код расщепления командной строки, а затем разделив 320x200 в 300 и 200.

CmdLine = Command() 

A = Split(CmdLine, Chr(32), 2, 1) 
B = Split(A(0), "x", 2, 1) 
+0

Спасибо Oded, он работал как шарм !!!!!!!!!!!! Это окончательный результат: Sub Extract() Dim X (от 0 до 2) As String, Y (от 0 до 2) As String, FileType, DT, SN As Variant, B, E As Variant X (0) = " IDREF = ": X (1) =" Start = ": X (2) =" Tags = " Для i = LBound (X(), 1) To UBound (X(), 1) B = InStr (1 , Диапазон («A6»). Значение, X (i)) + Len (X (i)) + 1 E = InStr (B, Диапазон («A6»). Значение, «») - 1 Y (i) = Средний (диапазон («A6»). Значение, B, E - B) Следующий [D1] = "Test =" & Y (0): [D2] = "Проверено на:" и влево (Y (1), 10) & "at" & Mid (Y (1), 12, 8): [D2] = [D2] & "-" & Y (2) End Sub – Dan

+0

И после некоторой полировки: – Dan

0

После некоторой полировки:

Private Sub GetFileInfo() 
Dim fso As New FileSystemObject, strText As Variant, i As Integer 
Dim X(0 To 2) As String, Y(0 To 2) As String, B, E As Variant 
'get header string from xml file 
'FName (file name) was ascertained by a previous sub and is made public 
Set strText = fso.OpenTextFile(FName, ForReading, False) 
'header string is in second (i = 2) line of file 
For i = 1 To 2: [A1] = strText.ReadLine: Next: strText.Close: Set fso = Nothing 
'User Oded's search and extract routine 
X(0) = "IDREF=": X(1) = "Start=": X(2) = "Tags=" 
For i = LBound(X(), 1) To UBound(X(), 1) 
    B = InStr(1, [A1], X(i)) + Len(X(i)) + 1 ' + 1 includes trailing " character 
    E = InStr(B, [A1], " ") - 1 ' - 1 includes leading " character 
'required if a search string in X() is at the end of the header which ends with a ">" 
    If (InStr(B, [A1], " ") - 1) < 0 Then E = InStr(B, [A1], ">") 
    Y(i) = Mid([A1], B, E - B) 
Next 
[D1] = "Test = " & Y(0) 
[D2] = "Tested on : " & Left(Y(1), 10) & " at " & Mid(Y(1), 12, 8) 
[D2] = [D2] & " - " & Y(2) 
End Sub 
0
xmlstring = "<Function IDREF=""TST_RxRccsMatrix_Rx64"" Start=""2011-04-07T14:21:35.593000+02:00"" Status=""Success"" Tags=""SystemSerialNumber:41009"" End=""2011-04-07T14:29:16.625000+02:00"">" 
Set regEx = New RegExp 
regEx.Pattern = "IDREF=""([a-z0-9_]+)""" 
regEx.IgnoreCase = True 
regEx.Global = True 
Set Matches = regEx.Execute(xmlstring) 
If Matches.count <> 1 then msgbox "no match or too many" 
For Each Match in Matches 
    Msgbox match.submatches(0) 
Next 

Я ответил на ваши Qustions. Другой человек удалил два простых способа сделать это.

Задать вопрос Одеду, чтобы вернуть мое объяснение этого кода. И восстановить учебник MS о том, как это сделать с объектами XML DOM. Я показал четыре способа.

+0

Вы должны подробнее расскажите о том, как работает этот код. Это облегчает для большего количества людей, которые приходят в Stack Overflow, чтобы быстро понять ваш ответ и решить их проблему. – JKor

Смежные вопросы