プロが教える店舗&オフィスのセキュリティ対策術

エクセルVBAでcommit,rollback
初めて質問させていただきます。
エクセルVBAを一人で学習しています。
仕事で使ったことも、教えてもらったこともほとんどありませんのでほぼ初心者です。

今、エクセルファイルを二つ使って、一つをデータベースに、もう一つでそのデータベースを
利用するようなプログラムを書いています。
それで、2つの関連するテーブル(シート)を同時に変更(update)する必要があるのですが、
何らかのエラーが起きてしまったときのことを考えて、トランザクションを利用
出来たらと思っています。
いろいろググってアクセス用のコードを見つけたので、それを元に下のようなプログラムを
書いて試してみたのですが、ロールバックが効かずに更新されてしまいます。


'******** 定数 ***********
Const cnsProvider = "Microsoft.Jet.OLEDB.4.0"
Const cnsExtProp = "Extended Properties"
Const cnsExcel = "Excel 8.0"
Const cnsDBName = "SAMPLE_DB.xls"
Const cnsYen = "\"

'******** プログラム ***********
Sub ADO_update_test()

Dim dbCon As ADODB.Connection
Dim strSQL As String

' -- Connection生成 --
Set dbCon = New ADODB.Connection
With dbCon
.Provider = cnsProvider
.Properties(cnsExtProp) = cnsExcel
.Open ThisWorkbook.Path & cnsYen & cnsDBName
End With

' -- トランザクション開始 --
dbCon.BeginTrans

' -- sql作成 --
strSQL = "update [Sheet1$] set 金額 = 300 where ID = '001';"

' -- sqlを流す --
dbCon.Execute (strSQL)

' -- rollback --
dbCon.RollbackTrans

' -- クローズ・コネクション解放 --
dbCon.Close: Set dbCon = Nothing

End Sub



1、まずこの様なことが可能なのかどうか
2、出来るとしたらどのようにすればいいのか(間違っている点を指摘してください)

以上の2点についてお答えをいただけるとありがたいです。
よろしくお願いいたします。

A 回答 (3件)

トランザクション処理はデータベースの機能で、ロールバック


ポイントからの変更履歴をメモリ上に保持するわけで、Excel
にも、ADODB にもそんな機能は無いはずです。

Excel は表計算ソフト。ADODB はデータベースへ命令する為の
関数群。どちらもデータベースではありませんので。

例えば、SQL サーバーで同様の処理をした場合、Execute で
実行していてもロールバックできます。
http://support.microsoft.com/kb/198024/ja

まぁ、Excel はファイルなので、保存しないで開きなおせば
元に戻るのは正しいと思いますが、データベースのトランザ
クション処理とは全く関係なくなりますね^^;
    • good
    • 1
この回答へのお礼

早速の回答ありがとうござます。
ADODBというものの存在を知ってどこまで出来るのかを知りたかったのですよ。
やはりデータベースソフトでないものはトランザクション適応はできないのですね。

自分でプログラムを組まずにデータの出し入れが出来たらと
虫のいいことを考えての試行だったのですが、やっぱり無理なようで。
あきらめて自分でエラーを拾ってブックのオープンクローズで対応する
プログラムを組むことにします(^^;)

お礼日時:2010/09/22 17:54

>1、まずこの様なことが可能なのかどうか



問題は、書き換わるタイミングですが、
> dbCon.Execute (strSQL)
ここで、UPDATEで、実行して保存しているわけですから、RollBackTrams しても、戻らないのではないかなって思います。たぶん、何か、Openの時の設定が抜けているのではないかとは思いますが、私は、あまりこの方面は詳しくないので分かりません。

ここにコードはありましたが、どう結びつけてよいか分かりません。
http://msdn.microsoft.com/ja-jp/library/cc364106 …
戻すということは、キャッシュか何かに保続されているということになるわけですね。

現実の解決策としては、それは、ブックを開きさえすれば、値は変わっても、保存するかどうか聞いてきますので、保存せずに閉じれば、変更前に戻ります。しかし、これでは、個々の変更には対応できません。もちろん、Where で検索しているのだから、前もって値を取って、それを戻す方法は可能ですね。

あまり良い方法だとは思いませんので、もう少し、こちらも研究してみます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
私もプログラミング自体がほぼ素人なので、いろいろサイトから仕入れた知識しかないので
はっきりと言えないのですが、
トランザクション開始→SQL流す→ロールバックorコミット(決定)
と言うのがデータベースへの出力への流れと思っているのですが、間違っていましたか?
でも、この流れ出ないと意味がないような・・・。

まあ、他の方へのお礼のコメントにも書きましたが、どうもエクセルでやろうってのが
無理があるようですが(^^;)
多分エクセルでやるにはブックのオープンクローズを利用するしか手はないと思われます。
ホントはこれがめんどかったのでADOなるものの存在を知って利用できないかと
思っていたのですが。
仕方ないのでがんばって自分でエラー拾ってロールバックするプログラム書きます(TT)

お礼日時:2010/09/22 18:06
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
こちらのページはこのプログラムを考えているときに参考にさせていただいた一つです。
ですが、エクセルを対象にしての~というものではなさそうで、細かいことに関しては
私のほしい情報がありませんでしたので、こちらに質問の投稿をさせていただきました。
アクセスが自宅にないので、出来ればエクセルでと考えていたのですが、どうもやっぱり
無理なようでしたね(^^;)

お礼日時:2010/09/22 18:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A