返回列表 上一主題 發帖

文字檔讀取問題

回復 1# herhsiu
已有許多發文 ,你可爬文暸解一下,如真不解,也需將題目說清楚.  包含特定字串內容的某一列資料讀取匯入excel 如此太含糊,要舉例才明白

TOP

回復 3# herhsiu
  1. Sub 匯入文字檔()
  2.     Dim i As Integer, ii As Integer, Mystr As String
  3.     With Application.FileDialog(msoFileDialogFilePicker)  '[檔案選擇器]
  4.         .AllowMultiSelect = True                '可多重選擇檔案
  5.         .Title = "文字檔 匯入excel"             '[檔案選擇器] 的標題
  6.         .Filters.Clear                          '清除 [檔案選擇器] 對話方塊的檔案篩選
  7.         .Filters.Add "文字檔", "*.txt", 1       '新增 [檔案選擇器] 對話方塊的檔案篩選
  8.                                                 '篩選清單中新控制項所在位置的數值  1
  9.         .Filters.Add "*.*", "*.*", 2            '新增 [檔案選擇器] 對話方塊的檔案篩選
  10.                                                 '篩選清單中新控制項所在位置的數值 2
  11.         .FilterIndex = 1                        '當檔案對話方塊首次開啟時,預設篩選判定所顯示的檔案類型。
  12.         If .Show = 0 Then Exit Sub              '沒選擇檔案時離開檔案
  13.             For i = 1 To .SelectedItems.Count   '依序在選擇檔案數目的迴圈
  14.                 Open .SelectedItems(i) For Input As #1   '開啟文字檔
  15.                 Do While Not EOF(1)                      '不是檔案底部時 執行迴圈
  16.                     Input #1, Mystr                      '從已開啟的循序讀取資料,並將資料指定給變數。->mystr
  17.                     If Mystr Like "*test*" Then          '請修改"test" 為->要你搜尋某一字串
  18.                         Cells(ii + 1, "a") = Mystr       '整列匯入工作表
  19.                         ii = ii + 1                      '下一列
  20.                     End If
  21.                 Loop
  22.                 Close #1                                 '關閉文字檔
  23.            Next
  24.     End With
  25. End Sub
複製代碼

TOP

回復 6# herhsiu
  1. Sub 匯入文字檔A()
  2.     Dim i As Integer, ii As Integer, Str As Variant, F As Object
  3.     With Application.FileDialog(msoFileDialogFilePicker)  '[檔案選擇器]
  4.         .AllowMultiSelect = True                '可多重選擇檔案
  5.         .Title = "文字檔 匯入excel"             '[檔案選擇器] 的標題
  6.         .Filters.Clear                          '清除 [檔案選擇器] 對話方塊的檔案篩選
  7.         .Filters.Add "文字檔", "*.txt", 1       '新增 [檔案選擇器] 對話方塊的檔案篩選
  8.                                                 '篩選清單中新控制項所在位置的數值  1
  9.         .Filters.Add "*.*", "*.*", 2            '新增 [檔案選擇器] 對話方塊的檔案篩選
  10.                                                 '篩選清單中新控制項所在位置的數值 2
  11.         .FilterIndex = 1                        '當檔案對話方塊首次開啟時,預設篩選判定所顯示的檔案類型。
  12.         If .Show = 0 Then Exit Sub              '沒選擇檔案時離開檔案
  13.         For i = 1 To .SelectedItems.Count   '依序在選擇檔案數目的迴圈
  14.             Set F = CreateObject("Scripting.FileSystemObject").OpenTextFile(.SelectedItems(i), 1, -1)
  15.             'F.READALL 讀取檔案的文字, Split(字串, 分隔字串)->傳回一維陣列
  16.             For Each Str In Split(F.READALL, Chr(10))  '傳回一維陣列 的迴圈
  17.                 If Str Like "*TEST*" Then
  18.                     Cells(ii + 1, "a") = Str            '整列匯入工作表
  19.                     ii = ii + 1                         '下一列
  20.                 End If
  21.             Next
  22.             F.Close                                     '關閉文字檔
  23.         Next
  24.     End With
  25. End Sub
複製代碼

TOP

回復 8# herhsiu
你的附檔中沒有程式碼如何幫你修正.
文字檔也要附上看看 程序是要依需求來寫的.

