4

私はデータベースバックエンドを必要とするExcelアプリケーションに取り組んでいます。私の好みは、SQLite 3を使用し、これをエンドユーザーにとって可能な限りシームレスでポータブルにすることです。

最近、Excel2007ファイルは単にxlsm拡張子の付いたzipアーカイブであることがわかりました。私の質問はこれです。バックエンドのSQLite3データベースをZipアーカイブに保存し、ODBCを使用してデータベースと対話できますか。もしそうなら、誰かが私にこの目的を達成するためのいくつかの背景情報、記事、ガイダンスを教えてもらえますか?このアプローチの欠点や、私が知っておくべきより良い代替案はありますか?

ご入力いただきありがとうございます。

4

4 に答える 4

4

いくつかのメモ。これまでのところ、ファイルが開かないという苦情はありません。ADO コードが実行される前に、Excel ファイルが保存されることに注意してください。

非常に隠されています:

ThisWorkbook.Worksheets("Courses").Visible = xlVeryHidden
ThisWorkbook.Worksheets("System").Visible = xlVeryHidden

コードのスニペット:

    Const gCN = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="

<...>

Set rs = CreateObject("ADODB.Recordset")
Set cn = CreateObject("ADODB.Connection")
Set fs = CreateObject("Scripting.FileSystemObject")

scn = gCN & ThisWorkbook.FullName _
& ";Extended Properties=""Excel 8.0;HDR=Yes;"";"

cn.Open scn

''If they do not have an ID, they do not exist.

sSQL = "SELECT ID,FirstName,LastName, " _
& "CourseName,AdditionalText,Format(ExpiryDate,'dd/mm/yyyy') As ExpiryDate " _
& "FROM [Applicants$] WHERE DateCancelled Is Null AND ID Is Not Null " _
& "AND (FirstName Is Null OR LastName Is Null Or CourseName Is Null " _
& "Or ExpiryDate Is Null) " & sWhere

rs.Open sSQL, cn

参考文献:

Excel ADO
接続文字列

Jet で使用できるメソッドのほとんどは、Excel でも使用できます。

基本 Microsoft Jet SQL for Access 2000
中級 Microsoft Jet SQL for Access 2000
上級 Microsoft Jet SQL for Access 2000

コメントを編集

リークが特に悪いとは思いませんでしたが、多くの反復を実行したわけではなく、これは非常に優れたマシンです.

以下のコードでは、DAO を使用しているため、メモリ リークは発生しません。

'Reference: Microsoft Office 12.0 Access Database Engine Object Library
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sDb As String
Dim sSQL As String

sDb = ActiveWorkbook.FullName

Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(sDb, False, True, "Excel 8.0;HDR=Yes;")

sSQL = "SELECT * FROM [Sheet1$];"
Set rs = db.OpenRecordset(sSQL)

Do While Not rs.EOF
    For i = 0 To rs.Fields.Count - 1
        Debug.Print rs.Fields(i)
    Next

    rs.MoveNext
Loop

rs.Close
db.Close
ws.Close

 'Release objects from memory.
Set rs = Nothing
Set db = Nothing
Set ws = Nothing

謝辞: http://www.ozgrid.com/forum/showthread.php?t=37398

于 2012-11-02T13:44:35.903 に答える
2

これが代替案です。

1) Open (VBA のイベント) で、Excel .xlsm、sqlite、および dbFile から解凍します。

2)あなたが何を処理するか.....

3) 保存時 (VBA の EVENT) で、本を保存し、Excel .xlsm 、sqlite 、dbFile を Excel .xlsm に添付します。

于 2013-07-05T21:06:53.923 に答える
1

Excel はファイルを保存するたびにファイルを書き換えるので、自分で追加したファイルは削除されます。さらに、zip アーカイブ内のデータベース ファイルにアクセスできる SQLite ドライバーはありません。

データベース ファイルを Excel ファイルと一緒に出荷するか、DB ファイルが見つからないことをアプリケーションが検出したときに、SQL コマンドのリストを使用してデータベースを再作成する必要があります。
これには、SQLite (ODBC) ドライバーがユーザーのマシンにインストールされている必要があります。

Remou が述べたように、データを Excel ファイルに保存する最もシームレスでポータブルな方法は、データを Excel シートに保存することです。ただし、ファイルが既に Excel で開かれている場合、ADO ドライバーがそのファイルを開くことを拒否する可能性があるため、Excel 関数を使用してデータにアクセスする必要があります。

于 2012-10-31T10:03:22.927 に答える
0

http://code.google.com/p/pyinex/を使用してみてください 。これにより、PythonインタープリターがExcelに埋め込まれます。

于 2012-11-06T09:52:52.800 に答える