[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/12/22(Fri) 10:34
投稿者名:ぴろ
Eメール:
URL :
タイトル:
DAOでのExcelのデータ取得について
はじめて投稿させていただきます、ぴろと申します。
<環境>
Windows2000/XP
Excel2000/2003
VB6.0 SP5

ファイル自体への保護がかかっているExcelファイルから
データ取得を行いたいと思っています。
(Excelはマクロを含んでいます。)

DAOでの取得を考え実行してみたのですが、
「3161 ファイルを解読できませんでした。」
とエラーが発生し、思うようにデータ取得を行えませんでした。

その為、Excelファイルを一度オープン(パスワード指定)し、
パスワード解除を行ってからDAOでのデータ取得をしてみました。
すると、データはうまく取得することができたのですが、
Excelのプロセスが残ってしまいます。
プロセスを残さずに終了させることができないでしょうか。
どなたか、ご教示ください。よろしくお願いします。

<ソース>
Dim objExcel As Object
Dim objExWork As Object
Dim daoDB As DAO.Database
Dim tb As DAO.Recordset
Set objExcel = CreateObject("Excel.Application")

'マクロイベント停止
objExcel.EnableEvents = False

'Excelファイルオープン
Set objExWork = objExcel.Workbooks.Open("C:\test.xls", , , , "pass")

'DAOオープン
Set daoDB = DAO.DBEngine.Workspaces(0).OpenDatabase("C:\test.xls", _
                                       False , _
                                       True, _
                                       "EXCEL 8.0")
Set tb = daoDB.OpenRecordset("SELECT 〜", dbOpenDynaset)
Do While Not tb.EOF
    Debug.Print tb("項目名")
    tb.MoveNext
Loop
tb.Close
daoDB.Close

objExWork.saved = True
objExWork.Close
objExcel.Quit
Set objExWork = Nothing
Set objExcel = Nothing
Set tb = Nothing
Set daoDB = Nothing

投稿時間:2006/12/22(Fri) 11:11
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: DAOでのExcelのデータ取得について
DAO を使わず、そのまま Excel オートメーションだけで読み取ればよいのでは?


> DAOでの取得を考え実行してみたのですが、
> 「3161 ファイルを解読できませんでした。」

その点は、Excel I-ISAM の制限となっています。

[Working with Microsoft Excel Worksheets and Workbooks]
| The Microsoft Excel product line includes the following
| single-sheet worksheet and multiple-sheet workbook versions
| supported by the Microsoft Jet IISAM driver for Microsoft Excel:
| Microsoft Excel 3.0 and 4.0 (single-sheet) and Microsoft Excel
| 5.0, 7.0, and 8.0 (multiple-sheet workbooks). There are a few
| operations that you cannot perform on Microsoft Excel worksheets
| or workbooks through the Microsoft Excel IISAM driver:
| * You cannot delete rows from Microsoft Excel worksheets or
|   workbooks.
| * You can clear data from individual cells in a worksheet, but
|   you cannot modify or clear cells that contain formulas.
| * You cannot create indexes on Microsoft Excel worksheets or
|   workbooks.
| * You cannot read encrypted data through the Microsoft Excel
|   IISAM driver. The PWD argument in the connection string cannot
|   be used to open an encrypted worksheet or workbook, even if
|   you supply the correct password. You must decrypt all
|   Microsoft Excel worksheets or workbooks through the Microsoft
|   Excel user interface if you plan to link or open them in your
|   Microsoft Jet database.

投稿時間:2006/12/22(Fri) 11:18
投稿者名:ぴろ
Eメール:
URL :
タイトル:
Re^2: DAOでのExcelのデータ取得について
魔界の仮面弁士様ご返信ありがとうございます。

> DAO を使わず、そのまま Excel オートメーションだけで読み取ればよいのでは?
>
最終的な回避策としては考えております。
しかし、取得したいデータが少なくない為、処理速度が速いデータ取得法がないかと
試行錯誤しております。
やはり、DAOでは難しいのでしょうか?

投稿時間:2006/12/22(Fri) 11:30
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: DAOでのExcelのデータ取得について
DAO がオブジェクトを掴んでしまうのかな……。
DAO を参照設定せず、レイトバインドコードで書いてみたらどうなりますか?

もしくは、
 1. まずは、オートメーションで「保護を解除」して保存してから、
 2. Excel オブジェクトを解放。これで Excel が生き残っていなければ、
 3. あらためて DAO で読み込んで利用し、それが終わったら、
 4. オートメーションにて、再度、パスワードを設定しなおす。
とか。

投稿時間:2006/12/22(Fri) 14:02
投稿者名:ぴろ
Eメール:
URL :
タイトル:
Re^4: DAOでのExcelのデータ取得について
魔界の仮面弁士様、ご返信ありがとうございます。

> もしくは、
>  1. まずは、オートメーションで「保護を解除」して保存してから、
>  2. Excel オブジェクトを解放。これで Excel が生き残っていなければ、
>  3. あらためて DAO で読み込んで利用し、それが終わったら、
>  4. オートメーションにて、再度、パスワードを設定しなおす。
> とか。
>
思うとおりの結果を得ることができ、プロセスも残りませんでした。
Excelのオープン、保存に多少の時間がかかってしまいますが
こちらの手法を使用しようかと思っています。
ありがとうございます。


> DAO を参照設定せず、レイトバインドコードで書いてみたらどうなりますか?
>
当方勉強不足の為、DAO を参照しない場合に下記ロジックを
どのように記述すればいいのかわかりませんでした。

Set daoDB = DAO.DBEngine.Workspaces(0).OpenDatabase("C:\test.xls", _
                                        False , _
                                        True, _
                                        "EXCEL 8.0")
Set tb = daoDB.OpenRecordset("SELECT 〜", dbOpenDynaset)

参考までに、どのように記述すればいいのかご教授願えませんでしょうか。
よろしくお願いします。

投稿時間:2006/12/22(Fri) 14:45
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: DAOでのExcelのデータ取得について
> 参考までに、どのように記述すればいいのかご教授願えませんでしょうか。

Set DE = CreateObject("DAO.DBEngine.36")
Set WS = DE.CreateWorkspace("", "Admin", "")
Set DB = WS.OpenDatabase("C:\test.xls", False , True, "EXCEL 8.0")


あとは一緒。

投稿時間:2006/12/22(Fri) 15:22
投稿者名:ぴろ
Eメール:
URL :
タイトル:
【解決】DAOでのExcelのデータ取得について
魔界の仮面弁士様、ご返信ありがとうございます。

> > 参考までに、どのように記述すればいいのかご教授願えませんでしょうか。
>
> Set DE = CreateObject("DAO.DBEngine.36")
> Set WS = DE.CreateWorkspace("", "Admin", "")
> Set DB = WS.OpenDatabase("C:\test.xls", False , True, "EXCEL 8.0")
>
>
> あとは一緒。
>
上記ロジックに置き換え、DAO 参照を行わずに実行してみましたが
プロセスが残ってしまいました。
ファイルオープン、クローズだけの場合にはExcelのプロセスも残らず
正常に終了しますので、やはりDAO が絡むと問題が発生するようです。

前回ご教授いただいた方法で実装しようと思います。
魔界の仮面弁士様、ありがとうございました。