将特定列从.txt传输到Excel

将特定列从.txt传输到Excel,excel,vba,Excel,Vba,我正在尝试将这个.txt文件中的数据传输到电子表格中 在我运行我拥有的VBA之后,所有数据都将被传输,因此A列到E列将被填充 但我只需要前3列(A-C)中的数据。我不想在C列之后传输任何数据。我不能使用Range.Clear方法,因为在我的实际项目中,C列之后的列包含无法擦除/重写的数据 Sub Fill() With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:\Users\xxxxxxx\Desktop\Inpu

我正在尝试将这个.txt文件中的数据传输到电子表格中

在我运行我拥有的VBA之后,所有数据都将被传输,因此A列到E列将被填充

但我只需要前3列(A-C)中的数据。我不想在C列之后传输任何数据。我不能使用Range.Clear方法,因为在我的实际项目中,C列之后的列包含无法擦除/重写的数据

Sub Fill()

With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Users\xxxxxxx\Desktop\Input.txt", Destination:=Range("$A:$C") _
        )
        .Name = "Input"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
这是我的代码,有没有办法只从我的文本文件传输部分数据(前N列),而不创建额外的帮助器/参考表?
任何帮助都将不胜感激

您可以尝试以下方法:


With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Users\xxxxxxx\Desktop\Input.txt", Destination:=Range("$A:$C") _
        )
        .Name = "Input"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

    Activeworksheet.Range("D:F").EntireColumn.Delete

End Sub

您可以尝试以下方法:


With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Users\xxxxxxx\Desktop\Input.txt", Destination:=Range("$A:$C") _
        )
        .Name = "Input"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

    Activeworksheet.Range("D:F").EntireColumn.Delete

End Sub
只要改变一下:

.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)

请注意:
xlSkipColumn
=
9

只需更改:

.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)


请注意:
xlSkipColumn
=
9

另一种方法是先处理文本文件,然后根据需要在工作表中返回多个列:

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\xxxxxxx\Desktop\Input.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
  ActiveSheet.Range(Cells(1, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez
End Sub
然后更换线路

.TextFileColumnDataTypes = Array(1, 1, 1,...)


另一种方法是先处理文本文件,然后在工作表中返回所需的列:

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\xxxxxxx\Desktop\Input.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
  ActiveSheet.Range(Cells(1, 1), Cells(UBound(arrRez, 1) + 1, UBound(arrRez, 2) + 1)).Value = arrRez
End Sub
然后更换线路

.TextFileColumnDataTypes = Array(1, 1, 1,...)


谢谢你的评论:)但正如我在问题中所说的,我不能使用Range.Clear或Rang.Delete函数,因为在我的实际项目中,D列到F列将包含无法重写的公式。我只需要更新A-C列,而不影响任何其他列power Query-remove列?(未经测试)。@BigBen-nah,我认为这属于同一概念。我无法对C列之后的任何其他列执行任何操作(不清除、删除或删除)。我知道我可以通过创建另一张表来解决问题,清理另一张表中的数据,然后进行传输,但我想避免创建另一张表谢谢你的评论:)但正如我在问题中所述,我不能使用Range.Clear或Rang.Delete函数,因为在我的实际项目中,列D到F将包含不能重写的公式。我只需要更新列A-C,而不影响任何其他列Power Query-remove列?(未经测试)。@BigBen-nah,我认为这属于同一概念。我无法对C列之后的任何其他列执行任何操作(不清除、删除或删除)。我知道我可以简单地通过创建另一张工作表来解决问题,清理另一张工作表中的数据,然后进行传输,但我想避免创建另一张工作表。这实际上很棒!在我真正的Excel工作表中,我有168列,不需要最后8列,所以我打算将数字“1”写160次,但现在我只需要将“colToRet=5”改为“colToRet=160”。谢谢欢迎在你之前关于这个问题的帖子中,我主动提出要帮助你。我询问了一个文本示例,但您说您的代码突然开始按预期工作…:)是的…在我删除那篇文章两小时后,我意识到我的代码突然开始“工作”,因为我忘记了删除范围。最后清楚地声明…无论如何,谢谢:)!这真是太棒了!在我真正的Excel工作表中,我有168列,不需要最后8列,所以我打算将数字“1”写160次,但现在我只需要将“colToRet=5”改为“colToRet=160”。谢谢欢迎在你之前关于这个问题的帖子中,我主动提出要帮助你。我询问了一个文本示例,但您说您的代码突然开始按预期工作…:)是的…在我删除那篇文章两小时后,我意识到我的代码突然开始“工作”,因为我忘记了删除范围。最后清楚地声明…无论如何,谢谢:)!