

エクセル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点についてお答えをいただけるとありがたいです。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
トランザクション処理はデータベースの機能で、ロールバック
ポイントからの変更履歴をメモリ上に保持するわけで、Excel
にも、ADODB にもそんな機能は無いはずです。
Excel は表計算ソフト。ADODB はデータベースへ命令する為の
関数群。どちらもデータベースではありませんので。
例えば、SQL サーバーで同様の処理をした場合、Execute で
実行していてもロールバックできます。
http://support.microsoft.com/kb/198024/ja
まぁ、Excel はファイルなので、保存しないで開きなおせば
元に戻るのは正しいと思いますが、データベースのトランザ
クション処理とは全く関係なくなりますね^^;
早速の回答ありがとうござます。
ADODBというものの存在を知ってどこまで出来るのかを知りたかったのですよ。
やはりデータベースソフトでないものはトランザクション適応はできないのですね。
自分でプログラムを組まずにデータの出し入れが出来たらと
虫のいいことを考えての試行だったのですが、やっぱり無理なようで。
あきらめて自分でエラーを拾ってブックのオープンクローズで対応する
プログラムを組むことにします(^^;)
No.2
- 回答日時:
>1、まずこの様なことが可能なのかどうか
問題は、書き換わるタイミングですが、
> dbCon.Execute (strSQL)
ここで、UPDATEで、実行して保存しているわけですから、RollBackTrams しても、戻らないのではないかなって思います。たぶん、何か、Openの時の設定が抜けているのではないかとは思いますが、私は、あまりこの方面は詳しくないので分かりません。
ここにコードはありましたが、どう結びつけてよいか分かりません。
http://msdn.microsoft.com/ja-jp/library/cc364106 …
戻すということは、キャッシュか何かに保続されているということになるわけですね。
現実の解決策としては、それは、ブックを開きさえすれば、値は変わっても、保存するかどうか聞いてきますので、保存せずに閉じれば、変更前に戻ります。しかし、これでは、個々の変更には対応できません。もちろん、Where で検索しているのだから、前もって値を取って、それを戻す方法は可能ですね。
あまり良い方法だとは思いませんので、もう少し、こちらも研究してみます。
回答ありがとうございます。
私もプログラミング自体がほぼ素人なので、いろいろサイトから仕入れた知識しかないので
はっきりと言えないのですが、
トランザクション開始→SQL流す→ロールバックorコミット(決定)
と言うのがデータベースへの出力への流れと思っているのですが、間違っていましたか?
でも、この流れ出ないと意味がないような・・・。
まあ、他の方へのお礼のコメントにも書きましたが、どうもエクセルでやろうってのが
無理があるようですが(^^;)
多分エクセルでやるにはブックのオープンクローズを利用するしか手はないと思われます。
ホントはこれがめんどかったのでADOなるものの存在を知って利用できないかと
思っていたのですが。
仕方ないのでがんばって自分でエラー拾ってロールバックするプログラム書きます(TT)
No.1
- 回答日時:
ご回答ありがとうございます。
こちらのページはこのプログラムを考えているときに参考にさせていただいた一つです。
ですが、エクセルを対象にしての~というものではなさそうで、細かいことに関しては
私のほしい情報がありませんでしたので、こちらに質問の投稿をさせていただきました。
アクセスが自宅にないので、出来ればエクセルでと考えていたのですが、どうもやっぱり
無理なようでしたね(^^;)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) モードレスでユーザーフォームが開け(表示)ません。 4 2022/09/09 11:05
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
「Columns(A:C")」の列文字を数字にして表記したい"
Excel(エクセル)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
-
4
Accessデータベースの最適化をExcelVBAでやりたい
その他(データベース)
-
5
VBAでCSVファイルが使用中かどうかの確認
Visual Basic(VBA)
-
6
access vbaにてテンポラリーテーブルが作りたいです。
Access(アクセス)
-
7
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
-
8
オートフィルターとExcelマクロの連動方法について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
階層型データベースとVSAM...
-
SQLのデータベースに韓国語を登...
-
Access2010でリボン等を非表示...
-
SQLPlusでUnicode
-
WWWでデータベースを作成したい...
-
Windows版 pg_dumpの結果をログ...
-
ディスク上のサイズの乖離が大...
-
oracle spool SJIS → UTF-8
-
Query OK, 0 rows affected
-
ファイルに記述されている複数...
-
新規作成したPostgresqlデータ...
-
SJISのDBは作れますか?
-
Windows上のPostgreSQLの完全削...
-
LinuxからWindowsへのリストア...
-
tar.gzファイルのリストアについて
-
PostgreSQLからSQLServerへの移行
-
socket のエラー
-
テーブル単位のリストア
-
SQLServerへの接続子による違い...
-
ユーザー作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのフォームだけを起動す...
-
アクセスで、OLEサーバーも...
-
階層型データベースとVSAM...
-
ACCESSのレコードを削除しても...
-
エクセルVBAでcommit,rollback
-
SQLのデータベースに韓国語を登...
-
SQLiteファイルへの同時アクセ...
-
データベースが開けません
-
SQLPlusでUnicode
-
ACCESS2003の共有について
-
C#上でデータベースのコピーを...
-
HTMLからのデータベース アクセス
-
データベース型アプリの設計に...
-
PostgresQLでサーバーを新規追...
-
学校にデータベースを導入
-
ACCESS+MSDE
-
PostgresQLでサーバーを新規追...
-
ディスク上のサイズの乖離が大...
-
Windows上のPostgreSQLの完全削...
-
Windows版 pg_dumpの結果をログ...
おすすめ情報