将.txt中的数据附加到Excel工作表中

问题描述 投票:0回答:1

我有两个.txt文件。它们具有完全相同的格式和列。

第一个.txt文件如下所示:

enter image description here

这是我用来将数据从第一个.txt文件导出到Excel工作表(由@FaneDuru共享)的VBA代码)>

Sub CopyLessColumns()
 Dim strSpec As String, i As Long, colToRet As Long
 Dim arrSp As Variant, arrRez() As String, arrInt As Variant, j As Long
 Dim fso As Object, txtStr As Object, strText As String

  Set fso = CreateObject("Scripting.FileSystemObject")
  strSpec = "C:\Users\xxxxxxxxx\Desktop\Input.txt"
  If Dir(strSpec) <> "" Then                   
    Set txtStr = fso.OpenTextFile(strSpec)
        strText = txtStr.ReadAll
    txtStr.Close
 End If

  arrSp = Split(strText, vbCrLf)
  colToRet = 5                             'Number of columns you need
  ReDim arrRez(UBound(arrSp), colToRet - 1)
  For i = 0 To UBound(arrSp)
    arrInt = Split(arrSp(i), vbTab)
    If UBound(arrInt) > colToRet - 1 Then
        For j = 0 To colToRet - 1
            arrRez(i, j) = arrInt(j)
        Next j
    End If
  Next i
  ActiveSheet.Range(Cells(1, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez
End Sub

运行上面的代码后,我的Excel工作表将如下所示:

enter image description here

但是我不确定如何将第二个.txt文件中的数据附加到现有电子表格中。

下面是我的第二个.txt文件。相同格式,相同列号,不同数据。

enter image description here

我想将第二个.txt文件中的数据追加到我的电子表格中,因此看起来像这样

enter image description here

您可以看到,当我导入第二个.txt文件时,我想跳过标题行,而直接将数据导入到第一行下面。

此外,第一个.txt文件的行号可以随时更改,因此我不能只使用完全相同的代码,而只需将最后一行更改为

ActiveSheet.Range(Cells(2, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez

to

ActiveSheet.Range(Cells(4, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez

我也试图通过使用]查找最后一行。

lRow = Cells(Rows.Count, 1).End(xlUp).Row

然后,将最后一行更改为

ActiveSheet.Range(Cells(lRow, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez

但是那也不起作用。它只会用第二个.txt文件中的标题行覆盖电子表格上现有数据的最后一行]

我试图在线查找,但没有找到与我在这里尝试的相似的东西,因此,任何评论都将不胜感激!

----------------------------------------最终答案------ -------------------

基于@FaneDuru的出色建议编写的代码的最终版本

Sub PartTwo()
 Dim strSpec As String, i As Long, colToRet As Long
 Dim arrSp As Variant, arrRez() As String, arrInt As Variant, j As Long
 Dim fso As Object, txtStr As Object, strText As String


 Dim lRow As Integer

  Set fso = CreateObject("Scripting.FileSystemObject")
  strSpec = "C:\Users\ygong25\Desktop\Input2.txt"
  If Dir(strSpec) <> "" Then 'check if file exists
    Set txtStr = fso.OpenTextFile(strSpec)
        strText = txtStr.ReadAll
    txtStr.Close
 End If

  arrSp = Split(strText, vbCrLf)
  colToRet = 5 'Number of columns you need
  ReDim arrRez(UBound(arrSp), colToRet - 1)
  For i = 0 To UBound(arrSp)
    arrInt = Split(arrSp(i), vbTab)
    If UBound(arrInt) > colToRet - 1 Then
        For j = 0 To colToRet - 1
            arrRez(i, j) = arrInt(j)
        Next j
    End If
  Next i

  lRow = Cells(Rows.Count, 1).End(xlToLeft).Column
  ActiveSheet.Range(Cells(lRow, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez
End Sub

我有两个.txt文件。它们具有完全相同的格式和列。第一个.txt文件如下所示:这是我用来将数据从第一个.txt文件导出到excel的VBA代码...

您首先必须使用lRow = Cells(Rows.Count, 1).End(xlUp).Row + 1才能获得第一个空行,而不是最后一个填充行;

然后,您必须以跳过标题的方式修改arrRez数组:

ReDim arrRez(1 To UBound(arrSp), colToRet - 1)

后跟

For i = 1 To UBound(arrSp)

代替

For i = 0 To UBound(arrSp)

最后,正确准备要删除数组数据的范围:

ActiveSheet.Range(Cells(lastR, 1), Cells(UBound(arrRez, 1) + lastR - 1, UBound(arrRez, 2) + 1)).Value = arrRez
excel vba append
1个回答
1
投票

您首先必须使用lRow = Cells(Rows.Count, 1).End(xlUp).Row + 1才能获得第一个空行,而不是最后一个填充行;

© www.soinside.com 2019 - 2024. All rights reserved.