2015-09-16 56 views
0

我是Excel VBA的新手,並遇到一些問題。我正在創建一個將採用.dat文件的宏(導入類似.txt文件),並將文件名放在第一行,然後將第二行的所有數據放在第二行,然後程序循環並重新啓動進程3行(數據有很多行但只有3列)。在添加文件名時導入文本文件循環

目前我的宏將導入的數據正確,但文件名不正確循環。它將輸入文件名到A1,循環輸入文件名到D3,同時從A1刪除文件名。我無法弄清楚發生了什麼問題。

Sub ImportDataFiles() 
'call out variables 
Dim fName As String, LastCol As Long, fileName As String, fso As Object 

'loop start 
BEGINNING: 
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column 
fName = Application.GetOpenFilename("All Files, *.dat") 
Set fso = CreateObject("Scripting.FileSystemObject") 
fileName = fso.GetFilename(fName) 
'fileName is just the file name from the path 
Range(Cells(1, LastCol).Address).Value = fileName 
If fName = "False" Then Exit Sub 
     'Imports data from text file 
     With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & fName, _ 
      Destination:=Cells(2, LastCol)) 
       .TextFileStartRow = 30 
       .TextFileParseType = xlDelimited 
       .TextFileConsecutiveDelimiter = True 
       .TextFileTabDelimiter = False 
       .TextFileSemicolonDelimiter = True 
       .TextFileCommaDelimiter = False 
       .TextFileSpaceDelimiter = False 
       .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, _ 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _ 
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
       .Refresh BackgroundQuery:=False 
       'loop end 
       If MsgBox("Do you want to do it again?", vbYesNo) = vbYes Then GoTo BEGINNING 
    End With 
End Sub 
+0

你需要添加一些東西到'LastCol',否則你會保持覆蓋以前的值... –

+0

它似乎也使用'End(xlToLeft).Columns'而不是'End(xlUp).Rows',您打算將文本文件數據並排排列,而不是堆疊在一起。通常情況下,數據和報告都是以很長的格式處理的。參見[Bruin's note here](http://www.rondebruin.nl/win/s9/win005.htm)。 – Parfait

+0

@蒂姆威廉斯,你能解釋一下嗎?你是在暗示一個無意義的增量,因爲LastCol將與數據導入一致。 – IrishThunder23

回答

0

這將讓最後的列數佔據ROW1細胞(或者,如果沒有什麼在該行的第一個單元格)

LastCol = Cells(1, Columns.Count).End(xlToLeft).Column 

如果你開始填充你那個位置的內容將(除了在空行的情況下)覆蓋該單元格中的內容。

LastCol = Cells(1, Columns.Count).End(xlToLeft).Column + 1 

給你的第一細胞[從右邊]在該行上。但是這並不包含導入文件中的內容,該文件具有多列。如果您導入的文件有3列,那麼你需要進一步彌補...

0

要寬更改爲長格式,只需更改LastColLastRow有改動以下四行代碼。

Dim ... LastRow As Long, ... 

LastRow = Cells(Rows.Count, 1).End(xlUp).Row 
... 
Range(Cells(LastRow + 1, 1).Address).Value = fileName 
... 
    Destination:=Cells(LastRow + 2, 1)) 

這也解決了您覆蓋FileName的問題,並允許您繼續後續的.dat文件導入。