Надстройка Excel - Delphi, эквивалентный VB - PullRequest
1 голос
/ 08 сентября 2011

Я портирую надстройку Excel из Visual VB в Delphi 2006. Большая часть ее работает, но я застрял в следующих двух строках VB:

oXL.Selection.QueryTable
oXL.Selection <> ""

, где oXL определяется как Excel.Приложение.

В Delphi ExcelApplication.Selection требуется индекс, а в VB - нет.Я не мог найти ничего подобного в C # либо.Я пробовал ExcelApplication.ActiveCell, который работает до тех пор, пока существует существующий запрос, в противном случае происходит сбой Excel.

Кто-нибудь знает, что это означает для Delphi или C #?

Также, если oXL.Выбор является интерфейсом, как вы можете выполнить oXL.Selection <> ""?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

При автоматизации Excel из Delphi с использованием интерфейсов многие методы используют LCID. Для этого вы можете использовать LOCALE_USER_DEFAULT.

var
  oxlSelection: ExcelRange;

ExcelApplication.ActiveCell.QueryTable;
if Supports(fExcelApplication.Selection[LOCALE_USER_DEFAULT], ExcelRange, oxlSelection)
  and (VarToStr(oxlSelection.Text) <> '') then
begin
  //do something
end;
0 голосов
/ 08 сентября 2011

Я много раз сталкивался с этой проблемой, решение очень простое.
Всегда используйте 0 для localeID, и все будет работать как исключение.
Это заставит Excel заполнить его по умолчаниюlocale.

ExcelApplication.ActiveCell.QueryTable;
if OleVariant(ExcelApplication.Selection[0]).Value <> '' then .....

Вы можете использовать варианты, и тогда вы не будете соблюдать это требование, но в этом случае:

  • ваш код будет работать медленнее (все, что требует магия вариантов)время)
  • у вас не будет контекстной справки по вашим методам и свойствам ExcelApplication.

Обратите внимание, что selection, как и cells, возвращает IDispatch, который вы должны привести кOlevariant, для работы с ним.
То же самое раздражает, что происходит в VBA, за исключением того, что приведение неявно.

0 голосов
/ 08 сентября 2011

Не беспокойтесь, я забыл, что вы можете просто привести интерфейс приложения IDispatch к OleVariant, а затем вызвать метод.

Но вместо этого я сделал следующее

try
  ExcelApplication.ActiveCell.QueryTable.Refresh(False);
except
end;

Кажется, это единственный способ заставить его работать без сбоев в Excel.

...