【问题标题】:Trouble copying text file into Excel using VBA使用 VBA 将文本文件复制到 Excel 时出现问题
【发布时间】:2013-08-24 18:12:58
【问题描述】:

我想使用 VBA 将文本文件中的内容复制到 Excel 单元格。我可以从大多数文本文件中成功地做到这一点。但在某些文件的情况下,代码只是将部分数据复制到 excel 文件中。

这是我用来复制的代码

FileName = folderpath & sFile
Set mytextfile = Workbooks.Open(FileName)
mytextfile.Sheets(1).Cells.CurrentRegion.Copy ThisWorkbook.Sheets("RawData").Range("A" & inputRow)
'mytextfile.Sheets(1).Range("A1").CurrentRegion.Copy ThisWorkbook.Sheets("RawData").Range("A" & inputRow)
mytextfile.Close (False)

我已经明白问题所在了。在将某些文本文件作为 excel 文件打开时,单元格 A1 中存在一些内容,而单元格 A2 中存在其余内容。

不知道为什么会这样打开。我在下面发布两个文本文件的内容:

1)在excel中打开时内容包含在不同单元格中的文本文件

fwi!3F5A!041!g1ksIpqub7J MCMILLAN J. PIIKKILA RAYMONDBERRY@WEBTV.NET +001 061 477 130 F g3ktHqrwc9 CLE!g1ksIpqub7 CLEHS04C |P.O. BOX 171 SEARSPORT,ME 纳什维尔 68800 AZ| |5150 CTY RD 525 罗利 64292| 18000000 0412CL0 1 N 2

当我使用上面的文本文件时,我得到了以下输出。

fwi!3F5A!041!g1ksIpqub7J MCMILLAN J. PIIKKILA RAYMONDBERRY@WEBTV.NET +001 061 477 130 F g3ktHqrwc9 CLE!g1ksIpqub7 CLEHS04C |P.O. BOX 171 SEARSPORT

2) 内容包含在单个单元格 A1 中的文本文件

fSj!3U68!071!gQloo3d5OGG Presley Y. TART JR PULPACTION82@HOIMAIL.COM +001 047 475273 M gQmqq6d8ME CVE!gQloo3d5OG CVEGF07C |10001 SW 125TH CT RD Reno 88595 TN| |10849 黛博拉大道格伦代尔 70958| 97400000 0712CV0 0 N 0

当我使用上面的文本文件时,我得到了以下输出。

fSj!3U68!071!gQloo3d5OGG Presley Y. TART JR PULPACTION82@HOIMAIL.COM +001 047 475273 M gQmqq6d8ME CVE!gQloo3d5OG CVEGF07C |10001 SW 125TH CT RD Reno 88595 TN| |10849 黛博拉大道格伦代尔 70958| 97400000 0712CV0 0 N 0

这两个文件的内容没有明显区别。

我也试过这段代码,但没有成功:

FileName = folderpath & sFile
Set mytextfile = Workbooks.Open(FileName)
mytextfile.Sheets(1).Range("A1").CurrentRegion.Copy ThisWorkbook.Sheets("RawData").Range("A" & inputRow)
mytextfile.Close (False)

【问题讨论】:

  • 部分数据停在哪里?请包括失败的输出,以及您尝试过什么(如果有的话)来调试它(例如,更改它冻结的字符,确保没有隐藏的 ascii 字符等)。
  • @jmac 我更新了问题以包含我得到的输出。我提到了许多网站,都说只是复制单元格 A1 的内容以在 excel 中获取整个文本文件。这对于大约 50 个文件似乎没问题,但对于其他 3 个文件则不行。
  • 由于它挂在逗号上,很可能发生的事情是 Excel 在打开它时猜测您的文本文件是 CSV(逗号分隔值)文件,并自动移动最后一个一半改为单元格 B1。尝试在 Excel 中手动打开文本文件,看看是否发生这种情况。
  • 如果是这样,this question on superuser 可能会有所帮助。您可以尝试设置Open 选项将其视为文本而不是分隔符。
  • 我认为错误在这一行:Workbooks.Open(FileName)

标签: debugging excel copy text-files vba


【解决方案1】:

问题:

您没有使用正确的方法在 VBA 中读取 *.txt 文件。使用Workbooks.Open() 打开文件会将打开的文件视为*.csv。因此,当 Excel 读取流并出现逗号时,它会将其视为 换行符,并将剩余部分(逗号后)扔到下一个单元格。如MSDN Workbooks.Open Method

所述

表达式 .Open(FileName ... )

expression 表示Workbooks 对象的变量。

显然,Workbook object 不是 txt 文件。


解决方案:

读取*.txt 文件内容的正确方法是使用Microsoft Scripting Runtime 库中的FileSystemObjectTextStream 对象。

我为您编写了一个简单的Sub,它可以读取*.txt 文件的全部内容。为了使其正常工作,您必须添加对项目的引用

在 VBE 窗口中,单击 Tools » References » 向下滚动,查找并勾选 Microsoft Scripting Runtime

现在,通过下面的代码筛选并修改您的*.txt 文件的路径或通过参数传递路径,您的*.txt 文件的全部内容将放在第一个工作表中Sheet(1) 单元格A1

Sub ReadTxtFile()

    Dim oFSO As New FileSystemObject
    Dim oFS As TextStream
    
    Dim fileName As String
    ' make sure to update your path or
    ' pass it to the sub through parameter
    fileName = "C:\Users\fooboo\Desktop\text.txt"
    
    Set oFS = oFSO.OpenTextFile(fileName)
    
    Dim content As String
    content = oFS.ReadAll
    
    With Sheets(1).Range("A1")
        .ClearContents
        .NumberFormat = "@"
        .Value = content
    End With
    
    oFS.Close
    Set oFS = Nothing
    Set oFSO = Nothing
End Sub

【讨论】:

  • @Foreever 很高兴我能提供帮助。在 stackoverflow 上,我们通过投票和接受答案表示感谢(答案左上角的绿色复选标记)。
  • 为什么这些字符'' 在每个复制的文本之前?
  • 我打算接受你的回答。我只是在检查代码是否完美。你需要多一点耐心:P
  • 对不起,'' 字符是什么意思?他们在哪?你在复制什么文本。该代码完美运行我已经使用您的示例输入和输出对其进行了检查:)
  • 这是我使用您的代码后得到的输出:
    fwi!3F5A!041!g1ksIpqub7J MCMILLAN J. PIIKKILA RAYMONDBERRY@WEBTV.NET +001 061 477 130 F g3ktHqrwc9 CLE !g1ksIpqub7 CLEHS04C |PO BOX 171 SEARSPORT,ME 纳什维尔 68800 AZ| |5150 CTY RD 525 罗利 64292| 18000000 0412CL0 1 N 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多