52653


Pythonでセルの値が2のセルをWhile文を使って一行一行下に進みながら探すコードを書きたいと思っていますが、現状では以下のコードを実行すると＜エラー＞が表示されてしまいます。  
構文の間違いを教えていただけませんでしょうか？どうぞよろしくお願いいたします。

[code]

    import openpyxl
    import os
    os.chdir("C:\\Users\\xxx\\Desktop")
    wb=openpyxl.load_workbook('sample.xlsx')
    sheet=wb["Task"]
    
    i=1
    sheet.cell(row=i,column=1)
    Need2=sheet.cell(row=i,column=1)
    
    while True:
        Need2.value(2)
        Need2.row += 1
        print(Need2)
    
[/code]

**＜エラー＞**

[code]

    TypeError                                 Traceback (most recent call last)
    <ipython-input-1-087799fac3f5> in <module>
         10 
         11 while True:
    ---> 12     Need2.value(2)
         13     Need2.row += 1
         14     print(Need2)
    
    TypeError: 'NoneType' object is not callable
    
[/code]


CC BY-SA 4.0
2019-02-08T16:35:09.970
52652
2019-02-09T06:44:56.183
2019-02-09T06:44:56.183
3060
31771
question
python excel openpyxl
Pythonのwhile文でエラーが出てしまいます


この仕様 [openpyxl.cell.cell
module](https://openpyxl.readthedocs.io/en/stable/api/openpyxl.cell.cell.html)
を元に推測すると、以下のように考えられます。

  * cellの`value`を2と比較するのに`value(2)`という使い方は存在しないでしょう。  
`if Need2.value == 2:` で比較するのでは？

続けて、次の行もおかしいでしょう。

  * `row`プロパティは読み込みだけの可能性があります。  
この流れで次の`row`のcellが欲しいなら、`Need2 = Need2.offset(row=1,column=0)`でしょうか。  
一応 `+= 1` が出来そうなコメントもありましたが、推奨しないようです。  
[find cell value with matching regular expression of a row in excel
file](https://python-forum.io/Thread-find-cell-value-with-matching-regular-
expression-of-a-row-in-excel-file)

  * 2を検出した次の`row`に移ってから`print()`するという処理のようですが本当ですか？

  * ループを抜ける処理がありません。  
処理が終了しないか、データが無い`row`で例外終了するのでは？

  * 上記終了条件にも関連しますが、`value`が2のcellが見つかったら何をどうしますか？  
あるいはそれが複数存在する場合は？

こんな記事があって、参考になると思います。  
[Using openpyxl to search for a cell in one column and then to print out the
row for that relevant cell](https://stackoverflow.com/q/38732979/9014308)

> If you only want to look in column A for the input I would do something like
> this:
[code]

>     for i in range(1,ws.max_row):
>         if ws.cell(row=row, column=0).value == date:
>             for j in range(i, ws.max_column):
>                 print (ws.cell(row=i, column=j).value)
>  
[/code]

>
> Assuming you want to print every column on the row matching the input

注）上記参考記事回答で先頭の日付値が合う行を全てprintしているように見えましたが、いろいろと間違っていそうです。  
先頭`column`に0を指定している、変数`j`の`range()`を`i`から始めている、`range()`で最後の行・列が入らない指定になっている、`print()`
に指定したcellに値が入っているか考慮していない、あたり（結局全部？）がダメでしょうか。

ループの形の考え方だけ参考ですかね。


CC BY-SA 4.0
2019-02-09T01:55:43.053
52653
2019-02-09T04:21:27.577
2019-02-09T04:21:27.577
26370
26370
52652
answer