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

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

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

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5421閲覧

pythonでExcelを操作時に他のExcelファイルが閉じてしまう

cc000072

総合スコア28

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2021/12/13 01:01

■課題:pythonでwin32com.clientからExcelを操作し、処理終了後にExcelを閉じた際に他のExcelファイルまで閉じてしまいます。

例1:エクセルからbook1を開き、何かを編集します。その編集を保存せずにpythonからExcelを操作すると、そのbook1で変更を保存しますか?メッセージが出る

例2:既存で作成したエクセルをbook2開きます。book2を編集せずにその状態でpythonからExcelを操作すると、そのbook2が自動で閉じられます

■コード:

python

1import win32com.client 2 3excel = win32.com.client.Dispatch("Excel.Application") 4excel.Visible = 0 5 6try: 7 8  book = excel.Workbooks.Open("エクセルファイルのパス") 9  book_sheet = book.Worksheets("Sheet1") 10  book_sheet.cells(1.1) = 'Test' 11  book.Close(SaveChanges = 1) 12 13except Exception as e: 14 15  print(e) 16 17finally: 18 19  excel.Application.Quit() 20

■やりたいこと:win32com.clientからExcelを操作し、処理終了後にExcelを閉じても他のExcelファイルが閉じないようにしたいと思っております。皆様のお知恵を拝借できればと思っております。

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

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

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

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

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

1T2R3M4

2021/12/13 01:05

調べたこと、試したことを質問に追記していただけませんか。
Bull

2021/12/13 05:07

複数のワークブックを開いてもエクセルのインスタンス (プロセス) は一つだけです。 エクセルを終了すれば、現在開いているワークブックは閉じられます。 エクセルを終了しないで、ワークブックを閉じるではダメなのですか?
Bull

2021/12/14 02:44

Dispatch() はすでにエクセルが起動しているときは、起動しているエクセルを操作対象にします。 (新たにエクセルを起動することはないです) 現在開いているワークブックはそのままで、新たにワークブックを開くことも可能ですが、Quit() でエクセルを終了すれば、開かれているワークブックは閉じられることになります。 質問の趣旨を理解できていないのですが「現在作業中のワークブックの他に開いているワークブックがあれば、エクセルを終了しない」と言うことでしょうか? もしそうであれば、開かれているワークブック数をチェックしてからエクセルを終了する、という処理を追加すればいいのではないかと思います。
cc000072

2021/12/16 09:31

Bullさん、ありがとうございます。 質問の趣旨としては、win32でquit()を実行すると開いているすべてのエクセルが閉じてしまうので、pythonから起動したエクセルファイルだけを閉じて、他のエクセルは閉じないようにしたいという趣旨です。 いろいろ試して、quit()をやめclose()だけにしてもやはりすべてのエクセルが閉じてしまいます。
Bull

2021/12/16 10:11

Close() だけなら、エクセルが終了することはないはずですが、現象が出ているソースコードを質問を修正して追記して頂けますか?
Bull

2021/12/16 10:13

あと、エクセルのバージョンも追記して頂けますか? 当方のエクセルは 2013 なので、バージョンによる違いはあるかもしれません。
cc000072

2021/12/27 09:10

遅くなりすいません。コードは質問に記載しているものと同じです、バージョンはMicrosoft 365 Apps for enterpriseです。
guest

回答1

0

ベストアンサー

回答ではないのですが、何か適当なワークブックを開いた状態で、以下のプログラムを実行して貰えますか?
"Book1.xlsx"は問題なく開けるワークブックに変えて頂いてもいいです。
表示するセルも変更していただいていいのですが、これは本質的なものではないのでなくてもいいです。

Python

1import win32com.client as com 2 3# エクセルを起動 (既存のエクセルに接続) 4xl = com.Dispatch("Excel.Application") 5 6xl.Visible = True # ウィンドウを表示 7xl.DisplayAlerts = False # 警告を出さない 8 9# 既存のワークブックを開く 10wb = xl.Workbooks.Open('Book1.xlsx') 11 12# ワークシートを取得 13ws = wb.ActiveSheet 14 15# セルのデータを表示 16print(ws.Cells(2, 1).Value) 17 18# オブジェクトを解放 19cell = None 20ws = None 21 22input('確認:') 23 24# ワークブックを閉じる 25wb.Close() 26wb = None 27xl = None

プログラムを実行すると、すでに開いているワークブックはそのままで、プログラムで開いた"Book1.xlsx"は閉じられるはずですが、如何でしょうか?

「質問への追記・修正の依頼」でも書きましたが、当方のエクセルは 2013 なので、バージョンによる違いはあるかもしません。

投稿2021/12/16 11:39

Bull

総合スコア986

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

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

cc000072

2021/12/27 09:16

ありがとうございます、早速試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問