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ファイルを操作する事ができます。


2003/01/24
2006/12/17


VBレスキュー(花ちゃん)
Visual Basic6.0  VB6.0