问题描述
非常感谢提前 我有一个 .txt 文件,其中包含需要提取并放入 Excel 中相应列的数据。我对 VBA 编码非常陌生,并尝试了很多,但很难完成这项工作......下面显示了我迄今为止的代码,但在运行时,它的工作方式有所不同。实际上数据需要放在各自的字段中作为excel中的示例。在 Excel 文件中,我已经将数据保留为如何获取和填写相应的标题列。
类型;帐号:银行参考号;收款人姓名;日期;金额;BENE 帐号;BENE IFSC;BENE 银行名称;参考;BENE 邮箱 ID IMPS;45605104698 ;60062000057200 ;ABCDEF ;12122016;0000000001.00;10304060176 ;STRK0002018;印度国家银行;51108@5110
Option Explicit
Sub importTXT()
Dim r As Range,myfile As Variant
Dim qt As QueryTable,i As Integer
Dim del As Range
'where myfile needs to select manually
myfile = Application.GetopenFilename("All Files (*.*),**.*",_,"Select TXT file",False)
If myfile = False Then Exit Sub
'elseif its fixed
'myfile = "D:\sample student file"
Application.ScreenUpdating = False
With ActiveSheet
.Range("E7").CurrentRegion.Cells.Clear
With .QueryTables.Add(Connection:="TEXT;" & myfile,Destination:=.Range("$E$7"))
.Name = "MST"
.TextFilePlatform = 437
.TextFileStartRow = 2
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileTabDelimiter = True
.TextFileColumnDataTypes = Array(1,1,1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
'delete query tables if found any.
For Each qt In ActiveSheet.QueryTables
qt.Delete
Next qt
'Delete the Data Connections
If .Parent.Connections.Count > 0 Then
For i = 1 To .Parent.Connections.Count
.Parent.Connections.Item(i).Delete
Next i
End If
For Each r In .Range("E7:X" & .UsedRange.Rows.Count)
If InStr(r,"Title = ") > 0 Then
r.Offset(,1) = Mid(r.Value,InStr(r," ") + 8,InStrRev(r.Value," "))
r.Offset(,2) = Mid(r.Value," ") + 2,Len(r.Value) - InStrRev(r.Value," ") - 2)
Else
If del Is nothing Then
Set del = r
Else
Set del = Union(del,r)
End If
End If
Next
End With
Application.ScreenUpdating = False
End Sub
需要插入数据的示例excel文件如下:-
解决方法
我使用了不同的方法,但我认为这可以满足您的需求:
-
导入 CSV
-
存储在数组中
-
使用基于映射数组的新列设置数组
-
粘贴到工作表
Sub ImportCsv() 'load the source file based on user input to an array Dim filename As String,Data filename = Application.GetOpenFilename Data = openfile(filename) 'spitting first line to get nr of columns Dim cls,Data2,j As Long,i As Long,newcls cls = Split(Data(1,1),";") 'Re-Order columns - You can just change to nr according to your mapping => first column mapped to col 5 etc... newcls = Array(5,3,10,14,8,6,13,19,18,9,22) 'Setup reformated array,make sure the Ubound of columns corresponds to the max col in your mapping ReDim Data2(1 To UBound(Data),1 To 22) For j = 1 To UBound(Data,1) cls = Split(Data(j,";") For i = 1 To UBound(cls) Data2(j,newcls(i)) = Trim(cls(i - 1)) Next i Next j 'paste to sheet Worksheets("Sheet1").Range("A1").Resize(UBound(Data2),UBound(Data2,2)).Value2 = Data2 End Sub Private Function openfile(filename As String) As Variant 'import External Dim wbExt As Workbook,Data,FilePath As String 'FilePath = Application.ActiveWorkbook.Path & filename => alternative if you just ask a filename to the user. this will set the path. Set wbExt = Workbooks.Open(filename:=filename) 'replace filename with filepath if you choose above approach With wbExt: Data = .Sheets(1).UsedRange.Value: .Close: End With 'get data from source and close openfile = Data 'send array back to main sub End Function
祝你好运,