Excelファイルをテキストボックスに表示 |
DAOでExcelデータを読み込みテキストボックスに表示 (237) 動作確認 : WindowsXP(SP2) VB6.0(SP6) |
|
|
下記のような3列10行のExcelファイルを準備しておいて下さい。 '1.DAOでExcelファイルを読み込みテキストボックスに表示 Option Explicit Private Sub Command1_Click() '参照設定でMicrosoft DAO 3.6 Object Library にチェックを入れておいて下さい。 Dim DB As DAO.Database '転載禁止 Dim RS As DAO.Recordset '転載禁止 Dim xlFileName As String '転載禁止 Dim xlSheetName As String '転載禁止 Dim MyData As String '転載禁止 List1.Visible = False '読込用のExcelファイル(パスを間違えないように) xlFileName = "..\Sample.xls" '転載禁止 xlSheetName = "Sheet1" & "$" '転載禁止 'データベース(xlFileName)のオープン(HDR=YES で1行目を読込まない。下記参照) Set DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO;IMEX=1") 'Recordsetオブジェクトのオープン'載禁止 Set RS = DB.OpenRecordset(xlSheetName) '末尾レコードまでのデータを読込転載禁止 Do Until RS.EOF With RS 'A列・B列・C列のデータを取得'転載禁止 MyData = MyData & .Fields(0) & vbTab & .Fields(1) & _ vbTab & .Fields(2) & vbCrLf .MoveNext '転載禁止 '次のレコードに移動 End With Loop '取得したデータをテキストボックスに表示 Text1.Text = MyData RS.Close DB.Close Set RS = Nothing Set DB = Nothing End Sub 接続文字列のオプション IMEX の意味と結果 0 はエクスポートモードです。 1 はインポートモードです。 2 はリンクモード (完全な更新が可能) です。 省略すれば 2 と同じようです。 HDR=NO 1行目を読み込んで表示する。 HDR=YES 1行目を読み込まない。 (詳しくは下記、※1. を見て下さい。) 組合せによる表示状態(※テキストボックスに表示した場合) IMEXの値 HDR=NO HDR=YES 省略 1行目を読込まない 1行目を読込む 0 1行目を読込まない 1行目を読込まない 1 1行目を読込まない 1行目を読込む 2 1行目を読込まない 1行目を読込む IMEX=0 の場合 HDR=NO HDR=YES 共、下記のように表示されます。 IMEX=1 HDR=NO の場合 IMEX=1 HDR=YES の場合 IMEX=2 又は省略 HDR=NO の場合 IMEX=2 又は省略 HDR=YES の場合 IMEX=0 及び IMEX=2 及び省略した場合、同じ列に異なったデータ型が存在すると、8行目までで多い方のデータ型で表示されそれ以外は表示されない。 IMEX=1 に設定するとデータ型が混在すると文字列型で読み込む (詳しくは下記、※2. を見て下さい。) '2.DAOによるExcel用データの編集 Private Sub Command2_Click() '参照設定でMicrosoft DAO 3.6 Object Library にチェックを '入れておいて下さい。 'B列の3行目のセルの内容を書換 Dim DB As DAO.Database '転載禁止 Dim RS As DAO.Recordset '転載禁止 Dim xlFileName As String Dim xlSheetName As String List1.Visible = False xlFileName = "..\Sample.xls" xlSheetName = "Sheet1" & "$" '転載禁止 Set DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO") '又は、 'Set DB = OpenDatabase(xlFileName, False, False, "Excel 8.0;HDR=NO;IMEX=2") Set RS = DB.OpenRecordset(xlSheetName) With RS .MoveFirst '転載禁止 '最初のレコードに移動 .Move CLng(2) '転載禁止 '3行目に移動 .Edit '転載禁止 '現在ポイントされている行の編集開始 .Fields(1) = Text2.Text '転載禁止 'B列を編集 .Update '転載禁止 '変更内容を保存 .Close '転載禁止 'オブジェクトを閉じる End With DB.Close Set RS = Nothing Set DB = Nothing Command1.Value = True End Sub これで、Excelを使用しなくてもSample.xlsファイルが書換えられます。 (上記を実行することで書換えて保存された) '3.DAOによるExcelファイルのシート名の読込 Private Sub Command3_Click() '参照設定でMicrosoft DAO 3.6 Object Library にチェックを '入れておいて下さい。 'Excelのシート名及びシート数を高速に取得 Dim DB As DAO.Database Dim Tbl As DAO.TableDef Dim xlFileName As String '転載禁止 Dim nCount As Long List1.Clear List1.Visible = False xlFileName = "..\Sample.xls" '転載禁止 Set DB = OpenDatabase(xlFileName, True, True, "Excel 8.0;") For Each Tbl In DB.TableDefs '転載禁止 ' Debug.Print Tbl.Name 'If (Tbl.Attributes And dbSystemObject) Then If Right$(Tbl.Name, 1) = "$" Or Right$(Tbl.Name, 2) = "$'" Then '名前ボックス等に表示される範囲名等を除く転載禁止 'ワークシート名には自動的にシート名の後ろに $ が付くので List1.AddItem Tbl.Name nCount = nCount + 1 'シート数を取得する場合 End If Next Tbl List1.Visible = True List1.Move 150, 270, 2445, 2040 DB.Close '転載禁止 Set DB = Nothing '転載禁止 MsgBox "合計 " & nCount & " 個のシートがありました。" 'DAO での取得の場合は、Excel上での並びと同じ並びで取得できます。 End Sub 因みに、Excelファイルを連続に10ファイル(120シート)読込んでテストしました。 従来のExcelの機能では 14.65秒かかりました。 DAOを使って取得した場合 0.36秒で取得できました。 'エクセルのシート名の取得(従来からの方法) Dim i As Long For i = 1 To xlBook.Worksheets.Count '転載禁止 Debug.Print xlBook.Worksheets(i).Name Next i '又は Dim Sheet As Excel.Worksheet For Each Sheet In xlBook.Worksheets '転載禁止 Debug.Print Sheet.Name Next |
注 意 コード中の "Excel 8.0;HDR=NO;") Excel 8.0 はお使いのExcelのバージョンに変更しないで下さい 又、Excelが導入されていない環境でも動作するはずです。 この他 DAO(データアクセスオブジェクト)を使ってExcel 用ファイルをMSFlexGridに表示する も見て下さい。 今回は、Excelファイルを読み込んでおりますが、HTML形式の表やCSV形式・テキスト形式のファイルも同様に扱えるようです。 ※1.最初の行にヘッダーが含まれない場合は、接続文字列の拡張プロパティに HDR=NO と指定します。接続文字列に HDR=NO と指定すると、Jet OLE DB プロバイダーによってフィールドに自動的に名前が付けられます (最初のフィールドは F1、2 番目のフィールドは F2 など)。 これにより通常のExcelファイルの場合1行目からデータとして扱われるので画面に表示されます。逆にHDR=YESの場合、通常のExcelファイルの場合1行目がヘッダーとして扱われるので、2行目のデータからしか表示されない。 (1行目は、項目行としてヘッダー部分に表示される) HDR=YES HDR=NO の設定は、先頭行をヘッダーとして読み込むかどうかの設定で、先頭行を読み込んで表示するか、しないかの設定ではないので、その点注意して下さい。 従って、表示するコントロールにヘッダー部分を表示する設定がある場合と、無い場合でも結果が変わってきますのでご注意願います。 ※2. デフォルトでは8行目までのデータで多い方のデータ型で設定します。 オプション機能の IMEX=1; を追加 "Excel 8.0;HDR=YES;IMEX=1;" すれば8行目までのデータ が同一カラム(列)内に異種データ型が混在している場合 テキスト型として扱います。 従って、そのような可能性があるカラムには1行目に文字列を入力しておくとか、項目名を必要な データ型で作成するとか、項目を読み込まないとか、レジストリでデフォルトの8行の設定を変更 する等で対処して下さい。 IMEX=1 を設定する場合、注意して下さい。インポートモードなのでデータの追加や更新を行った場合、予期しない結果になる可能性があります。 又、CSV 形式や TXT 形式のファイルの場合の、型指定は SCHEMA.INI ファイルを使用する事でできます。SCHEMA.INI については http://www.akj.co.jp/aug/qa/ans0001-0050/0315.html を参考にして下さい。 又、ADO でも上記と同様にExcelファイルを操作する事ができます。 |