Excel保存時にアクティブなシートを指定するには?

解決


さばたん  2003-09-25 05:45:06  No: 4982

お世話になります。
Windows2000
Delphi5

既存のExcelファイルに書き込みを行っています。
(シートは1〜3で、シート2がアクティブな状態で保存されています)

procedure TForm1.Button1Click(Sender: TObject);
var
  OpenFileName: String;
  Excel: Variant;
  Application: Variant;
  WorkBook: Variant;
  WorkSheet: Variant;
begin
  OpenFileName := 'c:\test.xls';
  Excel := CreateOleObject('Excel.Application');
  Application := Excel.Application;
  Application.Visible := false;
  Application.WorkBooks.Open(FileName := OpenFileName, readOnly := false);
  WorkBook := Application.ActiveWorkbook;
  WorkSheet := Application.ActiveSheet;

  //シート3に書き込む
  WorkSheet := WorkBook.WorkSheets[3];
  WorkSheet.Cells[2,3].Value := 'test';

  //シート1をアクティブにする
  WorkSheet := WorkBook.WorkSheets[1];    // ← ●?

  WorkBook.Save;  //上書き保存
  Application.WorkBooks.Close;
  Excel.Quit;
end;

保存されたファイルを開くと
操作前と同様にシート2がアクティブな状態で保存されています。
これをシート1をアクティブにした状態で保存させたいのですが
どのようにすればよいのかどなたかご教授お願いします。


Mr.XRAY  URL  2003-09-25 08:41:07  No: 4983

>保存されたファイルを開くと
>操作前と同様にシート2がアクティブな状態で保存されています。
>これをシート1をアクティブにした状態で保存させたいのですが

開いた時にシート1をアクティブにするんじゃダメなんですか?
シート3が見えてからシート1になるのが体裁悪ければ,
非表示にして,シート1をアクティブにしてらか表示するとか...


にしの  2003-09-25 17:40:39  No: 4984

> 開いた時にシート1をアクティブにするんじゃダメなんですか?
> シート3が見えてからシート1になるのが体裁悪ければ,
> 非表示にして,シート1をアクティブにしてらか表示するとか...
Delphiで開くならOKでしょうが、Excelで開いたときにはマクロを用意しないと駄目ですよね。

WorkSheet := Application.ActiveSheet;

として、

//シート1をアクティブにする
WorkSheet := WorkBook.WorkSheets[1];    // ← ●?

としても、ActiveSheetは変更されませんよ。
単純に、WorkSheetにWorkBook.WorkSheets[1]が代入されるだけです。

Application.ActiveSheet := WorkBook.WorkSheets[1];
では駄目でしょうか。
# 未確認です

気になったのですが、グローバル変数にApplicationがありますが、Applicationというローカル変数を用意すると、ネームスペースから指定しないとグローバル変数Applicationが使えません。今のところは問題ないと思いますが。
できるだけ、使用頻度の高いグローバル変数と同じ名前のローカル変数を使うことはさけた方がよいです。


さばたん  2003-09-25 20:05:19  No: 4985

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

> Mr.XRAYさん
にしのさんがおっしゃる通りな感じで、
Delphiで保存したExcelファイルを普通に開いた時に
シート1がアクティブになっているようにしたい次第なのです。

> にしのさん
WorkSheet := WorkBook.WorkSheets[1];
の意味を取り違えていました。

変数なども変えて下記のようにしました。
(Windows2000, Delphi5, Excel2000 SP3)

procedure TForm1.Button1Click(Sender: TObject);
var
  OpenFileName: String;
  Excel: Variant;
  WorkBook: Variant;
  WorkSheet: Variant;
begin
  OpenFileName := 'c:\test.xls';
  Excel := CreateOleObject('Excel.Application');
  Excel.Visible := false;
  Excel.WorkBooks.Open(FileName := OpenFileName, readOnly := false);
  WorkBook := Excel.ActiveWorkbook;
  WorkSheet := Excel.ActiveSheet;

  //シート3に書き込む
  WorkSheet := WorkBook.WorkSheets[3];
  WorkSheet.Cells[2,3].Value := 'test';

  //シート1をアクティブにする
  Excel.ActiveSheet := WorkBook.WorkSheets[1];    // ← ●

  WorkBook.Save;  //上書き保存
  Excel.WorkBooks.Close;
  Excel.Quit;
end;

すると、「メンバが見つかりません」というメッセージが出てしまいます。。
Webなどでも調べたのですがわかりませんでした。
どうかご教授をお願いします。


kazu  2003-09-25 21:15:31  No: 4986

Excel.WorkSheets[1].Activate;
では?


さばたん  2003-09-25 21:57:57  No: 4987

kazuさん、ありがとうございます。

できました!
Activate を使うのですね。
勉強になります。

Mr.XRAYさん、にしのさん、kazuさん
どうもありがとうございました。


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

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






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