TOP

回復 10# herhsiu
文字檔只有2列嗎?
第一列 有規律性嗎? 如最後一定有,'N'嗎?  要寫在哪一個檔?
  00:01:46  資料 = RAW values ( 'Z9.01','FG','90','SZ001.1','GL01',SYSDATE,'N','0.1','0.1' , '-
第二列 : data需依此數目往左shift    你的示意圖不夠清楚 請加註文字說明
如 "00:01:47        -0.001        0        -0.038        0.035        0.042        -0.02        -0.13        -0.256        -0.009        0.004        -0.76        -0.134        968      如何放置於示意檔?  一定是3個欄位嗎 ?

TOP

本帖最後由 GBKEE 於 2011-9-27 14:50 編輯

回復 12# herhsiu
  1. Option Explicit
  2. Sub 第一列()
  3.     Dim Str, A
  4.     Str = "00:01:46  資料 = RAW values ( 'Z9.01','FG','90','SZ001.1','GL01',SYSDATE,'N','0.1','0.1' , '-0.0129','0.006','-0.0119','0.0305','-0.0047','-0.0066','-0.0158','0.0007', '-0.0233','-0.0057','-0.0124','0.0057','-0.0113','0.0174','0.0005','-0.0122', '-0.0136','-0.0074','-0.016','0.0003','0.0025','-0.0143','0.0031','0.0121', '0.0161','-0.0222','0.0013','-0.0118','0.0004','-0.0116','-0.0055','0.0155', '-0.0076','0.0391','0.0001','0.0117','-0.012','0.0159','-0.0137','0.0085')"
  5.     A = InStr(Str, "SYSDATE,'N")        ' 傳回數字 -> SYSDATE,'N 在 Str字串的位置
  6.     A = Mid(Str, A + 10)                '截起Str字串 A+10 起.    '(SYSDATE,'N) 字串長度 => 10
  7.     Str = Mid(Str, 1, 8) & A            '結合 兩字串  'Mid(Str, 1, 8)->00:01:46
  8.     Str = Replace(Str, "'", "")         '消除字元 -> '
  9.     Str = Mid(Str, 1, Len(Str) - 1)     '刪除最後字元 -> )
  10.     MsgBox Str
  11.     Str = Split(Str, ",")      '->      '將字串 轉為陣列
  12.     [A1].Resize(, UBound(Str)) = Str    '陣列 放置於列
  13.     [A3].Resize(UBound(Str)) = Application.WorksheetFunction.Transpose(Str)        '陣列 放置於欄
  14. End Sub
  15. Sub 第二列()
  16.     Dim Str As Variant, Ar(), A As Variant, i As Integer, ii As Integer, C As Integer, R As Integer
  17.     Str = "00:01:47 EQS send GLData_V5 to DS. [RvMsg]: [primPrcdId]Z9.01 [lotId]SZ001.1 [GLAutoRecipeId]V90_20 [GLEqpId]GL01 [stage]FG [parentNo]0 [intraTranslationX]-0.001 [intraTranslationY]0.000 [intraMagnification]-0.038 [intraRotation]0.035 [interRotation]0.042 [interOrthogonality]-0.020 [interExpansionX]-0.130 [interExpansionY]-0.256 [interTranslationX]-0.009 [interTranslationY]0.004 [asymrotation]-0.760 [asymmagnification]-0.134 [FlagSet]-00068+00036+00000+01000"
  18.     ReDim Ar(0)                                 '重新宣告陣列維度
  19.     Ar(0) = Mid(Str, 1, 8)                      '將值指定給陣列
  20.     A = InStr(Str, "[parentNo]")                '傳回數字 -> [parentNo] 在 Str字串的位置
  21.     Str = Mid(Str, A + Len("[parentNo]"))       '截起Str字串 A 起.
  22.     Do
  23.         ReDim Preserve Ar(UBound(Ar) + 1)       '重新宣告陣列維數 ( 加1維數 )  'Preserve->保留原有資料
  24.         Ar(UBound(Ar)) = Val(Str)               '將值指定給 ->陣列的最大維數
  25.                                                 'Val ->(Str) 字串轉換為數字
  26.         A = InStr(Str, "]")                     '傳回數字 -> " ] " 在 Str字串的位置
  27.         Str = Mid(Str, A + 1) '
  28.     Loop While InStr(Str, "]")                  '字串裡有"]" 執行回圈
  29.     A = 0
  30.     For i = 1 To Len(Str) Step 6                'Step 6 ->每隔6字元
  31.        A = A + Val(Mid(Str, i, 6))
  32.     Next
  33.     ReDim Preserve Ar(UBound(Ar) + 1)
  34.     Ar(UBound(Ar)) = A                          '最後的數字指定給 ->陣列的最大維數
  35.     With Sheet2
  36.         C = .[A1].End(xlToRight).Column - 1     '取得欄數
  37.         R = 2                                   'A2 開始
  38.         i = 0                                   '陣列的第一維
  39.         Do While .Cells(R, "A") <> "" And i <= UBound(Ar) '  i <= UBound(Ar) -> 陣列的維數內
  40.             ii = 1                                  '欄數歸回第一欄
  41.             Do While ii <= C And i <= UBound(Ar)
  42.                 .Cells(R, "A").Offset(, .Cells(R, "A") + ii) = Ar(i)
  43.                 'Offset(, .Cells(R, "A") + ii)      '.Cells(R, "A")-> 取得Shift 數字 ,ii(欄數)
  44.                 i = i + 1
  45.                 ii = ii + 1                      '下一陣列維數
  46.             Loop
  47.             R = R + 1                             '下一列
  48.         Loop
  49.     End With
  50. End Sub
複製代碼

TOP

回復 14# herhsiu
我的data並不會每一列都相同
那就不適用程式,巨集.

TOP

回復 17# herhsiu
Replace 函數  無法用  ?  *  搜尋要替換的字串, 可否po 這列字串 試試看

TOP

回復 19# herhsiu
  1. Sub 第一列()
  2.     Dim Str, A, i, Ar
  3.     Str = "00:10:56 TR4A-9.01 A80168.5 V81_79 OL1 AH_H 1 parentLotId_1A80168.1 0.000 0.000 0.299 -0.058 0.052 -0.035 -0.155 0.004 0.001 0.000 -0.037 0.071 +00035-00006+00000+00700"
  4.     ReDim Ar(0)                                                 '重新宣告陣列維度
  5.     Ar(0) = Mid(Str, 1, 8)                                      '將值指定給陣列
  6.     A = InStr(Str, "parentLotId_") + Len("parentLotId_")       ' 傳回數字 -> SYSDATE,'N 在 Str字串的位置   
  7.     For i = A To Len(Str)
  8.         If Mid(Str, i, 1) = "." Then Exit For
  9.     Next
  10.     Str = Split(Mid(Str, i + 3), " ")
  11.     For i = 0 To UBound(Str)
  12.         ReDim Preserve Ar(UBound(Ar) + 1)
  13.         Ar(UBound(Ar)) = Str(i)                                 '最後的數字指定給 ->陣列的最大維數
  14.     Next
  15.      A = 0
  16.      For i = 1 To Len(Ar(UBound(Ar))) Step 6                'Step 6 ->每隔6字元
  17.        A = A + Val(Mid(Ar(UBound(Ar)), i, 6))
  18.     Next
  19.     Ar(UBound(Ar)) = A
  20.     [A1].Resize(, UBound(Ar) + 1) = Ar '陣列 放置於列
  21.     [A3].Resize(UBound(Ar) + 1) = Application.WorksheetFunction.Transpose(Ar)     '陣列 放置於欄
  22. End Sub
複製代碼

TOP

回復 22# herhsiu
UBound函數: 表示指定陣列某維最大可使用的陣列索引
Ar(UBound(Ar)) =>    "+00035-00006+00000+00700"
For i = 1 To Len(Ar(UBound(Ar))) Step 6                'Step 6 ->每隔6字元
          A = A +  Val(Mid(Ar(UBound(Ar)), i, 6))
         '->  i=1->   +00035
          '-> i=1+6    -00006
          '-> i=7+6  +00000
          '-> i=13     +00700
    Next

TOP

        靜思自在 : 【做人的開始】每一天都是故人的開始,每一個時刻都是自己的警惕。
返回列表 上一主題