• ベストアンサー

Excelデータの検索

1.コモンダイアログを開く 2.パス上のExcelファイルを取得 3.VB上で取得したデータベースのファイルと比較したいのですが。 1.のところは分かるのですが、VB上からExcelのデータの取り方がわかりません。 参考urlか関連ソースを教えてください。 VB.NET,SQL Server 2005を使用

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

3.のロジックとコードは、質問者の領分です。 VB.NETでエクセルファイルを開くのは http://7ujm.net/VB/VBEXCEL.html  にコードがあります。 それを多少修正して、やってみました。 エクセルオブジェクト・ライブラリへの参照設定は済ます。 VB.NETのコンソールアプリケーションで Module Module1 Sub Main() Dim app As Object Dim book As Object Dim sheet As Object app = CreateObject("Excel.Application") app.Visible = True 'アプリケーションの非表示 'book = app.Workbooks.Add '新規作成 book = app.Workbooks.Open("C:\Documents and Settings\XXXX\My Documents\エクセル1.xls") 'ファイルを開く sheet = book.Worksheets(1) 'シート1を選択 Debug.WriteLine(sheet.Cells(1, 1).Value) '値を読み出す sheet.Cells(1, 1).Value = "111" 'A1セルに値を入力 sheet.Cells(2, 1).Value = "222" sheet.Cells(3, 1).Formula = "=A1+A2" 'A3に計算式を入力 MsgBox(sheet.Cells(3, 1).value.ToString()) book.Save() '上書き保存 'book.SaveAs("c:\test.xls") '名前をつけて保存 app.Quit() '終了 ' オブジェクトを解放します。 sheet = Nothing book = Nothing app = Nothing End Sub End Module ーーー フルパスの中のXXXXはユーザーID、エクセル・ファイル名は適宜に変更。 このエクセルファイルは閉じておくこと。 == .NETのメニューでデバッグー開始 A3セルの値がメッセージボックスに表示された。 また私の場合の「エクセル1.xls」のA1セルは111、A2セルは222、A3セルは 式=A1+A2が入り、値は333となっていることが確認できました。

その他の回答 (2)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.3

COMオブジェクトを使用してのアクセスは非常に遅く、かつCOMオブジェクトの開放漏れにより、EXCEL自体が正しく終了せずに残ってしまう可能性があります。 横槍申し訳ないのですが、COMオブジェの開放の仕方としてはimogasi様の書き方では不十分であり、EXCELが終了せずに野っこ手しまうと思います。 詳しくは以下をご覧ください。 Excel・Word・他(30)http://hanatyan.sakura.ne.jp/dotnet/index.html とりあえずVB上からExcelのデータの取り方がわかればよろしいでしょうか? OLEDBを使用して、データセットを作成する方法を紹介いたします。 私が作成したツールからの抜粋ですので、わかり図らいところは質問お願いいたします。 Dim filename As String = "エクセルパス" Dim cnstr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + filename + "; Extended Properties=Excel 8.0;" Dim cn As OleDbConnection = New OleDbConnection(cnstr) Dim dt As DataTable Dim tablename As String = Nothing 'シート名を取得する cn.Open() dt = cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) cn.Close() Dim flag As Boolean = False For Each dr As DataRow In dt.Rows 'Debug.WriteLine(dr(2)) If dr(2) = "探したいシート名$" Then flag = True tablename = dr(2) Exit For End If Next dt.Dispose() Dim dAdp As OleDbDataAdapter Dim dSet As System.Data.DataSet = New System.Data.DataSet Dim strSQL As System.Text.StringBuilder = New System.Text.StringBuilder 'A5:AP11000が取得範囲 '指定しなくてもよい strSQL.Append("SELECT * FROM [") strSQL.Append(tablename) strSQL.Append("A5:AP11000]") dAdp = New OleDbDataAdapter(strSQL.ToString, cn) dAdp.Fill(dSet) dAdp.Dispose() cn.Dispose() dt = dSet.Tables(0)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

こんにちは、 VB.NETを、使うのは必須なのですか。?? SQL SEVER 2005は、express版では、ないですよね。 データの比較だけでいいのなら、いろいろな、 vbから、直接excelを操作しなくとも、逃げ道があるような気もしますが。

shyadow
質問者

補足

VBを使うのは必須です。 SQL Server Management Studio Expressを使ってます。 データは比較というかserverのデータとExcelのデータを検索して ServerとExcelのデータでExcelにないデータ又はあるデータをAccessレポートに表示します