我正在将一个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; “”?
谢谢。
答案 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 .....
您可以使用变体,然后您不会遇到此要求,但在这种情况下:
请注意,selection
与cells
一样,会返回一个IDispatch,您必须将其转换为Olevariant才能使用它。
同样烦人的事情发生在VBA中,除了强制转换是隐含的。