массив формул Excel - PullRequest
0 голосов
/ 25 июня 2009

привет, у меня есть программа на c #, которая дает диапазон Excel2007, его формула выглядит следующим образом

   Excel.Worksheet ws_res = (Excel.Worksheet)
                      wb.Worksheets.Add(mis, mis, mis, mis);
   Excel.Range range_res = (Excel.Range)ws_res.get_Range("A1","HM232");
   range_res.FormulaArray = "=(IF((IF(Sheet4!A1:HM232=1,0,"+
                     "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232)))=1,0,"+
                     "IF((IF(Sheet4!A1:HM232=1,0,"+
                     "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232)))=0,1,("+
                     "IF(Sheet4!A1:HM232=1,0,"+
                     "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232))))))";

это дает мне исключение, говоря, что формула неверна ... но если открыть Excel-2007 и на новом листе (скажем, sheet5), выберите диапазон A1: HM232 и вставьте приведенную выше формулу непосредственно в строку формул, а затем нажмите Ctrl + Shift + Enter вместе, все будет хорошо, ... плз, можете ли вы сказать мне, как сделать то же самое с C #?

я знаю, что если я использую формула для использования стиля R1C1, но если я использую

              "=ROUND((IF(Sheet4!A1:HM232=1,0,"+
                 "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232))),0)"

он не дает мне никаких исключений и выполняет это так, как будто я сделал Ctrl + Shift + Enter, как из c #, так и непосредственно из Excel

для двух приведенных выше формул я изменил A1: HM232 на R1C1: R232C221, опять же, короче, с c # работает нормально, а с дольше -

Ответы [ 9 ]

2 голосов
/ 11 февраля 2011

У меня было дополнительное затруднение, что люди, которых я разрабатываю для использования Excel на испанском языке.
Чтобы заставить формулы работать в неанглийских версиях Excel, вы должны использовать другой набор функций, например FormulaLocal вместо Formula , FormulaR1C1Local intead of FormulaR1C1 и т. Д.
Очень простой пример, такой как =RC[-1]+R4C4, работает для FormulaArray, но что-то вроде =SUMA(SI(FC(-2)=1;F8C(-3):F1000C(-3);0)), который содержит имена функций Excel и точки с запятой в качестве маркеров аргумента, - нет, вы получаете ошибку времени выполнения.
Обходной путь, который я нашел, заключался в том, чтобы сделать что-то вроде =SUM(IF(AC9=1,AB$8:AB$1000,0)), то есть перевести на английский язык и использовать локальные формулы, а не R1C1 ... и это работает.

Удивительно, потому что
а) опубликованный совет - использовать R1C1 для формул массива и
б) вы обычно ожидаете ошибку времени выполнения, если используете английские имена функций.

1 голос
/ 22 октября 2009

Проблема в том, что массив формул, по-видимому, не работает со ссылками на R1C1, потому что теперь у нас есть столбец RC, и это сбивает с толку Excel вопрос о том, какой стиль формулы применить к свойству FormArray let

= Сумма (RC2: RC3) теперь является форматом RC и справочным форматом А1.

И они не добавили новое свойство let, например FormArrayR1C1

1 голос
/ 25 июня 2009

Я думаю, вам нужно указать первую ячейку для формулы, даже если вы применяете формулу ко всему выделению:

range_res("A1").FormulaArray = "=(IF((IF(Sheet4!A1:HM232=1,0,"+ etc
1 голос
/ 25 июня 2009

Похоже, вам нужно изменить ссылки на ячейки. Из документации FormulaArray :

Если вы используете это свойство для ввода формула массива, формула должна использовать эталонный стиль R1C1, а не A1 эталонный стиль.

Подробнее о стиле ссылок R1C1:

0 голосов
/ 20 апреля 2014

Немного более старая тема, однако мой опыт работы с FormulaArray (с использованием Excel 2010, немецкий):

Как уже упоминал Ричард, сложные формулы в эталонном стиле A1 также не работают для меня. Однако для меня стиль ссылок R1C1 неприменим, так как я предпочитаю работать с именованными ссылками в моих таблицах. У меня работал следующий обходной путь:

Microsoft.Office.Interop.Excel.Worksheet sheet = Globals.ThisAddIn.Application.ActiveSheet;
Microsoft.Office.Interop.Excel.Range range = sheet.Cells[1, 1];
range.Value2 = "=IFERROR(MATCH(INDEX(ForeignTable[ForeignTableField1],MATCH(1,(ForeignTable[ForeignTableField1]=LocalField1)*(ForeignTable[ForeignTableField2]=LocalField2),0)),ForeignTable[ForeignTableField1],0),MATCH(1,(ForeignTable[ForeignTableField3]>=LocalField3)*1,0))"
string formulaArrayString = range.FormulaArray;
range.FormulaArray = formulaArrayString;

Когда я вывожу formulaArrayString, он содержит локализованную (немецкую) версию формулы. Когда я использую локализованную формулу, я не получаю ошибку. Однако, используя временную строку formulaArrayString, я не ограничиваюсь локализованными версиями Excel и всегда могу использовать английские формулы.

0 голосов
/ 18 мая 2010

Вы все еще можете вводить формулы в формате R1C1. Попробуйте это так:

Private Sub Tryformula()
  Range("B2").FormulaR1C1 = "=RC[-1]+R4C4"
End Sub
0 голосов
/ 28 октября 2009

Да, я согласен с Робертом Дж., Поэтому сначала нужно преобразовать одну из формул (предпочтительно в А1). К счастью, есть функция, которая делает это, но затем вам нужно каждый раз запускать макрос, а не просто вводить в ячейку с помощью Ctrl-Shift-Enter.

0 голосов
/ 05 августа 2009

Попробуйте вместо этого использовать суппродукт. Он имеет преимущество быть неявной формулой массива.

myrange.formula = "=sumproduct((logicalExpr1) * (logicalExpr2) * (logicalExpr3))

Это также сделает вашу формулу более читабельной.

0 голосов
/ 25 июня 2009

Сразу над головой, вы хотели применить формулу ко всему диапазону?

РЕДАКТИРОВАТЬ: попробуйте просто установить свойство Formula вместо свойства FormulaArray.

...