我有一个总是命名相同的csv文件,名为SO2PO.csv。它将数据导入到名为“打开订单”的工作簿中的名为PO Data的excell工作表中。我需要找到一种方法将所有数据从SO2PO.csv导入Open Order.xlsm表PO数据。
我知道这是可能的,但是怎么样?有人能指出我正确的方向吗?
或者有没有办法让它可以导入任何放入特定文件夹的.csv文件?
答案 0 :(得分:21)
添加此代码,以便在PO数据表中为您的数据源创建QueryTable
创建QueryTable后,您可以右键单击刷新数据(或打开时刷新)
Sub CSV_Import()
Dim ws As Worksheet, strFile As String
Set ws = ActiveWorkbook.Sheets("PO Data") 'set to current worksheet name
strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...")
With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.Refresh
End With
End Sub
答案 1 :(得分:2)
有可能。
如果没有vba,您可以使用DATA-Tab并从文本源导入。
使用vba,您可以将csv作为新工作簿打开:
Public Function openSource(fileToOpen As String) As Excel.Workbook
On Error GoTo err_exit
Dim f As Object
Dim fs As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set openSource = Nothing
If fs.fileexists(fileToOpen) Then
Set f = fs.GetFile(fileToOpen)
Set openSource = ThisWorkbook.Application.Workbooks.Open( _
FileName:=f.path, _
UpdateLinks:=2, _
ReadOnly:=True, _
AddToMRu:=False, _
Notify:=False)
Windows(openSource.Name).Visible = False
End If
Exit Function
err_exit:
'throwErrMsg "Failed to read File!", "openSource"
If Not openSource Is Nothing Then
openSource.Close SaveChanges:=False, RouteWorkbook:=False
End If
End Function
Dim CSVWorkbook As New Excel.Workbook
Set CSVWorkbook = openSource(c:\SO2PO.csv)
现在您可以像任何其他工具簿一样浏览此工作簿并复制行,列或整个工作表;)希望这会有所帮助。
另一种方法是使用vba版本中的文本导入,但我没有立即获得示例。
答案 2 :(得分:1)
有很多方法可以将数据导入Excel。查询表(由The_Barman演示),SQL,导入向导等。
通常,该方法取决于数据在您需要导入的文件上的清洁程度,以及您确切知道它的布局方式。例如,如果有空行,混合数据类型,合并单元格等,那么它可能是一场噩梦。
下面是一个较慢的“暴力”方法,通常首先在Excel中打开文件来获取所有数据。当其他方法失败时,这通常是最后一件事。
Option Explicit
Public Sub ImportData()
Dim CSVFilename As String
Dim writeToFilename As String
Dim writeToSheet As String
Dim readXL As Workbook
Dim readWS As Worksheet
Dim writeXL As Workbook
Dim writeWS As Worksheet
Dim UsedRng As Range
CSVFilename = Environ$("USERPROFILE") & "\Desktop" & "\SO2PO.csv"
writeToFilename = Environ$("USERPROFILE") & "\Desktop" & "\Open Order.xlsx"
writeToSheet = "PO Data"
Set writeXL = GetObject(writeToFilename)
Set writeWS = writeXL.Sheets(writeToSheet)
'writeWS.Parent.Windows(1).Visible = True
Set readXL = GetObject(CSVFilename)
With readXL
Set readWS = readXL.Sheets(1)
Set UsedRng = RealUsedRange(readWS)
writeWS.Range(UsedRng.Address).Value = UsedRng.Value
End With
'close CSV without saving
readXL.Close SaveChanges:=False
Set readWS = Nothing
Set readXL = Nothing
'close template with save
writeXL.Close SaveChanges:=True
Set writeWS = Nothing
Set writeXL = Nothing
End Sub
Public Function RealUsedRange(ByVal WS As Worksheet) As Range
'Find used range
Dim FirstRow As Long
Dim LastRow As Long
Dim FirstColumn As Integer
Dim LastColumn As Integer
On Error Resume Next
With WS
FirstRow = .Cells.Find(What:="*", After:=.Cells(.Rows.Count, .Columns.Count), LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext).Row
FirstColumn = .Cells.Find(What:="*", After:=.Cells(.Rows.Count, .Columns.Count), LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
LastRow = .Cells.Find(What:="*", After:=.Range("A1"), LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LastColumn = .Cells.Find(What:="*", After:=.Range("A1"), LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Set RealUsedRange = .Range(.Cells(FirstRow, FirstColumn), .Cells(LastRow, LastColumn))
End With
On Error GoTo 0
End Function
答案 3 :(得分:1)
如果您要使用查询表,请确保清理后,剩余的查询表会在下游过程中引起一些麻烦。
' get the file to the data sheet
Set ws = ActiveWorkbook.Sheets("Data")
With ws.QueryTables.Add(Connection:="TEXT;" & "mydata.csv", Destination:=ws.Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.Refresh
End With
' delete the querytable if there is one
On Error GoTo nothingtodelete
Sheets("Data").QueryTables(1).SaveData = False
Sheets("Data").QueryTables.Item(1).Delete
nothingtodelete:
答案 4 :(得分:0)
假设一个简单的3列CSV,您也可以打开文件并在其中读取它:
Sub ImportData()
Dim textLine As String
Dim fields() As String
Dim startRow As Integer
Dim sheet As Worksheet
Set sheet = ActiveSheet
startRow = 1
Open "C:\tempdatadir\datafile.csv" For Input As #1
Do While Not EOF(1) ' Loop until end of file.
Line Input #1, textLine ' Read line into variable.
fields = Split(textLine) 'split line into fields
'put fields into sheet
sheet.Cells(startRow, 1).Value = fields(0)
sheet.Cells(startRow, 2).Value = fields(1)
sheet.Cells(startRow, 3).Value = fields(2)
startRow = startRow + 1
Loop
Close #1
End Sub
答案 5 :(得分:0)
Sub demo()
Dim FilePath As String
FilePath = "C:\Users\Tamil\Desktop\padding_values.csv"
Open "C:\Users\Tamil\Desktop\padding_values.csv" For Input As #1
row_number = 0
Do Until EOF(1)
Line Input #1, LineFromFile
LineItems = Split(LineFromFile, ",")
ActiveCell.Offset(row_number, 0).Value = LineItems(2)
ActiveCell.Offset(row_number, 1).Value = LineItems(1)
ActiveCell.Offset(row_number, 2).Value = LineItems(0)
row_number = row_number + 1
Loop
Close #1
End Sub