Delphi2005でのExcelApplicationのエラー

解決


TS  2005-11-12 05:34:13  No: 18642

ExcelApplicationを使用して
Delphi7で動作していたプログラムを2005に変更しようと
下記のコードで2005追加の部分を変更しただけなのですが
アドレス0000000でアドレス00000000に対する読み込み違反が
おきましたと実行時エラーが出ます。
delphi2005ではまだ、変更しなくてはいけない所があるのでしょうか。
ご教授ください。

LCID := GetUserDefaultLCID;
    //エクセル起動・初期処理
    ExcelApplication1.Connect;
    //エクセル表示
    ExcelApplication1.Visible[LCID]  :=  True;
    Excel_Filename:='TEST.xls';
    //Excelファイルをオープンします。
    ExcelApplication1.Workbooks.Open(
    Excel_FileName, //FileName: WideString
        EmptyParam, //UpdateLinks: OleVariant
        EmptyParam, //ReadOnly: OleVariant
        EmptyParam, //Format: OleVariant
        EmptyParam, //Password: OleVariant
        EmptyParam, //WriteResPassword: OleVariant
        EmptyParam, //IgnoreReadOnlyRecommended: OleVariant
        EmptyParam, //Orign: OleVariant
        EmptyParam, //Delimiter: OleVariant
        EmptyParam, //Editable: OleVariant
        EmptyParam, //Notify: OleVariant
        EmptyParam, //Converter: OleVariant
        EmptyParam, //AddToMru: OleVariant
        EmptyParam, //Local              2005追加
        EmptyParam, //CorruptLoad        2005追加
        LCID //lcid: Integer;
        );


Mr.XRAY  URL  2005-11-12 06:43:40  No: 18643

>Delphi7で動作していたプログラムを2005に変更しようと

Delphi7で動作していたのであればD2005(Win32)でも基本的には動作
すると思います.D2005(Win32)用に修正するというよりも,使用する
Excelのユニット(Importフォルダの)と,操作対象のExcelのバージョン
が問題であって,これはDelphi7でも同じと考えられます.

>        EmptyParam, //Local              2005追加
>        EmptyParam, //CorruptLoad        2005追加

したがって,何故,この追加が必要であったかが,エラー回避には
重要な情報でしょう.


TS  2005-11-12 17:45:04  No: 18644

