- ベストアンサー
VBにExcelを読み込む
VBにExcelデータを取り込んでからSQL ServerにINSERTしたいんですが、 読み込みに時間がかかりすぎるんですが、どういったやり方だとうまくいきますか? データをまとめてVBに取得できればいいんですが。 Accessだとちょっと問題があって出来ない。 Private Sub Excel() Dim i, j As Integer Dim dSet As DataSet = New DataSet Dim dAdp As OleDb.OleDbDataAdapter Dim cn As OleDb.OleDbConnection Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim SQL As String Dim Seru1 As String Dim Seru2 As String Dim Seru3 As String cn = New OleDb.OleDbConnection( _ "provider=Microsoft.Jet.OLEDB.4.0; " & _ "data source='" & lblファイル.Text & "'; " & _ "Extended Properties=Excel 8.0;") '「Sheet1」シートのデータを取得する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", cn) dAdp.Fill(dSet) For i = 0 To dSet.Tables(0).Rows.Count() - 1 For j = 0 To dSet.Tables(0).Columns.Count() - 1 Debug.Write(dSet.Tables(0).Rows(i)(j) & ControlChars.Tab) Next Debug.WriteLine("") xlApp = CreateObject("Excel.Application") 'xlApp.Visible = True 'アプリケーションの表示 'Set book = app.Workbooks.Add '新規作成 xlBook = xlApp.Workbooks.Open(lblファイル.Text) 'ファイルを開く xlSheet = xlBook.Worksheets(1) 'シート1を選択 'Debug.WriteLine(xlSheet.Cells(1, 1).Value) '値を読み出す Seru1 = i Seru2 = i Seru3 = i If Not i = 0 Then If Not i = 1 Then sqlConn = objclass2.gFunc_OpenSqlConn() sqlCmd = sqlConn.CreateCommand() '初期化 imtxtExcelコード2.Text = "" imtxtExcel1.Text = "" imtxtExcelコード1.Text = "" '読み出し imtxtExcelコード2.Text = xlSheet.Range("A" + Seru1).Value imtxtExcel1.Text = xlSheet.Range("B" + Seru2).Value imtxtExcelコード1.Text = xlSheet.Range("C" + Seru3).Value SQL = "" SQL = SQL & "INSERT INTO W_Excel( " SQL = SQL & "コード1,コード2,備考 ) " SQL = SQL & "SELECT " SQL = SQL & "'" & imtxtExcelコード2.Text & "'," SQL = SQL & "'" & imtxtExcel1.Text & "'," SQL = SQL & "'" & imtxtExcelコード1.Text & "'" sqlCmd.CommandText = SQL sqlCmd.ExecuteNonQuery() End If End If xlSheet = Nothing xlBook.Close() 'Book を閉じる xlBook = Nothing xlApp.Quit() 'Quit メソッドを使って Excel を終了します。 xlApp = Nothing Next End Sub End Class
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ループの中で、何度もExcelアプリを起動して終了させるのはどうしてかなって ちょっと疑問です。 ループ前にExcelアプリを起動させておいて、ループ内ではブックのOpen・Closeを 行なえばいいのではないですか? ⇒それがスピードに影響するのかはわかりませんが・・・
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
>VBにExcelデータを取り込んでから VBは言語ではないの。言語に取り込むと言う表現は?? VBはVB.NET系らしいが明記を。まだ6.0と並存時代か? コードの中身はアクセスのテーブルに取り入れている? CSVファイルを作り、(出来ているならそれを直接対象にして) SQL ServerのSQLでINSERTの対象にすればどうでしょう。 書式なんてはSQLで扱うと考慮外(値だけ対象)になるから、それでよいのでは。一番処理が軽いのはテキストファイル類のはず。
お礼
一応スピードは速くなりました。 後、VB.NETでExcelを読み込んでるデータが明らかに合わないんですがどうしてなんでしょうか。 データ数が合いません。 ループの仕方が違うんですか? 本来:16行(A2:C17) 実際に読み込んでるデータ:13行 cn = New OleDb.OleDbConnection( _ "provider=Microsoft.Jet.OLEDB.4.0; " & _ "data source='" & lblファイル読込先.Text & "'; " & _ "Extended Properties=Excel 8.0;") '「Sheet1」シートのデータを取得する dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", cn) dAdp.Fill(dSet) xlApp = CreateObject("Excel.Application") xlApp.Visible = True 'アプリケーションの表示 'Set book = app.Workbooks.Add '新規作成 xlBook = xlApp.Workbooks.Open(lblファイル読込先.Text) 'ファイルを開く xlSheet = xlBook.Worksheets(1) 'シート1を選択 For i = 0 To dSet.Tables(0).Rows.Count() - 1 For j = 0 To dSet.Tables(0).Columns.Count() - 1 Debug.Write(dSet.Tables(0).Rows(i)(j) & ControlChars.Tab) Next Debug.WriteLine("") Debug.WriteLine(xlSheet.Cells(2, 1).Value) '値を読み出す