Board logo

標題: [發問] VBA TXT 依照段落開啟需求 [打印本頁]

作者: Jason80Lo    時間: 2015-10-27 23:43     標題: VBA TXT 依照段落開啟需求

原TXT開啟後只能依照檔案內TXT檔一次開啟,如第3列所產生的結果
目前需求:&、%、$ 為各一個段落,段落格數為固定的,檔案開啟後依照個段落的特別符號去分類,如第4列所產生的結果
[attach]22258[/attach]

請各位高手幫忙,拜託

[attach]22257[/attach]
作者: 准提部林    時間: 2015-10-28 11:03

Sub TEST()
Dim xPath$, xF$, xS As Worksheet, xEnd As Range, xR As Range, TT, T, N$, C%
xPath = ThisWorkbook.Path & "\"
Set xS = ThisWorkbook.Sheets("工作表1")
Do
 If xF = "" Then xF = Dir(xPath & "*.txt") Else xF = Dir
 If xF = "" Then Exit Do
 If Not xS.[A:A].Find(xF, LookAT:=xlWhole) Is Nothing Then GoTo 101
 Set xEnd = xS.Cells(Rows.Count, 1).End(xlUp)(2)
 If xEnd.Row < 3 Then Set xEnd = xS.[A3]
 xEnd = xF
 
 Open xPath & xF For Input Access Read As #1
 Do Until EOF(1)
  Line Input #1, T
  N = Switch(T = "&", "B", T = "%", "M", T = "$", "AC", T = T, "")
  '_T="&",取B欄,類推∼∼;找不到"&%$",N為空值 
  If N <> "" Then Set xR = xEnd(1, N):  C = 0
  '_找到"&%$"後,以xR定位為各分類的首格
  For Each TT In Split(T, " ")
    C = C + 1:  xR(1, C) = TT
  Next
 Loop
 Close #1
101: Loop
End Sub
 
 
大致如上,其他細節請自行更改或調整∼∼
作者: 准提部林    時間: 2015-10-28 11:21

本帖最後由 准提部林 於 2015-10-28 11:25 編輯

N = Switch(T = "&", "B", T = "%", "M", T = "$", "AC", T = T, "")
也可用:
N = Array("", "", "B", "M", "AC")(InStr("_&%$", T))
_InStr 值只有0,1,2,3,4 五種結果 

"_&%$" 前面加"_",是為防止T是空格時的誤判(與FIND函數一樣,結果為1)
可測試 MsgBox InStr("&%$", "")

Array 前面兩個空字符,即是在T為空值(InStr值為1)或找不到文字時(InStr值為0),以空字符顯示
作者: Jason80Lo    時間: 2015-10-29 17:14

回復 3# 准提部林

感謝 准大 果然厲害
但請問
If Not xS.[A:A].Find(xF, LookAT:=xlWhole) Is Nothing Then GoTo 101
 Set xEnd = xS.Cells(Rows.Count, 1).End(xlUp)(2)
 If xEnd.Row < 3 Then Set xEnd = xS.[A3]
 xEnd = xF
- - - - - -
For Each TT In Split(T, " ")
    C = C + 1:  xR(1, C) = TT
  Next
個別是什麼意思? 使用說明看不太懂
能請准大為小弟稍微解釋一下嗎 謝謝
作者: 准提部林    時間: 2015-10-29 18:02

回復 4# Jason80Lo

If Not xS.[A:A].Find(xF, LookAT:=xlWhole) Is Nothing Then GoTo 101
_如果文字檔名稱已存在,略過 

Set xEnd = xS.Cells(Rows.Count, 1).End(xlUp)(2)
_取得準備填入資料的位置(最後一筆資料的下一格空白格) 

If xEnd.Row < 3 Then Set xEnd = xS.[A3]
_如果這空白格列號小于3,則取A3(防止標題無文字的錯誤) 

xEnd = xF
_第一格填文字檔名 

For Each TT In Split(T, " ")
  C = C + 1:  xR(1, C) = TT
Next
_以空白格剖析文字,再向右逐一填入 
作者: Jason80Lo    時間: 2015-10-29 19:13

回復 5# 准提部林


    謝准大 簡單又明瞭 感恩
   小弟研究一下
作者: Jason80Lo    時間: 2015-10-29 20:49

請問如果 txt檔中 &, #, %, @ 皆為資料的一個開頭
其中#, % 開頭裡的資料為無限個(而且有時候有有時候沒有),
這樣的話要如何去區分段落呢?
如附件檔案 2, 3列為原本顯示結果
                     6, 7列為希望的結果
請大大協助幫忙

[attach]22271[/attach]
作者: 准提部林    時間: 2015-10-29 21:53

回復 7# Jason80Lo


