2013-03-05 33 views
0

我想解析文本文件的下面部分,以便將「DVA」下的增量數據作爲我確定的單元格範圍放入列中。我想爲第二列中以S開頭的序列號做同樣的事情,同樣在我確定的範圍內。它們之間有一個|分隔符,我想DAU SNo.-C0是我搜索的字符串。將文本中的數據解析爲excel列

我想:搜索DAU SNo.-C0,然後以某種方式跳過兩行,複製的內容是下到Excel,數據解析成兩列,並確定它應該被放置在小區的範圍

 DAU SNo.-C0 
+-------------------------+ 
|DVA|   0   | 
+-------------------------+ 
| 0 | S1050360701270  | 
| 1 | S1050344701369  | 
| 2 | S1050360701315  | 
| 3 | S1021360701337  | 
| 4 | S1050360701367  | 
| 5 | S1050332701350  | 
| 6 | S1050360701584  | 
+-------------------------+ 

這就是我:更新

Do While i < UBound(strAll) 
     If (InStr(1, strAll(i), "DAU SNo.-C0", vbTextCompare) > 0) Then 
      i = i + 4 'Skip 4 lines to get to first SN 
      Do Until InStr(1, strAll(i), "+", vbTextCompare) > 0 'Loop until line includes "+" 
      strSNO = Split(strAll(i), "|", -1, vbTextCompare) 
      'put strSNO into next cell in column A 
      i = i + 1 
      Loop 
     End If 
    i = i + 1 
    Loop 
    Next 

我試圖把字符串分割到下一個單元格的列的幾種方法,但我不能得到它的工作。除了實際複製值(註釋在代碼中)之外的所有單詞。我通過打印strSNO(1)和strSNO(2)驗證了其餘的工作。

任何方向,解釋或代碼將是有幫助的。

+0

是文本文件的'>'部分?我猜不是,但你必須自己編輯這個問題,以確保我不會破壞任何東西。 – 2013-03-05 16:23:21

+0

不,他們不是。我刪除了它們。謝謝。 – SamSong 2013-03-05 16:44:50

回答

0

當您找到該行時,請使用VBA Split函數,使用|作爲分隔符。它將一個字符串分割成一個數組。

例如:如果你這樣做:

strTest = Split(">| 0 | S1050360701270", "|", -1, vbTextCompare) 

就會出來像strTest(1) = 0strTest(2) = S1050360701270

您可能還想使用strAll = Split(objReadFile.ReadAll, vbCrLf, -1, vbTextCompare)首先將整個文本文件放入VBA中(有時會更快),然後使用整數變量遍歷每行 - 這意味着您可以跳過幾行,找到「 DAU SNo.-C0「字符串,而不必讀取每一個。

======編輯======

嘗試用這樣的替換在代碼中做循環:

Dim strAll() As String, strSNO() As String, i As Integer 
strAll = Split(objReadFile.ReadAll, vbCrLf, -1, vbTextCompare) 'Gets each line from file 
i = LBound(strAll) 
Do While i < UBound(strAll) 
    If (InStr(1, strAll(i), "DAU SNo.-C0", vbTextCompare) > 0) Then 
     i = i + 4 'Skip 4 lines to get to first | 0 | S1050360701270 | line 
     Do Until InStr(1, strAll(i), "+", vbTextCompare) > 0 'Loop until line includes "+" 
      strSNO = Split(strAll(i), "|", -1, vbTextCompare) 
      'This will add them to the next available row in A/B... change as needed 
      Range("A60000").End(xlUp).Offset(1, 0).Value = Trim(strSNO(1)) 
      Range("B60000").End(xlUp).Offset(1, 0).Value = Trim(strSNO(2)) 
      i = i + 1 
     Loop 
    End If 
    i = i + 1 
Loop 
+0

我看了分裂功能。我想要的是一種方法,用它遞歸地爲標識符下面的每一行設置數量,並且不知道表中的任何值。 – SamSong 2013-03-05 18:36:52

+0

這是一段很棒的代碼。不幸的是,它抱怨Dim語句「預計結束語句」。刪除「作爲字符串」和「作爲整數」幫助,但後來我得到一個類型不匹配:'strAll = Split(objReadFile.ReadAll,vbCrLf,-1,vbTextCompare)' – SamSong 2013-03-06 14:30:50

+0

嗯......我看不到爲什麼會發生這種情況 - 嘗試將尺寸標註分隔到不同的行上,以便Dim [strAll()as String]然後'Dim strSNO()as String'。這應該整理類型不匹配 – MattCrum 2013-03-06 16:20:47