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

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

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

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

1333閲覧

[Python3]Excel表から指定された複数の数値の中から最小の数をセルに書き込みたい

MM921

総合スコア14

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2021/01/06 06:06

前提・実現したいこと

python3.8でExcelの出庫履歴表から決算表(最終的にどの備品がどれくらい残っているかを見られるようにするための表)を作ろうとしています。

数値を指定するまではできましたが該当する数値が複数の時に,中で一番小さい数字を選択してセルに書き込むことができません。

色々試してみたのですが、うまく実行出来ないためお教えいただければ幸いです。

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

例としてaaaの最終的な備品個数をセルF2に表示させる場合を実行します。

aaaが表の中で2つ以上出てきたとき,該当数値すべてをprint表示はできるもののoffsetという一つの変数の中の数値だからかどちらも選択することができません。
また,その変数offsetをF2に表示しようとすると最大値166が表示されてしまいます。

↓出庫履歴の表.xlsx

|備品名|備品個数|日付| | | aaa
|:--|:--:|--:|
fff|278|2021-01-04| | |セルF2(ここにaaaの最小数値を入れたい)
eee|278|2021-01-04
ddd|278|2021-01-04
ccc|239|2021-01-04
bbb|240|2021-01-04
aaa|164|2021-01-04
fff|279|2020-12-25
eee|280|2020-12-25
ddd|280|2020-12-25
ccc|240|2020-12-25
bbb|241|2020-12-25
aaa|166|2020-12-25

該当のソースコード

aaaの備品個数に相当する数はaaaの右隣に位置しているためoffset関数を用いて表示しました。
以下が該当のコードです。

import openpyxl as px wb = px.load_workbook('sample2Project/出庫履歴の表.xlsx') ws = wb["Sheet1"] B2_COL = 1 B8_ROW = 1 E2_COL = 3 E6_ROW = 13 # 範囲データを順次処理 for row in ws.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): for cell in row: # 該当セルの値取得 cell_value = cell.value o = cell.offset(0, 1) offset = o.value # セル範囲内に該当の文字列が存在する場合表示 if str('aaa') in str(cell_value): print(offset) # ロードしたExcelファイルを閉じる wb.close()

以下がコード実行画面です。

Run

1164 2166

試したこと

listを作り変数offsetを入れて,ifで164と166を比較させる条件にしようとしましたがどちらも個々別々のリストに入ってしまい比較ができませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記でどうでしょうか?(最小値を保持する変数min_numを追加)

python

1min_num = -1 2for row in ws.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): 3 for cell in row: 4 # 該当セルの値取得 5 cell_value = cell.value 6 o = cell.offset(0, 1) 7 offset = o.value 8 # セル範囲内に該当の文字列が存在する場合表示 9 if str('aaa') in str(cell_value): 10 if min_num == -1: 11 min_num = offset 12 elif min_num > offset: 13 min_num = offset 14 15print(min_num)

投稿2021/01/06 07:02

編集2021/01/06 08:20
meg_

総合スコア10580

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

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

MM921

2021/01/06 07:50

meg_さんお忙しい中,ご回答ありがとうございます。 教えていただいたコードをそのまま引用したところSyntaxErrorが出たので以下のように修正し,実行したら最小値の表示ができました! 悩んでいたところ,わかりやすい回答をありがとうございました! >  # セル範囲内に該当の文字列が存在する場合表示 if str('aaa') in str(cell_value): if min_num == -1: # '='を付け足しました。 min_num = offset elif min_num > offset: min_num = offset print(min_num)
meg_

2021/01/06 08:19

すみませんでした。
MM921

2021/01/07 01:51

とんでもありません。とても助かりました???? 追加の質問で申し訳ないのですが,以下はお手すきの際に見ていただけたら幸いです…。 aaaの備品個数(offset)は解決したのですが,続くbbbやcccなどの備品個数の最小値をprint表示しようとしてもうまくいきませんでした。 この場合,備品個数の変数はoffsetと違うものを作成したらいいのでしょうか? >for row in ws.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): for cell in row: # 該当セルの値取得 cell_value = cell.value o = cell.offset(0, 1) offset = o.value # セル範囲内に該当の文字列が存在する場合表示 if str('aaa') in str(cell_value): if min_num == -1: min_num = offset elif min_num > offset: min_num = offset if str('bbb') in str(cell_value): if min_num == -1: min_num = offset elif min_num > offset: min_num = offset print(min_num)
meg_

2021/01/07 02:01

商品(商品名)ごとに最小値を保持する変数が必要となります。リストか辞書を使えば良いと思います。 今回であれば下記のような辞書を用意してはいかがでしょうか? minnumber_dic = {'aaa':-1, 'bbb':-1,} そして条件分岐部分を下記のようにすれば良いでしょう。 if str('aaa') in str(cell_value): if minnumber_dic['aaa'] == -1: minnumber_dic['aaa'] = offset elif minnumber_dic['aaa'] > offset: minnumber_dic['aaa'] = offset ※'aaa'や'bbb'の部分を変数にするとコードがもっとすっきりしますし、商品が増えたときにもコードの修正が少なくてすみます。
MM921

2021/01/07 02:39

追加での質問のご回答ありがとうございます! 上記のコードで他の製品個数の最小値を表記することができるようになりました。 >※'aaa'や'bbb'の部分を変数にするとコードがもっとすっきりしますし、商品が増えたときにもコードの修正が少なくてすみます。 コードが長くなりそうだったのでaaaやbbbの変数表示,試してみます! お忙しい中たくさんわかりやすいアドバイスをありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問