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

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

ただいまの
回答率

91.35%

  • Excel

    966questions

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

  • VC++

    93questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

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

解決済

回答 3

投稿 2017/12/05 14:54 ・編集 2017/12/06 10:34

  • 評価
  • クリップ 0
  • VIEW 83

starwada

score 1

前提・実現したいこと

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;
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • KoichiSugiyama

    2017/12/05 19:11 編集

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

    キャンセル

  • starwada

    2017/12/06 10:21

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

    キャンセル

回答 3

checkベストアンサー

0

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

参考サイト

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

投稿 2017/12/06 12:06

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/06 13:41

    ありがとうございます。
    開いているブックに対して以下を行うとエラー(NULLが返る)になりました。

    FILE* pFile = fopen( filepath, "a" );

    これで、大丈夫そうです。
    ありがとうございました。

    キャンセル

0

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

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

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

投稿 2017/12/05 23:58

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/06 10:31

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

    キャンセル

  • 2017/12/06 10:48

    上記のリンクにも記載があると思いますが、Notifyのプロパティをfalseに設定することでエラーが発生するようなので、それをキャッチすれば良いと思います。

    また、下記のような方法でもできそうに思いますがいかがでしょうか。
    CFileStatus Status;
    BOOL ret = CFile::GetStatus( _T("sample.xls"), Status );
    if ( ret == FALSE )
    {
    // ファイルが存在しないなど、ステータスの取得に失敗
    }
    if ( Status.m_attribute & CFile::readOnly )
    {
    //読み取り専用ファイル
    }

    キャンセル

  • 2017/12/06 13:41

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

    キャンセル

0

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

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

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

'開いてなければ非表示で開く、開いていればそのブックを取得する。
Dim wb As Excel.Workbook
Set 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/06 00:59

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/06 10:23

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

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

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

  • Excel

    966questions

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

  • VC++

    93questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。