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

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

新規登録して質問してみよう
ただいま回答率
85.37%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Python

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

Q&A

解決済

1回答

1792閲覧

GUIで選択した値をExcelファイルから探す

shunhamm

総合スコア22

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Python

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

0グッド

0クリップ

投稿2021/04/20 03:15

前提・実現したいこと

Pythonのopenpyxl, tkinterを使ってGUIで読み込んだ値をExcelファイルから自動で探すプログラムを作成しています。

発生している問題・エラーメッセージ

実行途中で止まってしまう。

UserWarning: Data Validation extension is not supported and will be removed warn(msg)

該当のソースコード

Python

1import tkinter as tk 2import tkinter.ttk as ttk 3import openpyxl as px 4 5#ウィンドウの作成 6win = tk.Tk() 7win.title("Title") 8win.geometry("300x120") 9 10#ラベル作成 11labelID = tk.Label(win, text='ID') 12labelID.pack() 13 14#テキスト入力ボックス作成 15textID = tk.Entry(win) 16textID.pack() 17 18#シート選択 19#ラベル作成 20labelSheet = tk.Label(win, text="Sheet") 21labelSheet.pack() 22 23#コンボボックス作成 24combo = ttk.Combobox(win, state="readonly", width=17) 25 26#リストの値を設定 27combo["values"] = ("リストの値") 28combo.pack() 29 30#okボタンを押したときの挙動 31def ok_click(): 32 ID = textID.get() 33 Name = combo.get() 34 wb2 = px.load_workbook('読み込みたいExcelファイル') 35 for sheet_number in range(0,8): 36 ws2 = wb2.worksheets[sheet_number] 37 for k in range(2,ws2.max_row + 1): 38 master_code = ws2['A' + str(k)].value 39 if ID == master_code: 40 # ここでmaster_codeがある行のカラムから必要なものを持ってくる。 41 break 42 43#okボタンを作成 44okButton = tk.Button(win, text='OK', command=ok_click) 45okButton.pack() 46 47win.mainloop()

試したこと

エクセルファイルの問題かもしれないと思い、エクセルファイルの保護を外したりした。

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

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

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

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

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

sasakaman

2021/04/20 03:35

UserWarningではプログラムは停止しません。 処理は続けるけど、変なことが起きたから注意してね、くらいの内容です。 他のエラーが表示されているのであれば、その旨を記載してください。
quickquip

2021/04/20 04:20 編集

質問が書かれていないようです。メッセージは読んだままの意味の警告だと思うので、何を疑問に思っているのか伝わってません。 期待している結果と、それが実現していないことをどう確認したのか(どういう現状を観察しているのか)がせめて書いてあればいいのですが。
guest

回答1

0

ベストアンサー

見た感じ問題点は3つ程

  • A: openpyxl / excel の問題。ライブラリ openpyxl が Data Validation に対応してない
  • B: tkinter / GUI が停止する問題。イベントループ内での処理なので、その間 GUI は応答なしになる
  • C: 2重 for 文の問題。恐らく想定されてる挙動になってません。

コードは実行できてないので、どの部分で止るのか解りませんが、

GUI が操作できずに応答なしになってる状態でしょうか?
それとも、期待する結果が得られず止まっているように見えるのでしょうか。


[C] のループ処理に関して

python

1 2def ok_click(): 3 4 for sheet_number in range(0,8): # ループ1 5 6 for k in range(2,ws2.max_row + 1): # ループ2 7 8 if ID == master_code: 9 ... 10 11 break # この break は毎回実行され、内側のループ2 を抜ける 12

内側のループは range(2, ws2.max_row+1) の最初の繰り返しで break します。
インデントが正しいかどうかを確認してください。

仮に、break が if ID == master_code: のブロック内にあったとしても、
break で抜けるのは内側のループのみなので、

もし外側のループを抜けたい場合は、ループ部分を別関数にして return で抜けるようにしてください。

python

1# 質問に掲載のループ文の流れ (現状の問題点を簡略化したコード) 2 3value = 2 4 5for n in "ABC": 6 print(f"Sheet: {n}") 7 for m in range(5): 8 print(f" value: {m}") 9 10 if m == value: 11 pass 12 13 break # <-- 繰り返しの1巡目に必ず break し、次のシートを探索になってしまう。

解決策:

仮データで小規模なテストプログラムを作ってみて、挙動を確認してみてください。

  • 必要な範囲の探索が出来ているか。
  • 目的の値が見つかった時に、正しく処理を抜けられているかどうか。

[B] に関しては、スレッドについて調べて見て下さい。

GUIプログラムは大抵、イベントループと呼ばれるループ処理の中で
イベントの処理、描画の更新等を繰り返し行っています。

クリック等のイベント等に呼ばれる関数は、即座に処理を終えないと、イベント処理が滞り
GUI が応答なしになり、利用者にとってはプログラムが止まったように見えることも有ります。

対策: 時間の掛かる処理がある場合は、
「スレッド」等を使い、バックグラウンドで処理を行うようにします。

※ EXCELのシート数・データの件数次第です。
小規模のデータで一瞬GUIが止まったりするのが許容範囲なら問題ありません。


[A] エクセルに関しては詳しくないので、関連リンク

Data Validation extension is not supported and will be removedという警告が出る

但し、警告を出なくするだけでは問題解決にはならず、
警告文はこのまま処理を進めると問題が起こると注意を促してます。

上記の回答の内容を問題点を把握せずに試すのはお勧めしません。

(Data Validation extension is not supported and will be removed)

この場合は openpxel で保存すると、入力規制の情報が失われる
心配があるので、その点はもう少し詳しく調べて下さい。

投稿2021/04/20 05:46

teamikl

総合スコア8681

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

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

shunhamm

2021/04/21 05:42

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問