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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

Q&A

解決済

1回答

2792閲覧

Python:openpyxlでExcelファイルの処理中、ifを完全に分岐させられない。

ken16

総合スコア1

openpyxl

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

0グッド

0クリップ

投稿2020/05/05 16:10

前提・実現したいこと

Python3(openpyxl)を使って、Excelの在庫表を管理するプログラムを作成しています。
自力でなんとか動かせるところまでと考えていましたが、詰まってしまいました。
行いたい処理全体の流れとして、

1.Pythonスクリプトを実行すると、商品コードを入力するよう要求され、

2.商品コードを手入力するとあとは自動でカタログから検索、商品情報を取得し必要情報をSheet2上に貼り付けて整理、

3.商品コードから在庫表(Sheet1)を照会して既に在庫にある商品か、新規の商品かを判断、

4.既に在庫リストにあれば個数に+1、なければ最終行に追加し、在庫数を1とする。

という処理をさせたいと考えています。

上記2の必要情報を整理するところまでは出来ているので、今回のソースコードは問題が起こっている部分(3以降)を記載しています。
ソースコード上では在庫リスト(Excelファイル)は、list_example.xlsxという名前にしています。
在庫リストExcelファイルにはSeet1(在庫表があるシート)と、
Sheet1

Sheet2(私の技術不足によりデータ取得の際に必要情報のみに整えられないため、このシート上でデータクレンジングもどきを行うためのシート)があります。
Sheet2

Sheet2[A3]の情報をもとにSheet1[A列]へ照会し、もしSheet2[A3]がSheet1(在庫管理表)にない商品だった場合、Sheet2の商品情報[A3][B3]をSheet1へコピーして貼り付け、在庫数に1を入力する形になっています。
Sheet1(在庫管理表)にある商品だった場合、在庫数に+1とします。

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

エラーなく実行されますが、以下の在庫表に有の場合にうまく処理できないことが有ります。

在庫表に有の場合:在庫リストの在庫数に+1する。
在庫表に無の場合:リストの最終行に商品コード等の情報を追加し、在庫数を1とする。

在庫表に有の場合の処理について、
在庫表の最終行に合致する物品がある場合は問題なく在庫数に+1されるのですが、
最終行+1

合致する物品が最終行にない(途中の行にある)場合、最終行に新たに追加される(在庫表に存在するのに在庫表に無の場合の処理が行われる)という結果になってしまいます。
最終行にないとき

該当のソースコード

python3

1import openpyxl 2 3wb = openpyxl.load_workbook('list_examle.xlsx') 4sheet_pre = wb["Sheet2"] 5sheet_fin = wb["Sheet1"] 6 7#有無を照会したい商品コード(Sheet2のA3)を取得する。 8code = sheet_pre['A3'].value 9 10#最終行を規定し、範囲データ(検索対象;A列)を取得。 11last_row = sheet_fin.max_row 12A_column = sheet_fin['A'] 13 14#範囲データ内で商品コードを検索し、有無で処理を分岐する。 15for cell in A_column: 16 #該当cellと、同行の在庫セル位置(2つ右)を取得する。 17 cell_value = cell.value 18 o = cell.offset(0,2) 19 offset = o.value 20 21#在庫リストに商品コードが存在する場合、在庫数に+1する。 22if code in [cell_value]: 23 o.value = o.value + 1 24#在庫リストに商品コードが存在しない場合、リスト最終行に追加し、在庫を1とする。 25else: 26 sheet_fin.cell(row=last_row+1,column=1).value = sheet_pre['A3'].value 27 sheet_fin.cell(row=last_row+1,column=2).value = sheet_pre['B3'].value 28 sheet_fin.cell(row=last_row+1,column=3).value = 1 29 30#ロードしたexcelファイルを保存(上書き)する。 31wb.save('list_examle.xlsx') 32

疑問点

商品コード検索対象の辺り(forまわり)がおかしいのだろうとは思っているのですが、具体的に何がまずいのか分かりません。
「ここがおかしい」または「別の方法をとった方が良い」など、ご教示いただければと思います。

補足情報(FW/ツールのバージョンなど)

Mac OS 10.14.6
Python 3.7.4
openpyxl 3.0.3
Excel for Mac 16.16.21

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記コードですと、cell_valueには最終セルの値しか残らないかと思います。※例で言うと「商品コード456」の情報しか残らない

Python

1for cell in A_column: 2 #該当cellと、同行の在庫セル位置(2つ右)を取得する。 3 cell_value = cell.value 4 o = cell.offset(0,2) 5 offset = o.value

対策としては、このforループの中に分岐処理を書くか、このforループで取得した値をリストに格納して後の分岐処理で使うか、だと思います。

投稿2020/05/05 16:28

meg_

総合スコア10760

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

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

ken16

2020/05/06 17:51

ありがとうございます。 回答を参考に、forループで取得した値をリストに格納してから、 リスト内に商品コードが有るか無いかで処理を分岐させることで無事目的とする処理結果まで辿り着きました。 とても初歩的なミスにハマっていたようで、お恥ずかしい限りです。 的確な助言のおかげで解決に至ることができました。大変感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問