Excel加载项 - Delphi等效于VB

时间:2011-09-08 04:53:14

标签: c# delphi excel-vba excel-addins vba

我正在将一个Excel外接程序从Visual VB移植到Delphi 2006.大部分工作正在运行,但我被困在这两个VB行上:

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

其中oXL定义为Excel.Application。

在Delphi中,ExcelApplication.Selection需要索引,但在VB中则不需要。我在C#中找不到类似的东西。我已经尝试过ExcelApplication.ActiveCell,只要有现有查询就行,否则Excel会崩溃。

有没有人知道这会转化为Delphi或C#?

此外,如果oXL.Selection是一个界面,你怎么能执行oXL.Selection&lt;&gt; “”?

谢谢。

3 个答案:

答案 0 :(得分:2)

使用接口从Delphi自动化Excel时,很多方法都采用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;

答案 1 :(得分:0)

不用担心,我忘记了你可以将应用程序IDispatch接口转换为OleVariant,然后调用该方法。

但我所做的只是以下

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

这似乎是让它在不崩溃的情况下工作的唯一方法。

答案 2 :(得分:0)

我经常遇到这个问题,解决方案非常简单 始终使用0作为localeID,一切都将作为例外工作 这将使Excel填写其默认语言环境。

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

您可以使用变体,然后您不会遇到此要求,但在这种情况下:

  • 你的代码将运行得更慢(所有变种魔法需要时间)
  • 您将无法获得有关ExcelApplication方法和属性的上下文帮助。

请注意,selectioncells一样,会返回一个IDispatch,您必须将其转换为Olevariant才能使用它。
同样烦人的事情发生在VBA中,除了强制转换是隐含的。