• ベストアンサー

ExcelVBAでモジュールシートの内容更新を自動で行いたい

 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

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

  • ベストアンサー
  • wildcard
  • ベストアンサー率54% (54/100)
回答No.1

ファイル名や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

takaandhiro
質問者

お礼

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

その他の回答 (1)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

こんにちは。 もっと良い方法があるかも知れませんが、プロジェクト名を任意の物にして判定するとか。 予め「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 なぜこの様な処理が必要なのでしょう? 興味あります。

takaandhiro
質問者

お礼

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

関連するQ&A

  • excel VBA コピーファイルのマクロ削除

    下記3つの、プロシージャを組み合わせて、下記のやりたいことをやりたいのですが、うまくいきません。 どうかご教授の程よろしくお願いいたします。 excelは2000です。 ○やりたいこと 今現在開いているファイルの、コピーをデスクトップに保存して、その保存したブックのマクロ(標準モジュールと、コマンドボタン)を削除したい。 ○自分でやろうとすると コピーをデスクトップに保存すると、コピー元のファイルが勝手に閉じてしまい、コピー先のファイルのマクロを削除できない。 '■デスクトップにコピー保存 Sub copysave() Dim 場所 As String 場所 = CreateObject("WScript.Shell").SpecialFolders("Desktop") ActiveWorkbook.SaveAs Filename:=場所 & "\" & Format(Date, "yyyymmdd") & "○◆△.xls" End Sub '■標準モジュールの削除 Sub DelModule() Application.VBE.ActiveVBProject.VBComponents.Remove _   Application.VBE.ActiveVBProject.VBComponents("Module1") Application.VBE.ActiveVBProject.VBComponents.Remove _   Application.VBE.ActiveVBProject.VBComponents("Module2") End Sub '■CommandButtonの削除 Sub DelCommandButton() Dim c As Excel.OLEObject For Each c In Worksheets(1).OLEObjects   If TypeOf c.Object Is Msforms.CommandButton Then c.Delete End If Next End Sub

  • シートモジュールからのErr.Raiseについて

    Excel(Office 2007)で以下のようにシートモジュールで 発生したエラーの詳細を標準モジュール側で取得しようとしたところ SourceとDescriptionで指定した文字列が取得できませんでした。 どうすれば指定した元の文字列を取得することができるでしょうか。 どなたかお知恵をお貸しください。 【シートモジュール(Sheet1)内のソースコード】 Public Sub Hoge()     Err.Raise Number:=1000, Source:="Fugo", Description:="Fuga" End Sub 【標準モジュール内のソースコード】 Public Sub Piyo()     On Error Goto Error1     Sheet1.Hoge     Exit Sub Error1:     MsgBox "Num=" & Err.Number & ", Src=" & Err.Source & ", Dsc=" & Err.Description End Sub 【MsgBoxの表示結果】 Num=1000, Src=VBAProject, Dsc=アプリケーション定義またはオブジェクト定義のエラーです。  

  • アクセスで標準モジュールの中身を書き出したい

    http://officetanaka.net/excel/vba/vbe/05.htm の Sub Sample9() Dim Code As String Code = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(7, 5) MsgBox Code End Sub のエクセルではなく アクセスバージョンはないでしょうか? http://d.hatena.ne.jp/taka_2/20090907/p2 をアクセスの標準モジュールに貼り付けてみたのですが inFileName = WScript.Arguments(0) で実行時エラー424になってしまいます。

  • VBAでユーザーに別ファイルのシートを選ばせたい場合

    エクセル2000です。 マクロを記載したBOOKを開いたままで、ユーザーに作業の対象とするファイルを開かせ、その中の対象とするファイルを選ばせたら次のマクロに移りたいのですが、以下のマクロですと開いたらすぐ実行されてしまいます。 開いてからユーザーがシートをアクティブにするまで実行を止めるにはどうしたらよいのでしょうか? BOOKを開かせて一旦マクロを終了し、マクロを記載したBOOKでまた別のボタンを押させるというのなら思いつくのですが・・・。 Sub test01() MsgBox "対象のエクセルファイルを開いてください。" _ & vbCr & "開いたら該当のシートをアクティブにして下さい。", , " " If Application.Dialogs(xlDialogOpen).Show = False Then MsgBox "キャンセルされました。", , "( ̄ロ ̄;)!!" Exit Sub End If Call 次のマクロ End Sub

  • モジュール11201が自動更新出来ない

    LAVIEアップデートが出来ません。モジュール11201ですが自動更新で毎回『失敗』の表示が出ます。『アップデート対象のバージョンがインストールされていません』と表示され続行しても変わりません。対処方法に従ってモジュールをインストールしましたが、更新出来ず正しく処理されているかも分からないので対応を教えて下さい。 ※OKWAVEより補足:「NEC 121ware : Windows」についての質問です

  • 標準モジュールを削除したい。(VBA)

    VBAで、VBAの標準モジュールを削除したいのですが、なかなか出来ません。たぶん、コレクションについての認識があまいからだと思います。VBComponents コレクションのobject.Remove(component)のヘルプには、VBProjects コレクションには、スタンドアロン プロジェクトを指定します。とありますが、そもそもスタンドアロンプロジェクトって何ですか?Application.VBE.VBProjects(4).VBComponents(1).とするとコレクションでなくなってしまいますが、どうやってモジュールと特定するのでしょうか?どなたか詳しい方いらっしゃいましたらご指導願います。よろしくお願いいたします。 VBIDEのライブラリーです。

  • 過去レス「マクロでモジュール解放を記述出来るか」

    '08.1.15のご質問No.3682185「マクロでモジュール解放を記述出来るか?」 のご回答が以下でした。 -------- まず Excelのマクロのセキュリティ設定で『信頼できる発行元』タブにある『Visual Basic プロジェクトへのアクセス』にチェックを入れておきます VBEで参照設定に『Microsoft Visual Basic for Application Extensibility 5.3』を追加します これでモジュールに対するアクセスができるようになります 実際のアクセス方法ですが Dim oVBE as VBE, oPrj as VBProject, oComp as VBComponent ' oCompがモジュールになります Set oVBE = Me.Application.VBE Set oPrj = oVBE.VBPrjects("VBAProject") for each oComp in oPrj.VBComponents   if oComp.Name = "開放したいモジュール名" then     oPrj.VBComponents.Remove oComp   end if next といった具合になります 【ここから質問です】 私のはエクセル2000ですが、上記をやると、 「コンパイルエラー:Meキーワードの使用方法が不正です」と出ます。 どこを直せば動くようになりますか?

  • エクセルファイルの自動起動と内容更新

    エクセルファイルを自動で起動させ、標準モジュールで書かれたマクロ(新しいブックを作成し、そのブック内シートに値を代入)を実行させマクロ実行時に作成されたファイルを上書き保存させる方法ってありますか? コマンドボタンを配置して、上記を実行させることはできますが、自動起動はタスクを使用すればいいのかな~くらいしかわかりません。 どこかに詳しいページご存知ありませんか?

  • ExcelVBA シートコピー

    ExcelVBAで管理表1のシート1へ管理表2のシート2へコピーするVBAを書いてみました。 以下部分を修正したいです。 wbSaki.Worksheets("シート2").Range("A1:VA3000").Copy こちらの選択範囲を最終行と最終列という風にしたいのですが、うまくコピー貼り付けができないので理由がわかる方がいらっしゃれば教えていただけますでしょうか。 以下全体コード------------------ Sub 管理表1のシート1を管理表2のシート2へを貼り付け() '選択したファイルを取り込み、別のファイルに貼り付ける。 Dim RC As Integer Dim OpenFileName, fileName, Path, SetFile As String Dim wbMoto, wbSaki As Workbook Set wbMoto = ThisWorkbook 'マスターデータ取り込み元をセット Application.DisplayAlerts = False Application.ScreenUpdating = False 'BOOKを開かない RC = MsgBox("管理表1を開きますか?", vbYesNo + vbQuestion, "確認") If RC = vbYes Then 'サーバー指定 End Withまで With CreateObject("WScript.Shell") strCdir = CurDir .currentdirectory = "ファイル格納先" OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 'ダイアログボックスを表示して、マスターデータファイルを指定します。 If OpenFileName <> "False" Then SetFile = OpenFileName Else MsgBox "キャンセルされました" Exit Sub 'マスターデータの取り込みをキャンセル End If End With Workbooks.Open fileName:=SetFile, ReadOnly:=True, UpdateLinks:=0 'ダイアログボックスで指定したマスターデータファイルを開きます。 'VBA起動BOOKのシートをクリア wbMoto.Worksheets("シート1").Cells.Clear Set wbSaki = Workbooks.Open(Path & SetFile) '--- オートフィルタをクリアする ---' If wbSaki.Worksheets("シート2").FilterMode Then wbSaki.Worksheets("シート2").ShowAllData 'ワークブック間のシートをコピーします。 wbSaki.Worksheets("シート2").Range("A1:VA3000").Copy wbMoto.Worksheets("シート1").Range("A1").PasteSpecial xlPasteValues Application.CutCopyMode = False 'コピー切り取りを解除 wbSaki.Close False 'マスターデータ取り込み先のファイルを閉じる Application.ScreenUpdating = True 'BOOKを開かずに作業 Else MsgBox "処理を中断します" End If ThisWorkbook.Worksheets("元のシート").Select 'シート名を指定 Application.DisplayAlerts = True End Sub

  • ThisWorkBookモジュールとSheetモジュールの両立

    エクセル2003でマクロを組んでいます。 Sheet1,Sheet2の2つのシートがあり、 片方のシートの"A4:G10"の範囲に値を書き込むと、もう片方の同じ位置に同じ値が書き込まれるようなマクロを組みたいです。 以前ここで教えていただいたものを改変して以下を作りました(ThisWorkBookモジュールです)。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range Dim Num As Integer Dim S As String, Sh_name As String Sh_name = ActiveSheet.Name Set r = Intersect(Target, Range("A4:G10")) If Not (r Is Nothing) Then Application.EnableEvents = False For Num = 1 To 2 S = "Sheet" & Num If S <> Sh_name Then Worksheets(S).Range(r.Address).Value = r.Value End If Next Application.EnableEvents = True End If End Sub ここまでは正常に動作します。 また、 Sheet1とSheet2のモジュールに、 A列のセルに値が入力された場合、同じ行のC列のセルの色を塗るという記述をしています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Cells(Target.Row, 3).Interior.ColorIndex = 5 End If End Sub これらを同時に生かしたいのですが、 どのように書けばいいでしょうか。 EnableEvents = False/Trueを消してしまうと、 Worksheets(S).Range(r.Address).Value = r.Valueが実行されるたびにThisWorkBookモジュールが動いているようです。 そして2回目のSet r = Intersect(Target, Range("A4:G10"))でエラーが出ます。 (エラーは出ずとも延々と(無限ではない回数)ThisWorkBookモジュールを繰り返したコードもありました。) よろしくお願いします。