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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

2回答

851閲覧

for文の組み合わせについて

jazzmaster

総合スコア26

openpyxl

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

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2021/03/22 09:28

編集2021/03/22 11:52

python3

1wb = openpyxl.load_workbook(excelname) 2sheet1 = wb[sheet_name1] 3sheet2 = wb[sheet_name2] 4sheet3 = wb[sheet_name3] 5sheet4 = wb[sheet_name4] 6 7ss1 = [sheet1, sheet4] 8ss2 = [sheet2, sheet3] 9 10hiddenlist1 = ['F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 11hiddenlist2 = ['G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 12 13#sheet1のみだったら 14for col1 in hiddenlist1: 15 sheet1.column_dimensions[col1].hidden = True 16 17wb.save(excelname)

sheet1,sheet4はhiddenlist1の列を非表示にする。
sheet2,sheet3はhiddenlist2の列を非表示にしたいのですが、
うまくfor文をまとめることができず困っております。
初心者な質問で申し訳ございませんがご教授いただけると助かります。
よろしくお願いいたします。

#追記

python

1if __name__ == '__main__': 2 wb = openpyxl.load_workbook(excelname) 3 ss1 = [sheet1, sheet4] 4 ss2 = [sheet2, sheet3] 5 ss_all = [sheet1, sheet2, sheet3, sheet4] 6 7 hiddenlist1 = ['F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 8 hiddenlist2 = ['G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 9 10 for ws in ss_all: 11 if ws in ss1: 12 for col in hiddenlist1: 13 ws.column_dimensions[col].hidden = True 14 pass 15 16 elif ws in ss2: 17 for col in hiddenlist2: 18 ws.column_dimensions[col].hidden = True 19 pass 20 21wb.save(excelname) 22

上記のように書いてみました、
エラーは出ておりませんが一つのシートも列が非表示になりませんでした。

追記2
sheet1などの変数に関しましては下記のようになっています。
AAAはエクセルのシート名です。shhe2なども同様に全て定義しています。

python

1sheet_name1 = 'AAA' 2sheet1 = wb[sheet_name1]

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

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

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

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

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

guest

回答2

0

ベストアンサー

関数に分けると見通しが良くなります。

python

1def hide_cells(sheet, hiddenlist): 2 for col1 in hiddenlist: 3 sheet.column_dimensions[col1].hidden = True 4 5def hide_cells_in_sheets(sheets, hiddenlist): 6 for sheet in sheets: 7 hide_cells(sheet, hiddenlist) 8 9hide_cells_in_sheets(ss1, hiddenlist1) 10hide_cells_in_sheets(ss2, hiddenlist2) 11 12wb.save(excelname)

と書くと、あとで修正する場合も楽になります。

hiddenlistがもっと増えてきたら、さらにこれをまとめる関数を作った方がわかりやすいですが、二個ならこれぐらいで十分でしょう。

投稿2021/03/22 11:48

ppaul

総合スコア24670

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

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

jazzmaster

2021/03/22 12:20

回答ありがとうございます。想定通り動きました!とても勉強になりました。
guest

0

ご質問内容がfor文をまとめることであれば、以下のようにしてみてください。
(openpyxl: Excel操作のライブラリ?については詳細が分からないので試していません。)

ポイント

  • ワークブックを開いた後、シート名を各変数に代入している箇所でsheet_name1..4を設定すると、

wb.sheetnamesが取れると思います。(実際に試したわけではないので、代わりにsheet変数を
追加しました。)

  • forを追加するのは、#sheet1のみだったら の後で、sheetを総当たりしつつ、

    • 該当シート名がss1に含まれていれば、ss1の処理を実施。
    • 該当シート名がss2に含まれていれば、ss2の処理を実施。
  • wb['sheetname']でシートが取得できるそうなので、wb[ws]として取る感じです。

python3

1if __name__ == '__main__': 2 # wb = openpyxl.load_workbook(excelname) 3 # sheet1 = wb[sheet_name1] 4 # sheet2 = wb[sheet_name2] 5 # sheet3 = wb[sheet_name3] 6 # sheet4 = wb[sheet_name4] 7 # sheets = wb.sheetnames 8 sheets = ["sheet1", "sheet2", "sheet3", "sheet4"] 9 10 ss1 = ["sheet1", "sheet4"] 11 ss2 = ["sheet2", "sheet3"] 12 13 hiddenlist1 = ['F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 14 hiddenlist2 = ['G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 15 16 # ------- ここでシートをループする --------- 17 for ws in sheets: 18 if ws in ss1: 19 print(ws) 20 print(hiddenlist1) 21 for col in hiddenlist1: 22 # wb[ws].column_dimensions[col].hidden = True 23 pass 24 25 if ws in ss2: 26 print(ws) 27 print(hiddenlist2) 28 for col in hiddenlist2: 29 # wb[ws].column_dimensions[col].hidden = True 30 pass 31 32 # wb.save(excelname)

追記(やってみた)

ご質問はfor文をまとめる方法で合っていますか?
これだと成功しました。

python3

1import openpyxl 2 3if __name__ == '__main__': 4 sheet_name1 = "Sheet1" 5 sheet_name2 = "Sheet2" 6 sheet_name3 = "Sheet3" 7 sheet_name4 = "Sheet4" 8 wb = openpyxl.load_workbook("Sample.xlsx") 9 10 ss1 = [sheet_name1, sheet_name4] 11 ss2 = [sheet_name2, sheet_name3] 12 13 hiddenlist1 = ['F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 14 hiddenlist2 = ['G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'] 15 16 for ws in wb.sheetnames: 17 if ws in ss1: 18 print(f"ss1: {ws}") 19 # for col in hiddenlist1: 20 # ws.column_dimensions[col].hidden = True 21 22 elif ws in ss2: 23 print(f"ss2 {ws}") 24 # for col in hiddenlist2: 25 # ws.column_dimensions[col].hidden = True 26 27# wb.save(excelname)

実行結果

shell

1ss1: Sheet1 2ss2 Sheet2 3ss2 Sheet3 4ss1: Sheet4

投稿2021/03/22 10:14

編集2021/03/22 12:18
rtazaki

総合スコア69

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

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

jazzmaster

2021/03/22 11:32

回答ありがとうございます。エラーは出なかったのですが列が非表示にはなりませんでした。 私が書いたものを追記として記載させていただきます。
rtazaki

2021/03/22 11:47

ss1, ss2のリストに入っているのは何でしょうか。 wb[sheet_name1]の戻り値であればシート名ではなく、ワークシートそのものだと思います。 if ws in ss1:でss1と存在チェックしたときに、オブジェクトで一致が見れてないのではと思います。 なお、passは、for文で字下げしたときに処理なしだとpythonでは文法エラーになるため、 passを追加しただけですので、ws.column_dimensions[col].hidden = Trueの後のpassは2つとも不要です。
jazzmaster

2021/03/22 11:53

追記させていただきました。
rtazaki

2021/03/22 12:25

追記しました。 ご自身の実際のコードにprint入れるか、breakpointを入れてデバッグしてみてください。 if ws in ss1:の箇所で想定外の動きをしていると思います。
jazzmaster

2021/03/22 12:29

回答ありがとうございます!こちらも明日試してみたいと思います。
rtazaki

2021/03/22 12:33

想定通り動いたのであれば良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問