1

我正在将一个 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 <> ""?

谢谢你。

4

3 回答 3

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;
于 2011-09-08T07:08:07.487 回答
0

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

但我所做的只是以下

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

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

于 2011-09-08T05:15:32.127 回答
0

这个问题我遇到过很多次,解决方法很简单。
始终使用0localeID,一切都会正常工作。
这将使 Excel 填写其默认区域设置。

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

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

  • 您的代码运行速度会变慢(所有变体魔法都需要时间)
  • 您将不会获得有关 ExcelApplication 方法和属性的上下文帮助。

请注意selection,就像cells返回 IDispatch 一样,您必须将其转换为 Olevariant 才能使用它。
同样烦人的事情发生在 VBA 中,除了演员表是隐式的。

于 2011-09-08T12:18:30.837 回答