2011-09-08 65 views
1

我移植的Excel從視覺VB加載到德爾福2006年它的大部分工作,但我被困在這兩個VB線:Excel加載 - 德爾福equivilent到VB

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

其中oXL被定義爲Excel.Application。

在Delphi ExcelApplication.Selection需要一個索引,但在VB中它不。我在C#中找不到任何類似的東西。我已經嘗試了ExcelApplication.ActiveCell,只要存在現有查詢,就會工作,否則Excel崩潰。

有誰知道這是爲Delphi或C#翻譯成什麼?

此外,如果oXL.Selection是一個接口,你怎麼執行oXL.Selection <>「」?

謝謝。

+1

'ExcelApplication.Selection需要索引'。您可以在「ExcelApplication」的源代碼中查看,並查看該索引是區域設置ID。它也記錄在MSDN上。 –

回答

0

不用擔心,我忘記了您可以將應用程序的IDispatch接口轉換爲OleVariant,然後調用該方法。

但我做了什麼,而不是僅僅是以下

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

這似乎是讓它不崩潰的Excel工作的唯一途徑。

+0

奇怪。從理論上講,你調用IDispatch/OleVariant的任何東西都應該在具有特定接口的類型庫中的某個地方可用,儘管它有時會讓你走很長的路。 –

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; 
0

我跑過這個問題很多次了,解決方法很簡單。
始終使用0作爲localeID,並且所有內容都將以例外方式工作。
這將使Excel填充其默認語言環境。

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

您可以使用變量,然後你不吃虧這一要求,但在這種情況下:

  • 你的代碼運行速度會變慢(所有變型魔法需要時間)
  • 你會對您的ExcelApplication方法和屬性沒有上下文幫助。

注意selection,像cells回報IDispatch接口,那你必須轉換爲Olevariant,爲了與它合作。
在VBA中會發生同樣令人討厭的事情,除非演員是隱式的。

+0

ExcelApplication.Selection [LCID]返回一個IDispatch,這個接口沒有'Value'屬性 –

+0

哦,我忘了''selection',就像'cells'是那些返回一般OleVariant對象的惱人的屬性之一。它在VBA中也是如此。很煩人。 – Johan