前提
卒業論文でexcelのセルの参照元を調べる必要が出てきました。
しかし、あまりにも参照元が多く、地道に調べるのは大変なため、少しかじったことのあるpythonで調べたいと思いました。
初歩的な質問かもしれませんが、よろしくお願いします。
実現したいこと
pythonでexcelのセルの参照元を調べたいです。
具体的に言うと、N43のセルが
N43 =IF(K43="-","-",IF(NOT(ISNUMBER(I43)),"",IF(OR(AND(J43="≤",ROUND(I43,1)<=K43),AND(J43="≥",ROUND(I43,1)>=K43)),Data!$C$273,Data!$C$272)))
となっている場合、
["K43", "I43", "J43", "C273", "C272"]
と表示できるようにしたいです。
このなかで、"$"のついていない"K43", "I43", "J43"については正規表現で表示できましたが、"$"のついている"$C$273", "$C$272"について表示できなくて困っています。
最終的には、求めることができたセルに対しても同様にさらにその参照元を調べるために、再帰させようと思っています。以下のコードの後半はそのための準備になっています。そこに関してもアドバイスがあればいただきたいです。
発生している問題・エラーメッセージ
【ご報告】ご指摘をいただき、誤字の修正をした結果、下記エラーが出るようになりました。
検証をこれから行いますが、ご助力いただければ幸いです。
ValueError: 272 is not in range The above exception was the direct cause of the following exception: Traceback (most recent call last): File "“●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●”", line 70, in <module> print(get_duplicate_list_order(map1(link_search_01, new_ret1))) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●””, line 64, in map1 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●””, line 64, in map1 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●””, line 64, in map1 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) [Previous line repeated 6 more times] File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 40, in link_search_01 text = dfs[sname.index(ws)].loc[cell_no-1,cell_alpha] File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 925, in __getitem__ return self._getitem_tuple(key) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 1100, in _getitem_tuple return self._getitem_lowerdim(tup) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 838, in _getitem_lowerdim section = self._getitem_axis(key, axis=i) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 1164, in _getitem_axis return self._get_label(key, axis=axis) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 1113, in _get_label return self.obj.xs(label, axis=axis) File "●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●\●●●●●●", line 3776, in xs loc = index.get_loc(key) File " ●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●\●●●●●●\●●●●●●", line 387, in get_loc raise KeyError(key) from err KeyError: 272
該当のソースコード
python
1from openpyxl import load_workbook 2import docx 3import requests 4import pandas as pd, openpyxl as xl, re, itertools 5from string import ascii_uppercase 6 7excel_path="●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●" 8workbook = load_workbook(filename=excel_path, read_only=True) 9 10load_sheet1 = input("調べたいシート :") 11sheet1 = workbook[load_sheet1] 12load_cell1 = input("調べたいセル :") 13 14# 取得した値の表示 15if load_cell1 == "" : 16 print("null") 17else : 18 print(load_sheet1,load_cell1,sheet1[load_cell1].value) 19 20dfs = [] 21sname = [] 22 23def iter_all_strings(): 24 for size in itertools.count(1): 25 for s in itertools.product(ascii_uppercase, repeat=size): 26 yield ''.join(s) 27 28for ws in workbook.worksheets: 29 df = pd.DataFrame(ws.values) 30 clst = [] 31 for s in itertools.islice(iter_all_strings(), df.shape[1]): 32 clst.append(s) 33 df.columns = clst 34 dfs.append(df) 35 sname.append(ws.title) 36 37def link_search_01(ws, cell): 38 cell_no = int(re.sub(r'\D', '', cell)) 39 cell_alpha = re.sub(r'(\W|\d)', '', cell) 40 text = dfs[sname.index(ws)].loc[cell_no-1,cell_alpha] #セルの計算式 41 #------------------------------------------------------------------------------------ 42 # 以下の1行を付け加えた 43 #------------------------------------------------------------------------------------ 44 new_text = re.sub("\$" , "", text) 45 46 results_01 = [] 47 regex1 = re.compile(r'[A-Z]+\d+') 48 #------------------------------------------------------------------------------------ 49 #results_01.append(regex1.findall(text)) 50 #------------------------------------------------------------------------------------ 51 results_01.append(regex1.findall(new_text)) 52 ret1 = list(itertools.chain.from_iterable(results_01)) 53 return(ret1) 54 print(ret1) 55 56link_search_01(load_sheet1,load_cell1) 57 58new_ret1 = link_search_01(load_sheet1,load_cell1) 59 60def get_duplicate_list_order(seq): 61 seen = [] 62 return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1] 63print(get_duplicate_list_order(new_ret1)) 64 65def map1(link_search_01, new_ret1): 66 if new_ret1 == []: 67 return [] 68 else: 69 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) 70 71def get_duplicate_list_order(seq): 72 seen = [] 73 return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1] 74 75print(get_duplicate_list_order(map1(link_search_01, new_ret1)))
python
1#今回のinputの内容 2load_sheet1 = ●●●●● 3load_cell1 = N43
python
1#結果 2 ['K43', 'I43', 'J43'] 3 [['AI43', 'AQ43'], ['N27', 'N27'], []]
試したこと
上記コードにコメントアウトしたように、元のセルの計算式から"$"を省き、それをもとに正規表現でセルを調べようとしたのですが、コメントアウト部が思ったように稼働しませんでした。
コメントアウト部をなくすと、"$"なしのセルは正しく表示されます。
※誤字を修正した結果、エラーがでるようになりました。
検証はこれから行いますが、ご助力いただければ幸いです。

回答1件
あなたの回答
tips
プレビュー