【问题标题】:Importing Text File Loop while adding file name添加文件名时导入文本文件循环
【发布时间】:2015-09-16 15:04:57
【问题描述】:

我是 Excel VBA 的新手,遇到了一些问题。我正在创建一个宏,它将采用 .dat 文件(像 .txt 文件一样导入)并将文件名放在第一行,然后从第 2 行开始将所有数据放在它下面。然后程序循环并再次启动该过程 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

【问题讨论】:

  • 您需要在LastCol 中添加一些内容,否则您将继续覆盖之前的值...
  • 似乎也使用End(xlToLeft).Columns 而不是End(xlUp).Rows,您打算并排对齐文本文件数据,而不是彼此堆叠。通常,数据和报告以长而不宽的格式处理。见Bruin's note here
  • @Tim-Williams,你能解释更多吗?您是否建议一个无意义的增量,因为 LastCol 将与数据导入保持一致。
  • @Parfait,我尝试用 End(xlUp).Rows 替换,但它似乎没有编译。

标签: vba excel filenames


【解决方案1】:

这将获得 Row1 中最后一个占用单元格的列号(如果该行没有任何内容,则为第一个单元格)

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

如果您开始在该位置填充内容,您将(空行情况除外)覆盖该单元格中的内容。

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

为您提供该行上的第一个 单元格 [从右侧开始]。但这并没有考虑到导入文件中的内容,该文件有多个列。如果您导入的文件有 3 列,那么您需要进一步偏移...

【讨论】:

    【解决方案2】:

    要从宽格式更改为长格式,只需将 LastCol 更改为 LastRow 并更改以下四行代码即可。

    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 文件导入。

    【讨论】:

      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2017-06-08
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多