Есть ли способ импортировать данные из .csv в активный лист excel?
У меня есть файл csv, который всегда называется так же, как SO2PO.csv. У него есть данные, которые я импортирую в лист excell, называемый PO Data, в книге под названием Open Order. Мне нужно найти способ импортировать все данные из SO2PO.csv, чтобы открыть данные заказа PO.
Я знаю, что это возможно, но как? Может ли кто-нибудь указать мне в правильном направлении?
Или есть способ сделать так, чтобы я мог импортировать любой CSV файл, который был помещен в определенную папку?
Ответы
Ответ 1
Добавьте этот код, чтобы создать QueryTable в листе данных PO к источнику данных
После того, как вы создали 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
Ответ 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, но у меня нет примера сразу.
Ответ 3
Если вы собираетесь использовать querytables, убедитесь, что вы очистили после этого, оставшиеся таблицы запросов вызвали у меня несколько головных болей в нисходящем процессе.
' 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
Существует множество способов получить данные в Excel. Querytables (как показано The_Barman), SQL, Import Wizard и т.д.
Обычно метод зависит от того, насколько чисты данные представлены в файлах, которые вам нужно импортировать, и если вы точно знаете, как это изложено. Например, если есть пустые строки, смешанные типы данных, объединенные ячейки и т.д., Тогда это может быть кошмар.
Ниже представлен более медленный метод "грубой силы", который обычно получает все данные, сначала открывая файл в 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
Ответ 5
Предполагая простой CSV с 3 столбцами, вы также можете просто открыть файл и прочитать его в:
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