有没有办法将数据从.csv导入到活动的Excel表单中?

我有一个叫做SO2PO.csv的csv文件。 它有一个数据,我把它导入一个名为PO Data的Excel工作表中,名为Open Order。 我需要find一种方法将所有数据从SO2PO.csv导入到打开Order.xlsm工作表PO数据。

我知道这是可能的,但是如何? 有人能指出我正确的方向吗?

还是有办法让我可以导入任何.csv文件放在一个特定的文件夹?

添加此代码以在PO数据表中为您的数据源创buildQueryTable

一旦你创build了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 

有可能的。

没有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版本的文本导入,但我没有立即举例。

有很多方法可以将数据导入到Excel中。 查询表(如The_Barman演示),SQL,导入向导等

通常情况下,这个方法取决于你需要导入的文件是如何清洁数据的,以及你是否确切地知道它是如何布置的。 例如,如果有空行,混合数据types,合并的单元格等,那么它可能是一场噩梦。

下面是一个较慢的“蛮力”方法,它通常会首先在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 

如果你打算使用查询表,确保你清理后,剩下的查询表在下游stream程中引起了一些麻烦。

 ' 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: