2012-08-30 18 views
10

Mam plik csv o tej samej nazwie, o nazwie SO2PO.csv. Ma dane, które zaimportuję do arkusza excell zwanego PO Data, w skoroszycie o nazwie Open Order. Muszę znaleźć sposób na zaimportowanie wszystkich danych z SO2PO.csv do danych PO zamówienia Open Order.xlsm.Czy istnieje sposób na import danych z pliku .csv do aktywnego arkusza programu Excel?

Wiem, że to możliwe, ale jak? Czy ktoś może wskazać mi właściwy kierunek?

Czy jest jakiś sposób, aby go zaimportować do pliku .csv, który został umieszczony w określonym folderze?

+2

Nienawidzę tego mówić, ale ja specjalnie powiedział ja próbuje to w arkuszu programu Excel ... Pomyślałem, że plus tagi, Excel i Excel VBA byłoby wskazania, że ​​aplikacja Excel był I był używany i że Excel-VBA był możliwy ... dla rozwiązania. Gdybym miał to zrobić za pomocą innej aplikacji, prawdopodobnie powiedziałbym ... –

+0

Tak, było oczywiste, że Excel był aplikacją. Nie było oczywiste, jakiego mechanizmu * zewnętrznego * użyłeś, niezależnie od tego, czy mogło to być pisanie oddzielnej, autonomicznej aplikacji w C# lub VB.Net, czy może jako część większej aplikacji korzystającej z SQL Server. Znasz swój system. My nie. Naprawdę lubię pomagać tutaj, ale takie reakcje, gdy próbuję udzielić pomocy, nie są zbyt zachęcające. Powodzenia w projekcie. –

+1

Gdyby miały być C# i VB.Net, chciałbym umieścić to w tagach ... Jestem dość ostry, gdy pytam o rzeczy. –

Odpowiedz

20

Dodaj ten kod do tworzenia QueryTable w karcie PO do źródła danych

Po utworzeniu QueryTable można następnie po prostu kliknij prawym odświeżyć dane (lub odświeżyć na otwarty)

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 
+0

będzie to działało z plikami xls, jeśli je również zmienię? –

+0

Jedynym powodem, dla którego pytam, jest to, że kiedy próbuję zmienić pliki na xlxs lub xls, zostaje wrzucony do niego dużo ekstrapolacji. –

+1

Połączenie z plikiem programu Excel nie jest tą samą metodą, ale można to zrobić przy użyciu połączenia ADO. Myślę, że wymagałoby to innego pytania niż odpowiedzi w komentarzu. –

2

jest to możliwe.

Bez vba użyjesz karty DATA i zaimportujesz ze źródła tekstu.

z VBA można otworzyć plik CSV jako nowy skoroszyt:

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) 

Teraz można poruszać się tym skoroszycie jak każdy inny i kopiowanie wierszy, kolumn lub cały arkusz;) nadzieję, że to pomaga.

Innym sposobem byłoby użycie importu z tekstu w wersji vba, ale nie mam od razu przykładu.

1

Istnieje wiele sposobów na uzyskanie danych w programie Excel. Querytables (jak pokazuje The_Barman), SQL, Kreator importu itp.

Zwykle metoda zależy od tego, jak czyste są dane prezentowane na plikach, które należy zaimportować, i jeśli wiesz dokładnie, jak się to układa. Np. Jeśli są puste wiersze, mieszane typy danych, scalone komórki itd., Może to być koszmar.

Poniżej znajduje się wolniejsza metoda "brute-force", która zazwyczaj pobiera wszystkie dane, otwierając najpierw plik w Excelu. Często jest to ostatnia rzecz, gdy inne metody zawodzą.

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 
0

Jeśli masz zamiar użyć QueryTable upewnij się, posprzątać po, resztki tabele zapytań sprawiało mi kilka bólów głowy u dalszego procesu.

' 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: 
Powiązane problemy