プロが教えるわが家の防犯対策術!

 Excelで、ファイルを開いたときに、そのファイルのモジュールシートの内容を自動的に更新するVBAを書きたいのです。
 gooで質問しながらも、とりあえず自分で以下のように作ってみました。どのような方法にしたかというと、Auto_Openでファイルを開いたときに、まず対象となる更新前のモジュールシートを削除(更新前が存在しない場合はエラーになるのでOnErrorGotoで回避)し、その後、あらかじめ更新後の内容を記述しておいたC:\定義.txtというファイルを更新後のモジュールシートとして付け加えるというものです。
 とりあえずはうまく内容更新できたのですが、ファイルを開いた際に自動的同時に開かれるBook1.xlsなどのファイルにも更新後のモジュールシートが付け加わってしまうのです。つまり、更新させたいファイルだけでなく、その他のファイルも更新の対象となってしまう場合があるのです。
 いろいろ試してみると、すでにExcelを立ち上げた状態で当ファイルを開いた場合は、それ以前に開いていたファイルが更新対象になることはないようです。Excelを立ち上げていない状態からエクスプローラなどで当ファイルを開き、同時に自動的にExcelやBook1などのファイルも立ち上がる際に、Book1なども更新対象となってしまうようです。
 更新させたいファイルのモジュールシートだけを更新するには、どのようにVBAを書いたらいいのか、ヒントくらいでも結構ですのでご教授ください。


Sub Auto_Open()
削除
追加
End Sub

Sub 追加()
With Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_StdModule)
.Name = "定義"
.CodeModule.AddFromFile ("C:\定義.txt")
End With
End Sub

Sub 削除()
On Error goto trap
Application.VBE.ActiveVBProject.VBComponents.Remove _
Application.VBE.ActiveVBProject.VBComponents("定義")
Trap:
End Sub

A 回答 (2件)

ファイル名やVBProject名を利用して、処理分岐させてはどうでしょうか?



VBProject名は Application.VBE.ActiveVBProject.Name
ファイル名は VBProject名ActiveWorkbook.Name

で取得できますので、処理対象のファイルに特定の名前かVBProject名を設定し、それ以外は処理対象外にすると言う感じで…

if Application.VBE.ActiveVBProject.Name<>"MyVBProject" then exit sub
とか
if ActiveWorkbook.Name<>"MyVBAfile.xls" then exit sub
    • good
    • 0
この回答へのお礼

ありがとうございました。うまくいきました。

お礼日時:2003/04/19 15:50

こんにちは。



もっと良い方法があるかも知れませんが、プロジェクト名を任意の物にして判定するとか。

予め「TestProject」にして

Sub Auto_Open()
 置換
End Sub

Sub 置換()
Dim vbc
With Application.VBE.ActiveVBProject
 If .Name = "TestProject" Then
  For Each vbc In .VBComponents
   If vbc.Name = "定義" Then
     .VBComponents.Remove (vbc)
     Exit For
   End If
  Next vbc
  Set vbc = .VBComponents.Add(vbext_ct_StdModule)
    vbc.Name = "定義"
    vbc.CodeModule.AddFromFile ("C:\定義.txt")
 End If
End With
End Sub


なぜこの様な処理が必要なのでしょう?
興味あります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
実は、指定した日付から銀行営業日(土日祝や年末年始を除く日)で3営業日後とか5営業日後とかの日付を返すFunction関数を作ったのですが、春分の日や秋分の日は他の祝日とは違い、確定した日付ではなく、毎年、官庁から公表される日付が適用されるため、Function関数自体を少し直す必要があるのです。(もっと良い方法があるのかも知れませんが…)
この関数自体をたくさんのファイルで使っているため、いちいち全てのファイルを修正するのがメンドクサイため、このような方法を行っています。

またよろしくお願いします。

お礼日時:2003/04/19 16:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!