Есть ли способ импортировать данные из .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