Excelにデータを取得する方法はたくさんあります。 QueryTables(The_Barmanのデモンストレーション)、SQL、インポートウィザードなど
通常、このメソッドは、インポートする必要のあるファイルにデータがどのくらい表示され、どのようにレイアウトされているかを正確に把握しています。たとえば、空の行、混合データ型、マージされたセルなどがある場合、それは悪夢になる可能性があります。
以下は、通常は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
私はこれをエクセルシートにしようとしていると具体的に言いましたが...タグとExcelとExcelとExcelがアプリケーションIであるという兆候になると考えましたExcel-VBAは可能性がありました...解決策です。もし私が別のアプリを使ってこれをやろうとすれば、おそらく私は言っただろう... –
はい、それはExcelがアプリケーションであることが明らかでした。 C#やVB.Netのようなものに別のスタンドアロンアプリを書くことを含むかもしれないし、おそらくSQL Serverを使用するより大きなアプリケーションの一部として使用することを望むかもしれない* external *メカニズムは明らかではなかった。あなたはあなたのシステムを知っています。私たちはしません。私は本当にここで助けて楽しんでいますが、助けを提供しようとしているときにこのような反応はあまり励みにはなりません。あなたのプロジェクトに幸運。 –
もしC#とVB.Netがあるとすれば、それはタグに入れられます...私は物事を求めているときに私はかなりlitteralです。 –