Do Until EOF(1)
  Line Input #1, T
  If T = "&" Then Set xR = xEnd(1, "B"): C = 0
  If (T = "#" Or T = "$") And N = "" Then Set xR = xEnd(1, "M"): C = 0: N = "Y"
  If T = "@" Then Set xR = xEnd(1, "AO"): C = 0
  For Each TT In Split(T, " ")
    C = C + 1:   xR(1, C) = TT
  Next
Loop
作者: Jason80Lo    時間: 2015-11-3 23:03

回復 8# 准提部林


    謝謝 准大 小弟 研究研究
作者: Jason80Lo    時間: 2015-11-8 18:29

本帖最後由 Jason80Lo 於 2015-11-8 18:30 編輯

回復 8# 准提部林


  If (T = "#" Or T = "$") And N = "" Then Set xR = xEnd(1, "M"): C = 0: N = "Y"
准大請問這行的意思,xEnd(1, "M")裡面的1什麼意思?
小弟試另三個TXT檔,同時開啟後只有第一個能夠順利依照儲存格編排(如下圖)
If (T = "#" Or T = "%") And N = "" Then Set xR = xEnd(1, "FZ"): C = 0: N = "Y"

[attach]22376[/attach]
作者: 准提部林    時間: 2015-11-8 19:08

回復 10# Jason80Lo


If (T = "#" Or T = "$") And N = "" Then Set xR = xEnd(1, "M"): C = 0: N = "Y"
_當遇"#"或"$",即以最後列的M欄為填入資料的起始格,
 因"#"與"$"個數不一定,且時有時無,又位置沒有既定順序,
 所以,只要遇到第一個"#"或"$",即以N="Y"表示已取得起始格,其後的就算是累計個數∼∼
 
資料要有固定規則(依提供的是三段式),否則程式無法寫的!
作者: Jason80Lo    時間: 2015-11-15 13:55

回復 11# 准提部林
If (T = "#" Or T = "%") And N = "" Then Set xR = xEnd(1, "FZ"): C = 0: N = "Y"
不好意思准大,我的TXT檔規則都是與第一個一樣,目前的問題是開啟第一個TXT檔排列都OK,
但第一個以後的遇到#、%的排序就無法從FZ儲存格填入。
作者: Jason80Lo    時間: 2015-11-15 14:08

回復 11# 准提部林

[attach]22456[/attach]
    如附檔文字檔
作者: 准提部林    時間: 2015-11-15 15:38

回復 12# Jason80Lo


N = "" '在這裡加入
Open xPath & xF For Input Access Read As #1


因第一個文字檔執行後 N = "Y",
所以每次都要將 N 設回空值,才不會被錯誤引用!
作者: Jason80Lo    時間: 2015-11-17 21:15

回復 14# 准提部林


    准大 我將你的方法套入
    If (T = "#" Or T = "%") And N = "Open xPath & xF For Input Access Read As #1" Then Set xR = xEnd(1, "N"): C = 0: N = "Y"
但是顯示出來的排列"#" 沒有依照我要的從N欄位開始依序排列,而是直接依序欄位排列下來,請問是小弟哪裡打錯@@
作者: 准提部林    時間: 2015-11-17 21:47

回復 15# Jason80Lo


Sub TEST()
Dim xPath$, xF$, xS As Worksheet, xEnd As Range, xR As Range, TT, T, N$, C%
xPath = ThisWorkbook.Path & "\" '"C:\Users\j\Desktop\VBA TXT 依照段落開啟需求\"
Set xS = ThisWorkbook.Sheets("工作表1")
Do
 If xF = "" Then xF = Dir(xPath & "\*.txt") Else xF = Dir
 If xF = "" Then Exit Do
 If Not xS.[A:A].Find(xF, LookAT:=xlWhole) Is Nothing Then GoTo 101
 Set xEnd = xS.Cells(Rows.Count, 1).End(xlUp)(2)
 If xEnd.Row < 3 Then Set xEnd = xS.[A3]
 xEnd = xF
 
 N = "" 
 Open xPath & xF For Input Access Read As #1
 Do Until EOF(1)
   Line Input #1, T
   If T = "&" Then Set xR = xEnd(1, "B"): C = 0
   If T = "$" Then Set xR = xEnd(1, "BG"): C = 0
   If (T = "#" Or T = "%") And N = "" Then Set xR = xEnd(1, "FZ"): C = 0: N = "Y"
   If T = "@" Then Set xR = xEnd(1, "DX"): C = 0
   For Each TT In Split(T, " ")
     C = C + 1:   xR(1, C) = TT
   Next
 Loop
 Close #1
101: Loop
End Sub
作者: Jason80Lo    時間: 2015-11-17 23:35

回復 16# 准提部林


    會錯意了,呵呵
     謝,版大




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)