• ベストアンサー

アプリケーションのイベント(エクセルVBA)

エクセルを起動した時に、自動的にマクロを起動したいと思っています。どの、ブックを開いても同じマクロが起動させる(別のパソコンで同じファイルを起動した場合は、起動しなくても構いません。)には、アプリケーションのイベントを使う必要があると考え、クラスモジュールを使ってアプリケーションのイベントプロシージャを作ることは、本を読んで何とか理解しました。 -------clasモジュール-------- Public WithEvents App As Application Private Sub App_SheetBeforeRightClick(省略・・)  処理したい内容 Cancel = True end sub -------標準モジュール-------- Sub SetAppEvent() Set myclass.App = Application End Sub と書いて、SetAppEventを実行すると、以降右クリックでイベントが発せいしました。しかし、初めてエクセルを起動した時に一々SetAppEventを実行する必要があります。何か?いい方法は無いでしょうか?ご指導のほど宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 Personal.xls (個人用マクロブック)に、それらは登録しているはずですが、 '標準モジュールに Sub Auto_Open()   Call SetAppEvent End Sub と入れてください。 ThisWorkbook に入れない理由は、インスタンスは、必ず、ブックを起動したときのみに、発生させるようにしないといけないと思うからです。オートメーション・オブジェクトで発生してもよければ、ThisWorkbook_Openにしますが、私は、そのような設定は、思わぬトラブルが発生することがあるので、そのような方式を取りません。私は、そのように設定しています。 逆に、アドインの時は、ThisWorkbook に入れます。 一度、試してみてください。

wan_wan
質問者

お礼

こんばんわ!!ご指導の通りにやってみると出来ました。本当に有難う御座いました。

