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

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

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

Q&A

解決済

3回答

2164閲覧

Excelすでにブックをオープンしているか知りたい

starwada

総合スコア7

0グッド

0クリップ

投稿2017/12/05 05:54

編集2017/12/06 01:34

###前提・実現したいこと
VC++にてExcelに出力しています。
編集したいブックがすでにオープンされているか知りたいのです。
2重にオープンした場合、保存時に問い合わせのメッセージが表示されますので、
そのようにならないようにオープン時に判断したいのです。
ご存知のかたがおられましたら宜しくお願いします。

###試したこと
ファイルアクセスやファイルオープンを試してみましたが、
すでにオープンされているのか判別できませんでした。
access()、stat()でファイルの状態が取得できるかと思いましたがだめでした。
Excel::_WorkbooksPtr::Open()のReadOnlyをFALSEで実行しても問題なくオープンできてしまいます。

プロセスを見るしかないのでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
Excelは以下にて取得しています。

// Open the MS Excel application if( FAILED( CLSIDFromProgID( L"Excel.Application", &clsid ) ) ) { bExcel = false; } if( FAILED( CoCreateInstance( clsid, NULL, CLSCTX_SERVER, __uuidof(Excel::_Application), (void**)&exlApp ) ) ) { bExcel = false; }

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

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

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

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

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

KoichiSugiyama

2017/12/05 10:11 編集

「ファイルアクセスやファイルオープンを試してみましたが、……」とありますが、どういう処理を試したのか具体的なコードを掲載することはできませんか?それがあるのとないのでは、アドバイスの内容もずいぶん変わってしまう可能性があります。
starwada

2017/12/06 01:21

ありがとうございます。追記してみました。宜しくお願いします。
guest

回答3

0

ベストアンサー

C++でExcelを操作する、というのはExcel VBAで出来ることと大体同じです。
なので、VBAでのTipsが結構参考になったりします。
例えば

参考サイト

のようなやり方で、通知をOFFにして開いてみて、そのときの戻り値をチェックする(開いたファイルはすぐ閉じる)、というようにすればちょっと二度手間ですが上手くいくのではないでしょうか?

投稿2017/12/06 03:06

KoichiSugiyama

総合スコア3041

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

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

starwada

2017/12/06 04:41

ありがとうございます。 開いているブックに対して以下を行うとエラー(NULLが返る)になりました。 FILE* pFile = fopen( filepath, "a" ); これで、大丈夫そうです。 ありがとうございました。
guest

0

C++は詳しくないのですが、いくつか参考になりそうな情報を。

旧 Visual Basic や VBA のGetObject 関数 の第一引数に、開きたいExcelブックのパスを指定すると、「現在編集中のブック」のインスタンスを取得することができます(具体的な挙動はこちら)。

ただし、開きたいファイルがインターネット上に存在する場合は取得できません。

vba

1'開いてなければ非表示で開く、開いていればそのブックを取得する。 2Dim wb As Excel.Workbook 3Set wb = GetObject("C:\hoge.xlsx")

また、.NET Frameworkにも似たような動作を行えるメソッドがあり、
System.Runtime.InteropServices名前空間のMarshal.BindToMoniker メソッド (String) (System.Runtime.InteropServices)でも上記GetObjectと同じ操作が行えます。

COMを直接触れるC++ならより適当な処理が可能だと思われます。

その他関連しそうな単語

  • ROT(Running Object Table)
  • モニカー(Moniker)

投稿2017/12/05 15:59

imihito

総合スコア2166

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

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

starwada

2017/12/06 01:23

ありがとうございます。 試してみたいと思います。 また報告いたします。
guest

0

ファイルを開く際にファイルのプロパティ(属性)から
読み取り専用になっているかどうかで識別するというのはどうでしょうか。

下記のリンクを参考にトライしてみてはどうでしょうか。

https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.workbooks.open(VS.80).aspx

投稿2017/12/05 14:58

Qoo

総合スコア1249

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

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

starwada

2017/12/06 01:31

ありがとうございます。 ブックはこのメソッドでオープンしているのですが。 ファイルのプロパティで識別とは、具体的にはどうするのでしょうか。 宜しくお願いします。
Qoo

2017/12/06 01:48

上記のリンクにも記載があると思いますが、Notifyのプロパティをfalseに設定することでエラーが発生するようなので、それをキャッチすれば良いと思います。 また、下記のような方法でもできそうに思いますがいかがでしょうか。 CFileStatus Status; BOOL ret = CFile::GetStatus( _T("sample.xls"), Status ); if ( ret == FALSE ) { // ファイルが存在しないなど、ステータスの取得に失敗 } if ( Status.m_attribute & CFile::readOnly ) { //読み取り専用ファイル }
starwada

2017/12/06 04:41

回答いただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問