将特定列从.txt传输到Excel
我正在尝试将这个.txt文件中的数据传输到电子表格中 在我运行我拥有的VBA之后,所有数据都将被传输,因此A列到E列将被填充 但我只需要前3列(A-C)中的数据。我不想在C列之后传输任何数据。我不能使用Range.Clear方法,因为在我的实际项目中,C列之后的列包含无法擦除/重写的数据将特定列从.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
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”。谢谢欢迎在你之前关于这个问题的帖子中,我主动提出要帮助你。我询问了一个文本示例,但您说您的代码突然开始按预期工作…:)是的…在我删除那篇文章两小时后,我意识到我的代码突然开始“工作”,因为我忘记了删除范围。最后清楚地声明…无论如何,谢谢:)!