Mr.XRAYさん回答ありがとうございます。
ご指摘のExcelのバージョンはExcel2000を使用していて
Delphi7で  uses  Excel2000,   Excel97;
Delphi2005で  uses  Excel2000,   ExcelXP;
で使用してます、上記のExcel97、ExcelXPは削除しても
実行時に自動的に記入されます。
2005追加と記入した部分はパラメータがこれでないと
受け付けてくれなくて、パラメータが足りないとエラーになります。
Mr.XRAYさんのエクセル操作フォーム  テストプログラム Basic
を実行してみましたが、問題なく動作します。
最初に書いたExcelApplication1.Visible[LCID]  :=  True;
のところでExcelは起動するのですが、
ExcelApplication1.Workbooks.Open(
のところで、エラーとなります、これは私のパソコンの動作環境の
性なのでしょうか。


Mr.XRAY  URL  2005-11-12 20:13:16  No: 18645

>で使用してます、上記のExcel97、ExcelXPは削除しても
>実行時に自動的に記入されます。

もし,usesにExcel2000だけ,あるいはExcelXPだけであれば多分ちゃんと
動作すると思います.ServersタブのExcel関係のコンポほ配置して使用
していると判断しました.
これは,おそらく,

初期状態でExcelXPを使用する設定となっている.この確認は
[コンポーネント][パッケージのインストール]で
Microsoft Office2000 Sample Automation Sever Wrapper Components
があれば,Excel2000が初期状態.
Microsoft OfficeXP Sample Automation Sever Wrapper Components
があれば,ExcelXPが初期状態.

対策しては,バーケージからXPのものを削除し,2000のものを追加して,
コードはExcel2000専用とする,といった感じでしょうか.

>Mr.XRAYさんのエクセル操作フォーム  テストプログラム Basic
>を実行してみましたが、問題なく動作します。

これは,Excel2000,XPのどちらでも動作するコードしか使用して
いないからでしょう(Wordbook.Openは使用していない).


Mr.XRAY  URL  2005-11-12 20:33:28  No: 18646

>これは,Excel2000,XPのどちらでも動作するコードしか使用して
>いないからでしょう(Wordbook.Openは使用していない).

スミマセン.間違えました.私のエクセル操作フォームでは,Serversタブの
コンポーネントを配置せず,コードの内部で生成しているからです.
そうすることにより,たとえOfficeXPのパッケージがインストールされて
いても,強制的にExcel2000.pasを使用するようになっています.
(ExcelXPがusesに自動的に追加されることはないようになっている)


TS  2005-11-13 05:03:35  No: 18647

>対策しては,バーケージからXPのものを削除し,2000のものを追加して,
>コードはExcel2000専用とする,といった感じでしょうか.
上記ご指摘の通りを実行しましたら今迄通りの動作をする様になりました。
何日か頭を悩ませた事が、解決しました。

Mr.XRAYさん、ありがとうございます。

追加の質問なんですが、今までは、Uses にExcel97、Excel2000、ExcelXPを
同時に設定していて、Excel97、Excel2000で使用出来ていたのですが、
ExcelXPは未使用なので分かりませんが、Delphi2005でExcel2000のユニット
だけ使うと言うことはExcel97、ExcelXPでは使用できないのでしょうか。

>私のエクセル操作フォームでは,Serversタブの
>コンポーネントを配置せず,コードの内部で生成しているからです.
テストプログラム BasicではServersタブのコンポーネントが配置されている
と思うのですが、どう違うのでしょうか、教えてもらえませんか。


Mr.XRAY  URL  2005-11-13 05:41:09  No: 18648

>だけ使うと言うことはExcel97、ExcelXPでは使用できないのでしょうか。

使用できます.ただし,ExcelXPで追加になった機能は使用できないという
ことです.
例えば,拙作のエクセル操作フォームではExcel97,2000,2002(XP),2003が
使用可能になっています.

>テストプログラム BasicではServersタブのコンポーネントが配置されてい

そうでした.BasicではExcel2000,ExcelXP共通の機能しか使用していない
からですね.

>何日か頭を悩ませた事が、解決しました。

大変お疲れ様です.わたしだって,ここまでくるのに何日どころか,何ヶ月
も何年もかかっていますよ(笑).


Mr.XRAY  URL  2005-11-13 05:53:11  No: 18649

どうもそそっかしくていけませんね.

>使用できます.ただし,ExcelXPで追加になった機能は使用できないという
>ことです.

逆に,Excel97ではExcel2000で追加になった機能は使用できませんから,
コード内で判断(特にTSさんが悩んだOpen...は引数が違う)して分岐する
必要があります.これはどうしょうもないです.

これがいやで避けるには,[Servers]タブのTExcel...ではなくて,以下の
様にCreateOLEObjectを使用します.

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_OleObject.htm


TS  2005-11-13 06:28:48  No: 18650

>コード内で判断(特にTSさんが悩んだOpen...は引数が違う)して分岐する
>必要があります.これはどうしょうもないです.
感じが少し分かってきました、やはり、[Servers]タブのTExcel...を
使用したいのですが、上記の分岐とはどの様にすればいいのでしょうか。


Mr.XRAY  URL  2005-11-13 06:44:05  No: 18651

>使用したいのですが、上記の分岐とはどの様にすればいいのでしょうか。

以下の様に起動中のExcelのバージョンを調べて,そのバージョンによって
if .... then  などで分岐します.
TExcelApplication.Application.Version[LCID];

ApplicationオブジェクトのVersionプロパティはどのバージョンのExcelに
もあります(ないと困ります).


TS  2005-11-13 07:01:48  No: 18652

色々な質問に答えていただいてありがとうございました。
喫茶XRAYにも時々覗かせてもらってます。
以前にもお世話になりましたが、これからも宜しくお願いします。
これで、全て解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加