2009-06-25 2 views
0

Привет У меня есть C# программа, которая дает диапазон Excel2007, его FormulaArray следующимпервенствует формула массива

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))))))"; 

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

я знаю, что если я использую FormulaArray использовать стиль 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#, но дольше этого не происходит!

ответ

0

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

EDIT: попробуйте просто установить свойство Formula вместо свойства FormulaArray.

+0

да весь диапазон, т.е. A1: HM232 – 2009-06-25 18:15:52

+0

, тогда он работает как ячейка по ячейке, но это то, чего я не хочу ... Я хочу, чтобы он работал как матрица с вычитанием сложения матрицы и т. Д. – 2009-06-25 18:47:27

1

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

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

Более подробная информация о R1C1 стиле ссылки:

+0

= ROUND ((IF (Лист4! A1: HM232 = 1,0, IF (Sheet4! A1: HM232 = 0,1, Sheet4! A1: HM232))), 0) , но этот работает отлично без каких-либо исключений – 2009-06-25 18:23:31

1

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

range_res("A1").FormulaArray = "=(IF((IF(Sheet4!A1:HM232=1,0,"+ etc 
+0

int C# вы не можете писать range_res («A1») ... диапазон уже указан ... который A1: HM232 на листе ws – 2009-06-25 18:29:15

+0

Мой плохой - у меня нет доступа к C# прямо сейчас, но так оно и работает в VBA. – JeffP

0

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

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

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

1

Вопрос заключается в том, что формула массива не похоже на работу с R1C1 ссылок, потому что теперь у нас есть столбец RC и путает Excel, какой формула стиля применить к FormulaArray пусть свойству

= Sum (RC2 : RC3) - это как формат RC, так и формат A1.

И они не добавили новое свойство, как позволить formulaArrayR1C1

0

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

0

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

Private Sub Tryformula() 
    Range("B2").FormulaR1C1 = "=RC[-1]+R4C4" 
End Sub 
2

У меня было добавленное осложнение, что люди, которых я разрабатываю, используют Excel на испанском языке.
Чтобы получить формулы для работы в не-английских версиях Excel, вы должны использовать другой набор функций, т.е. FormulaLocal вместо Формулы, FormulaR1C1Local Intead из 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 для Формулы массива и
б) вы обычно ожидать ошибки во время выполнения, если использовать английские названия функций.

0

Немного старше нить, однако мой опыт работы с 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, и я всегда могу использовать английские формулы.

Смежные вопросы