エクセルでマクロを仕込んだブックファイル形式は、二種類が存在しています。
一つは、標準的な”*.xlsm”で、もう一つはバイナリー形式の”*.xlsb”でしたな。
それで、標準的なファイル形式では問題なく動作しても、バイナリーがエラー。
エラーコードの91番が出て、オブジェクト変数が未設定だと警告されてしまう。
或いは、Withブロック変数が設定されていないとも警告されるのですが戸惑う。
今回は、ブック起動時にブックを最小化してユーザーフォームを開く設定です。
書いたコードもシンプルで次のようになりますが、変数設定もされていません。
しかも、同じ内容でも標準ファイル形式のブックは、完全動作なのが不思議ね。
まあ、たまさか動いたとして、ユーザーフォームも最小化されてしまいました。
なので、タスクバーのエクセルアイコンをクリックで、フォームを呼び出すの。
Private Sub Workbook_Open()
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
ActiveWindow.WindowState = xlMinimized
Load UserForm1
UserForm1.Show vbModeless
End Sub
上のコードは、問題になる部分を抜き書きしたので、実際はもう少し煩雑です。
ですが、キモになるコードはこれだけで、どうも”ActiveWindow”が怪しそう。
だって、オブジェクト変数の設定をするとすれば、Windowぐらいなものです。
なので、変数を設定して、Setで指定するコードに書き直して実行してみました。
Private Sub Workbook_Open()
Dim Wn As Window
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
Set Wn = ActiveWindow
Load UserForm1
Application.WindowState = xlMinimized
Call Workbook_WindowResize(Wn)
End Sub
Private Sub Workbook_WindowResize(ByVal Wn As Window)
If Wn.WindowState = xlMinimized Then
UserForm1.Show vbModeless
End If
End Sub
すると、あら不思議、問題は収まってくれてバイナリーのブックでエラーなし。
ちゃんと起動してくれましたが、ウインドウを変数にして状態確認させただけ。
ですが、エラー91の出現を抑えるのには、これしかなかったという次第です。
それから、プロシージャを変数渡しで二つに分ける必要もないのですが保険だ。
変数を使って渡して、その挙動を確認させておけば変数の意味がはっきりする。
というわけで、ExecuteExcel4Macroという古色蒼然たる、コードが問題かな。
かなり初期のExcel4.0マクロから組み込まれていたものですが、VBAが使える以前から存在していたという古語で、マイクロソフトもVBAへの移行を推奨する中で、このコマンドに代わるものがない以上、使わざるを得ないなと思ったのでした。
0 件のコメント:
コメントを投稿