その他の回答 (1)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんばんは。 >どのブックを開いても同じマクロが起動させる であれば、その「同じマクロ」を、 個人用マクロブック( PERSONAL.XLS )のWorkBook_Openイベントに書いたらどうですか? またはPERSONAL.XLSの標準モジュールに書いて、 PERSONAL.XLSのWorkBook_OpenイベントからCall 外してましたらご容赦!(^^; 以上です。

関連するQ&A

  • VBAのクラスのインスタンス化のタイミングについて

    こんにちはvbaのクラスのインスタンス化について質問があります。 私は普段使えないイベントを使用するときにクラスモジュールに WithEventsを使ってイベントを作成し それをプロシージャからインスタンス化して 作成したイベントを有効にするという手法をよく使います。 Excelのように最初からワークブックにイベントがある場合は、 ワークブックを開いたと同時にWorkbook_Openプロシージャから クラスをインスタンス化して作成したイベントを有効にするということが可能なのですが、 CATIAやInventorなど、一部のアプリケーションでは、 最初から使えるイベントが見つからず、 Subプロシージャでインスタンス化する方法しかみつかりません。 しかし、Subプロシージャを実行させるためには、 ボタンなどユーザー側に何らかのアクションとってもらうしかなく、 自動化するために作成したイベントなのに、そのイベントを有効にするために ユーザーにボタンを押してもらうという矛盾した構成になってしまいます。 クラスをインスタンス化する方法はSubプロシージャに記述するしかないのでしょうか? 自分がよく使っているコードを下に記述します。 下の例は、Excelで新しくブックを開いたときにメッセージを出すプログラムです。 アプリケーションレベルのイベントをクラスモジュールで作成しています。 これを有効にするためには標準モジュール内の Event_ONプロシージャを実行しなければなりません。 モジュールを実行する前まではいくら新しいブックを開いてもメッセージは出ません これをどのうようにしたらいいかご教授ください。 Excelの例 Classモジュール「Class1」に記述 -------------------------------------------------------------------- Private WithEvents APP As Application Private Sub APP_NewWorkbook(ByVal Wb As Workbook) MsgBox "新しいブックが開かれました" End Sub Private Sub Class_Initialize() Set APP = Application End Sub -------------------------------------------------------------------- 標準モジュール「Module1」に記述 -------------------------------------------------------------------- Dim CLS As class1 Public Sub Event_ON() Set CLS = New class1 End Sub --------------------------------------------------------------------

  • 自作クラスのイベントを外部ハンドラでスレッドセーフ

    ■.NETモジュールプロジェクト(DLL) Public Class MyClass   Public Event hoge( ByVal sender As Object, ByVal e As EventArgs )   Private WithEvents Timer As Timers.Timer   Private Sub New()     Timer = New Timers.Timer : Timer.Interval = 10 : Timer.Start()   End Sub   Private Sub fuga( ByVal sender As Object, ByVal e As EventArgs ) Handles Timer.Elapsed     RaiseEvent hoge( Me, New EventArgs ) ' 一定時間ごとにイベントを発生させる   End Sub End Class ■上の.NETモジュールを参照している Windows Form アプリケーションプロジェクト(EXE) Public Class Form1   Private WithEvents foo As MyClass.MyClass   Public Sub New()     InitializeComponent()     foo = New MyClass.MyClass   End Sub   Private Sub bar() Handles foo.hoge     TextBox1.Text = "baz" ' TextBox1 は デザイナで Form1 に貼り付け済み   End Sub End Class という 2 プロジェクトを含むソリューションを作成しました。実行すると、 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox1' がアクセスされました。 というエラーが出てきます。 foo が MyClass ではなく、system.windows.forms.dll などに入っている Button や Form といったコントロールの場合は、上記の bar() のような書き方でもスレッドセーフに扱えるので、MyClass もForm1 のコードを修正する事なく、利用できたらなと思っています。 その場合、どのように MyClass を書けばいいでしょうか。環境は VS2008 で、.NET2.0 ベースです。

  • vbaのイベントについて質問

    vbaでマクロを組んでおります。 mouseupイベント、GetChartElementをもちいて散布図の中のグラフ要素の値を取得したいのですが、 これらのコマンドはグラフシートにしか適用できないでしょうか?グラフシートではうまくいくのですが埋め込みグラフに対して行うとうまくいきません。分かる方いらっしゃいましたら、お願いいたします。 クラスモジュールClass1にて↓ Public WithEvents myChart As Chart Private Sub myChart_MouseUp _ (ByVal Button As Long, _ ByVal Shift As Long, _ ByVal x As Long, _ ByVal y As Long) Dim ElemID As Long, Arg1 As Long, Arg2 As Long myChart.GetChartElement x, y, ElemID, Arg1, Arg2 Select Case ElemID Case xlSeries MsgBox ("データ系列") '⇒データ系列と認識されればメッセージボックスがでるはず Case Else MsgBox ("その他") End Select End Sub 標準モジュールに入力↓ Dim myClass As New Class1 Sub InitializeChart() Set myClass.myChart = ActiveChart End Sub

  • エクセルVBA 「Application.Run」について

    職場のエクセルファイルに以下のようなコードがあります。 これはブック内の○○というマクロを実行するという意味でしょうか? (実際は~~部分に多くのコードがあり、上記のことが正しいのかよくわかりません) Sub test() ~~ Application.Run "ThisWorkbook.○○" ~~ End Sub 以上、よろしくお願いします。

  • エクセルVBAでのwitheventsについて

    お世話になります。 エクセルVBAでクラス側で ListBoxにたいしてwitheventsは使用 できないのでしょうか? Private WithEvents lst As ListBox Public Sub Class_Initializa() Set lst = UserForm1.ListBox1 End Sub 上記コーディングで実行時に 「オブジェクトはオートメーションイベントを 発生させることができません」 になります。 クラス側でダブルクリックイベントを拾いたいのですが。 宜しくお願い致します。

  • エクセルからアクセスのプロシージャーを実行させるには?

    エクセルの標準モジュールには→エクセル側のプロシージャー アクセスの標準モジュールには→アクセス側のプロシージャー と言う名前のプロシージャーが作成されています。 これをどちらもエクセル側で実行させることは出来ないでしょうか? 「アクセス側のプロシージャー」ではアクセス側の処理が実行されます。 でもできればエクセル側のコマンドボタンを一回押すだけで エクセルとアクセスの両方の処理を実行させたいです。 エクセルの標準モジュールには Sub エクセル側のプロシージャー() Call アクセス側のプロシージャー End Sub これを実行すると コンパイルエラーになります。 どうすれば一度で二つのアプリケーションのプロシージャーを実行させることが可能でしょうか? よろしくお願い致します。

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • Excelのマクロが実行されない

    Excelを立ち上げ、VBEでThisWorkbookに以下のマクロを記述します。 Dim WithEvents a As Workbook, WithEvents b As Workbook, WithEvents c As Workbook, WithEvents d As Workbook Private Sub Workbook_Open() Stop End Sub ファイルを保存してから起動し、マクロを有効にすると Stop で停止します。 ここで一旦 Stop を削除してから再度 Stop を挿入してから保存します。 再びこのファイルを起動し、マクロを有効にしても Stop で停止しません。 今回は簡単のため Stop にしていますが、実際には起動時の処理が実行されないため困っています。 OSはWindows7,Excelは2007です。

  • エクセルでWorkbook_BeforeSaveイベントについての疑問

    エクセル2000です。 http://odn.okwave.jp/qa3608360.html の関連質問ですが、これだけでも結構ですのでなにとぞご教示ください。 標準モジュールに以下の3つのマクロを書きました。 Sub text_表示() MsgBox "表示させました。" End Sub Sub text_非表示() MsgBox "非表示にしました。" End Sub Sub 保存() ActiveWorkbook.Save End Sub ThisWorkBookモジュールにこう書きました。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Call text_表示 Application.OnTime Now, "text_非表示" End Sub これで、手動でBOOKを保存すると、まず、MsgBox "表示させました。" そして MsgBox "非表示にしました。" が実行され、当然ながら書いたとおりの働きをします。 ところが、Sub 保存() でマクロからBOOKを保存すると、MsgBox "表示させました。" だけが実行され、MsgBox "非表示にしました。"は実行されません。 どうして、Application.OnTime Now, "text_非表示"は無視されたのでしょうか?

  • エクセルから現在起動しているアクセスファイルをアクティブにしたい

    現在エクセルとアクセスを開いています。 エクセルマクロで現在開いているアクセスをアクティブにしたいのですがうまくいきません。 Sub アクセスをアクティブにする() Dim app As Object Set app = CreateObject("Access.Application") app.Application.Visible = True app.Visible = True End Sub これを実行すると新たに空のアクセスアプリケーションが開きます。 (app.Application.Visible = True)を抜いても同じです。 現在起動中のアクセスファイル(○○○.mdb)をエクセルからアクティブにするにはどうすればいいのでしょうか? ご教授よろしくお願いします。

専門家に質問してみよう