2012-08-06 101 views
0

我通過VBA將固定文件(TXT)導入到Excel中有一個難題。問題並不是真正將數據導入Excel(下面的代碼),而是根據TXT文件的列內容更改列寬。Excel VBA導入可變列寬度的TXT文件

任何幫助是非常appriciated!

實施例:

TXT文件的內容是:

FirstC  SecondC   ThirdC 
A    111122223333  444455556666 
B    111122223333  444455556666 
A    111122223333  444455556666 
A    111122223333  444455556666 
B    111122223333  444455556666 

取決於第一列(FirstC)在Excel中導入列的寬度應改變的內容,即用於A中的列第二列(SecondC)的寬度應爲8位數字,並在B的情況下,它應該是10個位數

導入代碼(不是親,很抱歉,如果代碼是有點雜亂):

Sub Button1_Click() 

Dim vPath As Variant 

vPath = Application.GetOpenFilename("TextFiles (*.txt), *.txt", , "TEST TEXT IMPORTER:") 
If vPath = False Then Exit Sub 
Filename = vPath 
Debug.Print vPath 

Worksheets("IMPORT").UsedRange.ClearContents 


With Sheets("IMPORT").QueryTables.Add(Connection:="TEXT;" & CStr(vPath), Destination:=Sheets("IMPORT").Range("A2")) 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = xlWindows 
     .TextFileStartRow = 1 
     .TextFileParseType = xlFixedWidth 
     .TextFileTextQualifier = xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = False 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = False 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = Array(2, 2, 2) 
     .TextFileFixedColumnWidths = Array(14, 18, 12) 
     .TextFileFixedColumnWidths = Array(14, 18, 12) '<-- That’s where I need to be flexible 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 

    End With 


End Sub 

我下面的代碼有點改裝和它的作品,只是不顯示第四列。 實際上會添加更多的列,所以很高興看到我必須調整代碼以便靈活使用列。任何想法?在此先感謝

文本文件(只顯示2行,將更多的未來)是這樣的:

0000000002666980001F2002 
0000000002666980002G1020709500430120101L05200000000000000000000 

編碼:

Sub Button1_Click() 


    Const fPath As String = "H:\MyDocs\xxxxx\TestFiles6.txt" 
    Const fsoForReading = 1 
    Const F1_LEN As Integer = 15 'Reference Number 
    Const F2_LEN As Integer = 4  'Cosectuive Number 
    Const F3_LEN As Integer = 1  'Record Type 
    Const F4_Len As Integer = 4  'Company Number 

    Dim objFSO As Object 
    Dim objTextStream As Object 
    Dim start As Integer 
    Dim fLen As Integer 
    Dim rw As Long 

    Set objFSO = CreateObject("scripting.filesystemobject") 
    Set objTextStream = objFSO.OpenTextFile(fPath, fsoForReading) 
    rw = 2 

    Do Until objTextStream.AtEndOfStream 
     txt = objTextStream.Readline 


     f1 = Trim(Left(txt, F1_LEN)) 
    '------------------------------------------------------------------------------------------------------------ 
     start = F1_LEN + 1 
     f2 = Trim(Mid(txt, start, F2_LEN)) 
    '------------------------------------------------------------------------------------------------------------ 
     start = F1_LEN + F2_LEN + 1 
     f3 = Trim(Mid(txt, start, F3_LEN)) 

     If f3 = "F" Then 
      fLen = 4 
     ElseIf f3 = "G" Then 
      fLen = 50 
     Else 

     End If 

     Debug.Print start 
    '------------------------------------------------------------------------------------------------------------ 
     start = start + 1 
     f4 = Trim(Mid(txt, start, fLen)) 
     Debug.Print f4 
    '------------------------------------------------------------------------------------------------------------ 
     ThisWorkbook.Sheets("data").Cells(rw, 1).Resize(1, 3).Value = Array(f1, f2, f3, f4) 
     rw = rw + 1 
    Loop 

    objTextStream.Close 

末次

+0

要在單次導入中處理這個問題,您需要「手動」逐行讀取文件,並檢查第一列以瞭解如何處理下一列。或者你可以運行你有兩次的代碼 - 第一次使用setting1(然後刪除任何「B」行),然後再使用setting2(刪除任何「A」行)。 – 2012-08-06 18:39:53

+1

您是否嘗試過使用空格/製表符分隔符(將連續的分隔符視爲單個分隔符)?您可能會發現您的列標題向右移動了一列,但您可以使用VBA輕鬆地將它們粘貼到一個單元格上。 – Zairja 2012-08-06 20:53:43

+0

非常感謝您的反饋。 Zairja:源文件是一個固定的witdh文件,所以我無法更改(它來自我們的ERP系統)。 @Tim威廉姆斯:逐行閱讀是someting我假設將是一個解決方案,但不幸的是,我仍然在學習,所以任何代碼示例將非常有用:) – Dennis 2012-08-07 05:31:52

回答

0

未測試:

Sub Tester() 

    Const fPath As String = "C:\SomeFile.txt" 
    Const fsoForReading = 1 
    Const F1_LEN As Integer = 14 
    Const F2_LEN_A As Integer = 8 
    Const F2_LEN_B As Integer = 10 
    Const F3_LEN As Integer = 14 

    Dim objFSO As Object, objTextStream As Object, txt, f1, f2, f3 
    Dim start As Integer, fLen As Integer 
    Dim rw As Long 

    Set objFSO = CreateObject("scripting.filesystemobject") 
    Set objTextStream = objFSO.OpenTextFile(fPath, fsoForReading) 
    rw = 2 

    Do Until objTextStream.AtEndOfStream 
     txt = objTextStream.Readline 


     f1 = Trim(Left(txt, F1_LEN)) 
     start = F1_LEN + 1 

     If f1 = "A" Then 
      fLen = 8 
     ElseIf f1 = "B" Then 
      fLen = 10 
     Else 
      'what if? 
     End If 

     f2 = Trim(Mid(txt, start, fLen)) 
     start = start + fLen + 1 
     f3 = Trim(Mid(txt, start, F3_LEN)) 

     With ThisWorkbook.Sheets("data").Cells(rw, 1).Resize(1, 3) 
      .NumberFormat = "@" 'format cells as text 
      .Value = Array(f1, f2, f3) 
      'alternatively..... 
      '.cells(1).Value = f1 
      '.cells(3).Value = f3 
     End With 
     rw = rw + 1 
    Loop 

    objTextStream.Close 
End Sub 
+0

謝謝,這實際上在第一次去。我會在接下來的2天內對它進行更詳細的測試,如果一切正常,我們會報告。到目前爲止,很多謝謝和讚賞! – Dennis 2012-08-07 14:40:08

+0

添加了我的改裝代碼,但仍然需要一些幫助。很多在此先感謝 – Dennis 2012-08-16 12:17:58

+0

最後一個問題:據我所知,數組被填充所有值,並且還描述了粘貼值的Excel單元格。我如何才能將這些值粘貼到特定的單元格中並保持已經在單元格中的原始內容?例如:.Value = Array(f1,,f3)其中缺少的f2代表已填充的Excel表單中的單元格,應該保持原樣 – Dennis 2012-08-21 13:12:50

相關問題