こんばんわ。
Delphiを最近始めたばかりの駆け出しです。
プログラミング自体がビギナーなのですが、Excel VBAで作成したマクロブックを起動するための起動ファイル(EXE)を、以前どこかで教えていただいた以下のコードで作成して動作させています。
***********************************************
program OpenExcel;
uses
Windows, SysUtils, ComObj, Variants;
{$R *.RES}
var
objExcel: OleVariant;
FileName: String;
begin
if InitProc <> nil then TProcedure(InitProc);
//以下の行のブック名を記述/変更します。
FileName := ExtractFilePath(ParamStr(0)) + 'startup.xls';
if FileExists(FileName) then
begin
try
objExcel := CreateOleObject('Excel.Application');
objExcel.Visible := False;
objExcel.Workbooks.Open(FileName);
objExcel.Visible := False;
finally
objExcel := Unassigned;
end;
end;
end.
***********************************************
objExcel.Visible := False;
から、
objExcel.Visible := True;
にしているのは、ユーザーフォームのスプラッシュを起動時に表示
させているので、スプラッシュが3秒間表示し終わったら、Excel
アプリケーションをVisible = True するようになっています。
そこで、起動ファイル(EXE)を使用せず、マクロブックを直接起動
させていたときは、起動時に他のブックが起動していたら、「他の
ブックが起動しています。終了させてから起動してください。」と
いうMsgBoxを表示させるようにし、起動できないような仕様にして
いました。
しかし、起動ファイルを使用するようにしてから、その起動中の他
ブックのチェックをするサブルーチンを読まなくなってしまい、す
んなり起動してしまいます。
推測ですが、上記の起動ファイルの中から、そのルーチンを読み込む
ようにしないとダメなのではないかと考えています。
あるいは、そのルーチンのコードそのものを起動ファイルにコーディング
しないといけないのではないかと。
お手数をかけますが、ご教示いただけると大変助かります。
以下に、起動中のブックをチェックするコードを掲載しておきます。
***********************************************
Sub WBCheck()
Dim i As Long
Dim 一覧 As String
Dim Result As Long
If Workbooks.Count = 1 Then Exit Sub
For i = 1 To Workbooks.Count
If Workbooks(i).Name <> ThisWorkbook.Name Then
一覧 = 一覧 & Chr(13) & Workbooks(i).Name
End If
Next i
Result = MsgBox("以下のブックが起動中です。終了させて下さい。" & Chr(13) & _
"本ブックは単独起動で操作して下さい。" & Chr(13) & "" & 一覧, vbOKOnly, "ブック同時起動警告")
If Result = vbOK Then
On Error Resume Next
Application.CommandBars("User Menu Bar").Delete
On Error GoTo 0
End If
ActiveWorkbook.Close
End Sub
***********************************************
訂正です。
>objExcel.Visible := False;
>objExcel.Workbooks.Open(FileName);
>objExcel.Visible := False;
↓
objExcel.Visible := False;
objExcel.Workbooks.Open(FileName);
objExcel.Visible := True;
ツイート | ![]() |