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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

Q&A

1回答

235閲覧

Pythonコードを実行しても思い通りにならない

k161811

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

0グッド

0クリップ

投稿2025/05/31 11:34

実現したいこと

Excelのデータリストから、各条件にあった行を新規シートに抽出したい

発生している問題・分からないこと

新規シートは作成できているが、ヘッダーのみしか表示されない
イメージ説明
イメージ説明

エラーメッセージ

error

1エラーはありませんが、結果が違います

該当のソースコード

python

1import openpyxl 2import os 3 4# Excelファイルのパス 5file_path = r"C:\Users\ozawa\Documents\python練習コード.xlsx" 6 7# ファイルの存在を確認 8if not os.path.exists(file_path): 9 print(f"エラー: ファイル '{file_path}' が存在しません。") 10 exit() 11 12try: 13 # 読み込み 14 workbook = openpyxl.load_workbook(file_path) 15 16 # コピー元シートの取得 17 source_sheet = workbook["データ一覧"] # シート名は必要に応じて変更 18 19 # コピー先シートの作成 20 if "抽出結果" not in workbook.sheetnames: 21 target_sheet = workbook.create_sheet("抽出結果") 22 header = [cell.value for cell in source_sheet[1]] # ヘッダー行をコピー 23 target_sheet.append(header) 24 else: 25 target_sheet = workbook["抽出結果"] 26 if target_sheet.max_row == 0: 27 header = [cell.value for cell in source_sheet[1]] 28 target_sheet.append(header) 29 30 31 data9_value = row[10].value # 目的 (11列目) 32 33 # data9が空白の場合に9を設定 34 if data9_value is None or str(data9_value).strip() == "": 35 data9 = 9 36 else: 37 try: 38 data9 = int(data9_value) 39 except ValueError: 40 data9 = 0 # 数値に変換できない場合は0を設定 41 42 data4 = row[4].value # (5列目) 43 data7 = row[8].value # (9列目) 44 45 # 値を数値に変換 (エラー処理付き) 46 data8 = row[9].value # (10列目) 47 48 if data8 is None or str(data8_value).strip() == "": 49 data8 = 9 50 else: 51 try: 52 data8 = int(data8_value) 53 except ValueError: 54 data8 = 0 # 数値に変換できない場合はスキップ 55 56 if data7 is None or str(data7).strip() == "": 57 data7 = 9 58 else: 59 try: 60 data7 = int(data7) 61 except ValueError: 62 data7 = 0 63 64 # 条件に合致する行を抽出 65 if data9 == 1 and data4 == 1 and data7 == 15001 and data9 == 15001: 66 for i, value in enumerate(values): # enumerateを使ってindexを取得 67 target_sheet.cell(row=row_num, column=i + 1).value = value 68 row_num += 1 69 70 # 保存 71 workbook.save(file_path) 72 73 print("抽出とコピーが完了しました。") 74 75except KeyError as e: 76 print(f"エラー: シート '{e}' が存在しません。") 77except Exception as e: 78 print(f"予期せぬエラー: {e}")

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

自分になりにGeminiを使って修正したりして、エラー表示はなくなりましたが、ヘッダーのみしか表示されませんでした

補足

どんなコードであれば、キチンと実行できるのかも知りたいです.
よろしくお願いします

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

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

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

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

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

YAmaGNZ

2025/05/31 12:03

「抽出結果」というシートがない状態で実行しているかと思います。 その場合はif文にてどこが実行されるのかを考えてみるといいかと思います。
k161811

2025/06/01 11:51

ありがとうございます。 つまり、今のコードのままだと、#コピー先シートの作成欄のelse以降にコードを記入しているため、if文のヘッダー作成のみで終了している、ということでしょうか。 よろしくお願いします
meg_

2025/06/01 12:43

質問タグの「VBA」はどう関係していますか?関係しているのであれば質問文に書いてください。無関係であれば質問タグから削除してください。
YAmaGNZ

2025/06/02 00:29

>つまり、今のコードのままだと、#コピー先シートの作成欄のelse以降にコードを記入しているため、if文のヘッダー作成のみで終了している、ということでしょうか。 そうですね。 「抽出結果」というシートが存在した場合にどのような動作を求めているのかは分かりませんが、シートの有無にかかわらず抽出したいのであればif文での条件とは別に実行すべきかと思います。
k161811

2025/06/03 01:14

ありがとうございます。 自分としては、 else: target_sheet = workbook["抽出結果"] 以降にあるif文を「抽出結果」というシートが存在した場合に実行したいと考えております。 よろしくお願いします
k161811

2025/06/03 01:19

ありがとうございます。 「VBA」は、VBA・マクロで行うとすれば、どのようなコードになるのかを知りたいためです。 質問タグの操作が分かりません。 よろしくお願いします
YAmaGNZ

2025/06/03 01:50

「抽出結果」というシートが存在した場合はそのシートの最後尾から追記するといったことでしょうか? それともそのシートをクリアして最初からということでしょうか? また else:   target_sheet = workbook["抽出結果"] 以降にあるif文というのは「抽出結果」というシートが存在しなかった場合には実行しなくていいのでしょうか? そのあたりを考えてif文を構築する必要があるかと思います。 if 「抽出結果」というシートがない   # 「抽出結果」というシートを作成し見出し行を追加 else   # 「抽出結果」というシートがある場合の処理   # シートをクリアするなりの処理 # 以降シートがある場合でもない場合でも実行する処理 # 今回は抽出処理となるのではないかと思います。 # ようはtarget_sheet = workbook["抽出結果"]以降の処理だと思います といった形になるのではないですか?
guest

回答1

0

Windows 11、Python 3.13.3で確認しました。

  • target_sheet.max_rowは1開始なので、26行目以降のif文が実行されていません。
  • そのif文の中で、row、data8_value、values、row_numが未定義(値が無い)です。

上記を見直してみてください。

投稿2025/05/31 12:07

hiroki-o

総合スコア1377

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

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

k161811

2025/06/01 11:45

ご対応ありがとうございます。 自分は、Pythonを利用し始めたばかりのため、 ・そのif文の中で、row、data8_value、values、row_numが未定義(値が無い)です。 をどう記入すればよいか、ヒントをいただきたいです。 rowは、row[]のように記入すれば”〇番目の列の値”として出来るのと、未定義(値がない)のとでは違うのでしょうか よろしくお願いします。
hiroki-o

2025/06/01 12:50

rowが最初に出てくるのは、31行目です。 それ以前に値を代入しないで、いきなり参照しているため、未定義になります。 他の変数も同様です。 どういう条件でコピーしたいか教えてもらえたら、具体的なソースを回答できるかもしれません。
k161811

2025/06/03 01:09

返信が遅れてしまい、すみません。 ありがとうございます ・それ以前に値を代入しないで、いきなり参照しているため、未定義になります。 は、自分の考えとして、row[10]は、シート「データ一覧」にある11列目の値らを代入しているつもりだったのですが、記入ミスでしたでしょうか。 丁度、エクセルのフィルター機能のようにしたいと考えています。 具体的には、 データ9…1 データ4…1 データ7…10 データ8…20000~20100 の条件の値が合致する行をシート「抽出結果」にコピーする、 という事を実行したいです。 よろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問