TOLEContainer内のExcelから値を取得するときの挙動

126 views
Skip to first unread message

K.Kurokawa

unread,
Apr 24, 2020, 6:47:52 AM4/24/20
to radstu...@googlegroups.com
お世話になっています、黒川と申します。

Delphi7のTOleContainerに格納しているExcelのブックデータ
から指定のシート及び行列位置から値を取得したいのですが、

1)Excelを表示させないで値が取得できないでしょうか?
一旦オブジェクトを表示状態にしないと、値が取得できません。
そのため、画面がチラっとフラッシュするような感じなのですが、
ovOpenではなくovHideにすると、OSとExcelのバージョンの組み合わせ
によって値が取得できなくなります。

2)ブックのクローズメソッドがエラーになりますが記載の仕方でしょうか?
記述の仕方の問題かと思いますが、ブックのクローズメソッドを
処理すると、ブック自体は閉じるように見えますが、エラーが
表示されます。

すみませんアドバイスいただけると助かります。

~(省略)~
// オブジェクト取得
try
MsExcel := AOLE.OleObject.Application;
except
// こっそり起動してみる
AOLE.DoVerb(ovOpen); ←Excelが実際に起動および表示するので
MsExcel := AOLE.OleObject.Application;
MsExcel.Visible := False; ←ここで表示を消してます
Application.ProcessMessages;
end;


// ブック取得
WkBook := MsExcel.ActiveWorkBook;
if VarType(WkBook) = VarDispatch then begin
{ここで値取得とか}
WkSheet := WkBook.Sheets['Sheet1'];
if VarType(WkSheet) = VarDispatch then begin
Memo1.Lines.Add(WkSheet.Name);
for Row := 1 to 5 do begin
Memo1.Lines.Add(WkSheet.Cells[Row, 1].Value);
end;
end;

// 終了
MsExcel.DisplayAlerts := False;
try
WkSheet := UnAssigned;
// WkBook.Close; ←注釈を外してブックのクローズをするとエラー
になります
WkBook := UnAssigned;
finally
MsExcel.Quit;
end;
end;
~(省略)~
TEST_OLEFIX.zip

"寄木 康彦(Yasuhiko Yoriki)"

unread,
Apr 24, 2020, 7:36:15 AM4/24/20
to radstu...@googlegroups.com
寄木@神戸です。

環境は、Delphi 10.3 Rio です。
参考になるかどうかわかりませんが、私が普段使っているコードを示します。

このコードは、以下のMr. XRAYさんのサイトから拝借して、1番安定して使えて
います。

http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm

=================宣言===============
var
Excel : OleVariant;
ExcelApp : OleVariant;
WorkBook : OleVariant;
WorkSheet: OleVariant;
SheetName: OleVariant;

procedure ExcelOpen(fn: TFileName);
procedure ExcelClose;

==============実際のコード実現部======================

procedure TfMain.ExcelOpen(fn: TFileName);
var
hFile : THandle;
tmp : String;
begin
try
if VarIsEmpty(Excel) then
begin
hFile := FileOpen(fn, fmOpenReadWrite);
if hFile = HFILE_ERROR then
begin
FileClose(hFile);
Excel := GetActiveOleObject('Excel.Application');
ExcelApp := Excel.Application;
end
else
begin
FileClose(hFile);
Excel := CreateOleObject('Excel.Application');
ExcelApp := Excel.Application;
ExcelApp.WorkBooks.Open(fn);
end;

Excel.Visible := false; // 非表示で起動
WorkBook := ExcelApp.ActiveWorkBook;
WorkSheet := WorkBook.WorkSheets[1]; //対象シート
WorkSheet.Activate;
end;
finally
;
end;
end;


procedure TfMain.ExcelClose;
begin
if not VarIsEmpty(Excel) then
begin
WorkBook.Close;
WorkBook := unAssigned;
WorkSheet := unAssigned;
ExcelApp.Quit;
ExcelApp := unAssigned;
Excel.Quit;
Excel := unAssigned;
end;
end;

==========================================

よくわからずにコピペで使っているので、間違っているところがあるかもしれま
せんが、今のところ、特に支障なく動作しています。


-----------------------------------------------------------
Yasuhiko Yoriki 寄木康彦
mailto:yor...@yoriki.jp
http://www.yoriki.jp/

K.Kurokawa

unread,
Apr 26, 2020, 8:58:22 PM4/26/20
to radstu...@googlegroups.com
寄木様

ありがとうございます。

参考にさせていただきます。
> --
> このメールは Google グループのグループ「Japan RAD Studio User Group」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには radstudio-jp...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/radstudio-jp/20200424203610.F62B.C25B8F8E%40yoriki.jp にアクセスしてください。


Reply all
Reply to author
Forward
0 new messages