2014-11-19 1 views
0

Я использую SpreadsheetGear и получил таблицу с макросом VBA, который мне нужно преобразовать в пользовательскую функцию (поскольку SSG не может обрабатывать код VBA). Макрос вызывает функции Excel (Match, Index), и я не вижу, как вызывать эти функции из моей пользовательской функции. Любые идеи, если это возможно и как это сделать?Могу ли я вызвать функцию электронной таблицы из пользовательской функции в SpreadsheetGear

Благодаря

ответ

1

Вы можете оценить формулу строки Excel с помощью ISheet. EvaluateValue (...) способ. Пример:

// A1:A3 on "Sheet1" will be summed up. 
object val = workbook.Worksheets["Sheet1"].EvaluateValue("SUM(A1:A3)"); 

// Ensure we actually get a numeric value back 
if(val != null && val is double) 
{ 
    double sum = (double)val; 
    Console.WriteLine(sum); 
} 

Однако, это звучит, как вы будете использовать этот метод внутри пользовательской функции, так что я должен указать, что вы не можете использовать этот метод для любого листа, который принадлежит к какой-либо книге в IWorkbookSet, что в настоящее время рассчитывается. Ознакомьтесь с правилами, которые изложены в разделе «Примечания» для функции. Evaluate (...) метод, наклеенные ниже, в частности, те, которые я жирным шрифтом:


Реализация этого метода должна следовать ряду правил:

  • Метод должен быть поточно. Некоторые версии SpreadsheetGear вызывают этот метод из нескольких потоков одновременно.
  • Метод не должен использовать какой-либо API в наборе рабочей книги, который вычисляется, за исключением IArguments.CurrentWorksheet.Name, IArguments.CurrentWorksheet.Index или IArguments.CurrentWorksheet.Workbook.Name.
  • Весь доступ к ячейкам должен быть через аргументы.
  • Доступ к индексу индекса IArguments имеет побочный эффект преобразования ссылок на диапазоны или массивы в одно простое значение. Используйте GetArrayDimensions и GetArrayValue для доступа к отдельным значениям диапазона или массива. Например, если первым аргументом пользовательской функции является диапазон A1: C3, установка часов в аргументах [0] в отладчике преобразует этот диапазон в одно простое значение.
  • Никакие ссылки на интерфейсы или объекты, переданные или полученные во время выполнения этого метода, не должны использоваться после завершения этого метода.

Так что, если вы звоните ISheet. EvaluateValue (...) в вашей пользовательской функции, это должно быть сделано на каком-то листе, который принадлежит IWorkbookSet, отличному от того, который в настоящее время вычисляется. Это также необходимо было бы сделать поточно-безопасным способом, согласно первому правилу, упомянутому выше.

+0

Спасибо за помощь. Я не заметил IArguments.currentWorksheet! Как оказалось, я заставил их переделать таблицу без макрокода, но это будет полезно для будущей справки. –

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