【问题标题】:VBA Excel Loop to import text fileVBA Excel循环导入文本文件
【发布时间】:2017-08-05 04:40:11
【问题描述】:

我有一个非常简单的 vba 宏,我试图用它来将文本文件导入到 excel 中。文本文件有一个给定的名称,并且只有一列具有可变行数的数据。

我需要做的是 1)从特定工作表中的特定单元格读取文件名 2)使excel将文件中的所有数据行导入到单个列中。

这是我目前所拥有的:

Sub Import()

fname = Range("E3")
datadir = Application.ActiveWorkbook.Path
fpath = datadir & "\" & fname

Open fpath For Input As #1

Do Until EOF(1)
    Line Input #1, LineFromFile
    Range("E3") = LineFromFile
Loop

Close #1
End Sub

它确实打开文本文件并使用在单元格 E3 中输入的文件名导入数据,但它只打印数据文件中的最后一个值。如果我在后台打开电子表格运行调试器,我可以看到

以及原始数据和期望的输出示例: 文本文件内容:

5
4.24E-09
15
4.32E-09
25
4.41E-09
35
4.49E-09
45
4.58E-09
55
4.67E-09

an example 我试图让最终电子表格看起来像什么。理想情况下,我想使用一个宏一次导入多个文件,只需单击“导入”按钮即可。如果我能在初始导入循环方面获得帮助,我将不胜感激!

【问题讨论】:

    标签: excel compiler-errors vba


    【解决方案1】:

    您将每行值分配给同一个单元格。简单地说,每次读取一行时递增一个变量 (x),并使用 Range.Offset([Row],[Column]) 属性将新行写入到 Range("E3") 的偏移量。

    Range("E3").Offset(x) = LineFromFile

    Sub Import()
        Dim x As Long
    
        fname = Range("E3")
        datadir = Application.ActiveWorkbook.path
        fpath = datadir & "\" & fname
    
        Open fpath For Input As #1
    
        Do Until EOF(1)
            Line Input #1, LineFromFile
            Range("E3").Offset(x) = LineFromFile
            x = x + 1
        Loop
    
        Close #1
    End Sub
    

    【讨论】:

    • 谢谢您,我尝试了您的建议,他们解决了问题!
    【解决方案2】:

    在您的循环中,您只会重复地将刚刚读取的新文件行值分配给单元格 E3。如果文件有 100 行,当它完成时,它将覆盖 E3 中的值 99 次,只留下它在 E3 中读取的最后一个值

    编写一些额外的代码,将 E3 更改为 E4、E5 等。

    提示:

    • 将一个数值变量在循环之外赋值给 3。
    • 内部循环确保您每次递增变量加一。
    • 构建单元格引用以分配文件值,通过字符串连接将您的数字变量放在字符串“E”的末尾。这会给你(在循环的每一次通过)一个不同的、上升的值,比如“E3”、“E4”、“E5”......

    【讨论】:

    • 感谢您的提示,我在编程循环时总是搞错逻辑。 >.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多