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

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

ただいまの
回答率

90.47%

  • VBA

    1865questions

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

  • Excel

    1597questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,833

amipple

score 2

Windows7 + Excel2010 でデータ集計のマクロを組んでいます。
集計マクロのブックとは別にデータのブックがあるので、集計時にブックを開いて ADO で接続して必要なデータを持ってきています。
    Dim wbTest As Workbook
    Dim cnWork As ADODB.Connection
    
    Set wbTest = Workbooks.Open("data.xlsx", , False, , "password")
    
    Set cnWork = New ADODB.Connection
    cnWork.Provider = "MSDASQL"
    cnWork.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & wbTest.FullName & "; ReadOnly=false;"
    cnWork.Open
としているのですが、起動している Excel のインスタンスが2つあるときに cnWork.Open が正しく動作しません。

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

その結果、

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

という状態になってしまうのですが、回避する方法はあるのでしょうか?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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 12: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 を使用したクエリ発行などの操作も問題なく行われます。

    キャンセル

  • 2015/05/29 18: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
     もしかしたら、掲示のコードのでもとは、ココかな??

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/29 12:43

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • VBA

    1865questions

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

  • Excel

    1597questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。