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
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 ... –
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. –
Gdyby miały być C# i VB.Net, chciałbym umieścić to w tagach ... Jestem dość ostry, gdy pytam o rzeczy. –