Мне нужно было заменить несколько столбцов в необработанной таблице данных (опорная часть этого листа) формулами.
Для этого я использовал пакет Xlwings, и он успешно работает с другими формулами, но не с этой конкретной.
Эти формулы работают;
#column Y: Year 1-FA #Works perfectly
sheet_obj.range("Y2:Y"+str(max_row)).formula = f'=IF(NUMBERVALUE(C2)=1,CONCAT("Y1-",L2),L2)'
#column z: custom #Works perfectly
sheet_obj.range("Z2:Z"+str(max_row)).formula = f'=CONCAT(B2,"-",E2,"-",I2,"-",J2,"-",K2)'
Следующее возвращает ошибки;
#column P: New Out of PP #this is whwre the it shows error
sheet_obj.range("P2:P"+str(max_row)).formula = f'''=IFERROR(IF(OR(O2<>"",O2<>"NULL"),IF(OR(J2 = "Term 1",J2 = "Term 33"),O2+MIN(XLOOKUP(CONCAT(N2,C2,J2,H2),Subject_Map!$G:$G,Subject_Map!$H:$H,"",0),Raw(Merged)!S2),O2),O2),O2)'''
формула, которую я хочу назначить,
'=IFERROR(IF(OR(O2<>"",O2<>"NULL"),IF(OR(J2 = "Term 1",J2 = "Term 33"),O2+MIN(XLOOKUP(CONCAT(N2,C2,J2,H2),Subject_Map!$G:$G,Subject_Map!$H:$H,"",0),Raw(Merged)!S2),O2),O2),O2)'






Я думаю, проблема в названии листа Raw(Merged), его нужно заключить в одинарную кавычку 'Raw(Merged)'!S2:
sheet_obj.range("P2:P"+str(max_row)).formula = '''=IFERROR(IF(OR(O2<>"",O2<>"NULL"),IF(OR(J2 = "Term 1",J2 = "Term 33"),O2+MIN(XLOOKUP(CONCAT(N2,C2,J2,H2),Subject_Map!$G:$G,Subject_Map!$H:$H,"",0),'Raw(Merged)'!S2),O2),O2),O2)'''
@rachel_ust: это не имя листа! Поскольку между «Raw(Merged)» нет пробела, кавычки не нужны. Проблема здесь в том, что когда я каким-то образом тестировал ее отдельно при преобразовании всей этой формулы в одну ячейку, появляется дополнительный символ «\». Я не могу его удалить. При использовании метода .replace() он также удаляет все остальные двойные кавычки.
Когда я печатаю =IFERROR(IF(OR(O2<>"",O2<>"NULL"),IF(OR(J2 = "Term 1",J2 = "Term 33"),O2+MIN(XLOOKUP(CONCAT (N2,C2,J2,H2),Subject_Map!$G:$G,Subject_Map!$H:$H,"",0),Raw(Merged)!S2),O2),O2), O2) в Excel Excel жалуется на скобку в Raw(Merged). но возможно я тебя неправильно понял.
Ответ правильный, вам нужны кавычки вокруг имени листа, если в имени есть круглые скобки. Вы можете легко проверить это, выбрав любую ячейку на листе «Необработанный (объединенный)», например. «A1». Скопируйте ячейку, затем вставьте ссылку в ячейку на другом листе. Вы увидите, что имя заключено в кавычки ='Raw(Merged)'!$A$1. Я протестировал вашу формулу с этим исправлением, и она написана правильно и работает. Если в формуле появляется символ «\», это может быть попыткой разграничить круглые скобки.
Я думаю, это правильно, может быть, я пропустил скобки, но все же я застрял в преобразовании всей этой формулы в одну строку, чтобы я мог перейти к объекту листа xlwings и применить ее.
Чтобы привести пример, проверьте эту fn, мне нужна эта формула в виде одной строки, если вы проверите O/P, появится дополнительный '\'. def Special2(): f_string = f'''=IFERROR(IF(OR(O2<>"",O2<>"NULL"),IF(OR(J2 = "Term 1",J2 = "Term 33") , O2+MIN(XLOOKUP(CONCAT(N2,C2,J2,H2),Subject_Map!$G:$G,Subject_Map!$H:$H,"",0), 'Raw(Merged)'!S2 ),O2),O2),O2)''' return (f_string)
Это результат функции выше: '=IFERROR(IF(OR(O2<>"",O2<>"NULL"),IF(OR(J2 = "Term 1",J2 = "Term 33"), O2+MIN(XLOOKUP(CONCAT(N2,C2,J2,H2),Subject_Map!$G:$G,Subject_Map!$H:$H,"",0),\'Raw(Merged)\' !S2),O2),O2),O2)'
У меня это работает: data_ws.range("P2:P4").formula =special2(). Я просто скопирую и вставлю ваш Special2() в свой Clion. ничего не изменить.
Дополнительный '\' действует как escape-символ в Python. w3schools.com/python/gloss_python_escape_characters.asp
не могли бы вы отформатировать свой код?