質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

7301閲覧

Excel2010 複数インスタンス起動時のADO接続

amipple

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2015/05/29 02:02

Windows7 + Excel2010 でデータ集計のマクロを組んでいます。
集計マクロのブックとは別にデータのブックがあるので、集計時にブックを開いて ADO で接続して必要なデータを持ってきています。

lang

1 Dim wbTest As Workbook 2 Dim cnWork As ADODB.Connection 3 4 Set wbTest = Workbooks.Open("data.xlsx", , False, , "password") 5 6 Set cnWork = New ADODB.Connection 7 cnWork.Provider = "MSDASQL" 8 cnWork.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & wbTest.FullName & "; ReadOnly=false;" 9 cnWork.Open

としているのですが、起動している Excel のインスタンスが2つあるときに cnWork.Open が正しく動作しません。

先に起動している Excel インスタンスを使って cnWork.Open しようとするらしく、マクロブックが後から起動したほうの Excel で開いている場合だけ、Workbooks.Open でもう一つの(先に起動しているほうの)Excel でデータのブックを開こうとしてしまいます。

その結果、

・Workbooks.Open でデータブックが開く(これはマクロと同じExcel上で開きます)

・cnWork.Open でもう一つのExcelでブックを開こうとする
→ パスワードを渡していないので、「'data.xlsx'は保護されています」のパスワード入力ダイアログが出る

という状態になってしまうのですが、回避する方法はあるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。
ExcelからExcelですよね?
ADOは対DBの接続になると思うのですが。。。ADO接続は必須ですか?

もし必須ではないのであれば、ADO接続しないでみたらどうでしょうか。
別ファイル取込処理->アンケート集計処理
が記載されているサイトをみつけたので、ご参考まで。

フォルダから全てのxlsファイルを読み込んで処理するVBAマクロ

こちらでは、フォルダ内のファイル全てを対象としているので、
そこを固定のファイル名とするとか、外からファイル選択できるようにするとか、
変更すれば、いけると思います。

投稿2015/05/29 02:59

kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amipple

2015/05/29 03:43

kaputaros さま ありがとうございます。 ADO 接続は、その後にクエリを発行して集計操作を行っているためのものなので、必要なのです。 こちらの説明に不備があり、申し訳ございません。
guest

0

思い込み、だろう、らしく、等ではなく、
1.Debug.Print などを使って、時系列で動作を確認してください。
2.または、ログ機能を実装して、ログが取れるようにして、確認してください。
3.別々のインスタンス(Excel.exe)で動いている事は、どの様に確認していますか?
4.Workbooks.Open の実行タイミングは、理解して使用していますか?
5.共通のマクロブック なるものが、独立して存在していますか?

例えば、次の様に説明してみてください。
cnWork.Open なる機能は、両方に実装されている。??
または、マクロブックに実装されている。??
その、実行タイミングは、 Workbooks.Openである。
但し、パスワードが指定されるのは、片方のインスタンスのみである。
開く順序は、
1.EXCEL.EXE起動、(マクロブックが自動で開く?)
2.1インスタンス目のブックを開く
3.1インスタンス目のブックでは、パスワード等を指定してある。
4.1インスタンス目のブックの、Workbooks.Open イベントで、
cnWork.Open なる機能を使って
ADOで、2インスタンス目と称するブックを開く
5.

投稿2015/05/29 02:41

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amipple

2015/05/29 03:41

daive さま ご指摘どうもありがとうございます。 > 3.別々のインスタンス(Excel.exe)で動いている事は、どの様に確認していますか? こちらは、マクロを開いていないほうの Excel に「'data.xlsx'は保護されています」のパスワード入力ダイアログが出ることで確認いたしました。 また、data.xlsx がパスワード付きでない場合は、そのまま開くのですが、 ```lang-vba Set wbTest = Workbooks.Open("data.xlsx", , False, , "password") ``` でまずマクロと同じ MDI の中でデータブックが開き、その後 ```lang-VBA cnWork.Open ``` でもう一つの Excel に同じデータブックが開くことを確認しております。(既に開かれているため、こちらは読み取り専用になります) > 4.Workbooks.Open の実行タイミングは、理解して使用していますか? についてですが、ADO で接続するときに、接続対象のブックが Excel 上で開いていないと Connection.Open でエラーになるため、Connection.Open の手前で開いておりました。 これが勘違いで、ADO 接続に対象の Workbooks.Open が不要ということでしょうか? 再現条件について、以下に記載いたします。 --- 1.Excel.exe を起動(instance A と呼称します) 2.Windowsのスタート > 「プログラムとファイルの検索」に「Excel」を入力 → Excel.exe がもう一つ起動される(instance B と呼称します) 3.マクロブックを instance B にドラッグ&ドロップして開く 4.マクロブック上の集計マクロ(質問文で記載した code)を実行 5.Set wbTest = Workbooks.Open("data.xlsx", , False, , "password") の行で 集計マクロと同じ instance B 上に data.xlsx が開くことを確認(これはOK) 6.cnWork.Open の行で instance A 上に「'data.xlsx'は保護されています」のダイアログが出ることを確認 → パスワードを入力すると instance A 上で data.xlsx が読み取り専用で開く --- となります。 Step 3 でマクロを開くインスタンスを instance A にすると、instance B には何も起こらないまま cnWork.Open が行われ、その後 ADO を使用したクエリ発行などの操作も問題なく行われます。
daive

2015/05/29 09:35

書込みから、およその動作は掴めました。 パスワード付ブックは、一旦開かないと、 ADOアクセスできない仕様の様子ですね。 パスワード付のまま、運用する前提の様ですから、 ’ 何らかの方法で、別インスタンスのEXCELブックへ、 パスワードを渡す方法が知りたい。 と、いう事になりますか? ’ その場合での一例 A案、ファイル渡し 何らかのファイル渡しが、簡便ですが。 パスワードですから、暗号化して書出ししたくなるはずです。 その場合は、Cript系ライブラリの使用をVBAからする事に なります。 B案、メッセージ渡し B1.Windows API で、別インスタンスのEXCELを特定して、   Messaging API などで、メッセージを送る。   作成時の、HWNDなどの特定には、Spy++などのツールを使います。   プロセスからも、辿る方法はあります。 B2.メモリーマップドファイルを使って、   メッセージをやり取りする。 C案、余り推奨されませんが、 別々のインスタンスにて、EXCELを開くのを辞めてしまって、 インスタンスA側から、CreateObject を使って、 EXCEL.exe を起動して、インスタンスB側を自動で開いてしまって、 EXCELオブジェクトを操作する。 これは、自由度は高いですが、 オブジェクトの解放漏れがあると、ゾンビ化したEXCEL.exe が残ります。 ’ 参考資料 Excel connection strings http://www.connectionstrings.com/excel/ Open a password-protected Excel workbook http://www.connectionstrings.com/how-to-open-password-protected-excel-workbook/ パスワード付きのエクセルファイルに接続する http://antonsan.net/study/excel/excel019.php  もしかしたら、掲示のコードのでもとは、ココかな??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問