• ベストアンサー

Excel VBA msoAutomationSecurityForceDisableについて

マクロを無効にしてファイルを読み込むコードを過去レスを見て作成しましたが、msoAutomationSecurityForceDisableを定数でなく、変数としか認識しないため、うまく機能しません。 下記コードのどこを修正すべきか、ご教示願います。 Sub read() Dim DirN As String Dim Fname As String With ThisWorkbook.Worksheets("手当") .Activate .Range(.Cells(7, 1), .Cells(10000, 40)).ClearContents End With Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False DirN = Worksheets("手当").Range("C2").Value & "\" Fname = Dir(DirN & "*.xls") Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Do While Fname <> "" Set NxL = CreateObject("Excel.application") NxL.Visible = True NxL.AutomationSecurity = msoAutomationSecurityForceDisable NxL.DisplayAlerts = False '追加してファイル名を検索する場合はDir関数の引数はなくす。 Fname = Dir() Set Mybook = NxL.Workbooks.Open(DirN & Fname) Call read1(Mybook) Loop End Sub

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

#3 です。肝心なことを忘れてました。 完全にマクロを無効...ってことじゃないんですが、Auto_Open や ThisWorkbook_Open マクロを実行させないでブックを開く方法です。   Application.EnableEvents = False   Workbooks.Open "C:\a.xls"   Application.EnableEvents = True

yoshio2
質問者

お礼

ご教示ありがとうございました。 機能するようになりました。 下記の部分のご指摘も、ご指摘のとおり修正したところエラーにならなくなりました。 なお、read1プロシージャーに下記のとおりブックを閉じる処理をしておりました。 Mybook.Close NxL.Quit Set NxL = Nothing <ご指摘内容> また、Fname = Dir() の位置は、このままだと Dir の戻り値が空と なったときにエラーが発生しますので.... 下記のコードをご参考ください。   DirN = Worksheets("手当").Range("C2").Value & "\"   Fname = Dir(DirN & "*.xls")   ' Fname が空なら Do ~ Loop の間にあるコードは実行されません   Do While Fname <> ""     Set Mybook = NxL.Workbooks.Open(DirN & Fname)     Call read1(Mybook)     ' read1 プロシージャ側にブックを閉じる処理が     ’あるのかな?     Fname = Dir()   Loop

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

>   NxL.DisplayAlerts = False 察するに「マクロの警告」を抑止したいのでしょうか? 既に起動済みのブックから Workbooks.Open で開く場合は、マクロ 付のブックでも「マクロの警告」が表示されないはずですよ。 自動実行のマクロを抑止したいならわかりますが、マクロ警告を 抑止したい意図であるなら、わざわざマクロを無効にしてブックを 開く必要はありません。 また参考までですが、、 > Do While Fname <> "" > Set NxL = CreateObject("Excel.application") > (中略) > Fname = Dir() > Set Mybook = NxL.Workbooks.Open(DirN & Fname) > Call read1(Mybook) > Loop これって、ループの度にあらたに Excel を起動する(別プロセスの Excel を起動する)コードですからフォルダ内に XLS ファイルが 多くあると、システムリソースを食い潰し、フリーズしますよ。 Set NxL = ~ の行はループの外側に出した方が良いです。 でも、コードを拝見する限りは、別プロセスの Excel で処理する 必要はなさそうですね^^; また、Fname = Dir() の位置は、このままだと Dir の戻り値が空と なったときにエラーが発生しますので.... 下記のコードをご参考ください。   DirN = Worksheets("手当").Range("C2").Value & "\"   Fname = Dir(DirN & "*.xls")   ' Fname が空なら Do ~ Loop の間にあるコードは実行されません   Do While Fname <> ""     Set Mybook = NxL.Workbooks.Open(DirN & Fname)     Call read1(Mybook)     ' read1 プロシージャ側にブックを閉じる処理が     ’あるのかな?     Fname = Dir()   Loop

回答No.2

こんばんは。 下記マイクロソフト情報によると、 AutomationSecurity プロパティは、Office XPからのようですね。 http://support.microsoft.com/kb/317405/ で、Excel2000などでは使えませんので代案として、 標準モジュールにAuto_Openプロシージャを作ってそこに WorkBook_Openイベントに書いてあるコードをそっくり移してください。 Sub Auto_Open()   ●ここに移す● End Sub 通常はAuto_Openに書いたコードはそのブックがOpenされたときに動作しますが 今回のように、他のブックから、コードで開いた場合は無視されます。 新しいブックで試してみてください。 以上です。  

yoshio2
質問者

補足

ご教示ありがとうございます。 auto_open()は、開こうとするブックにコーディングするものと理解しましたが、開こうとするブックは、親会社の方でVBAコードを保護しているため、auto_open()を書き込むことができません。 ですので、開こうとする各手当のブックのVBAには手を加えずに、そのブックのマクロを無効にして、ブックを開こうとしました。 Office XP 以前では不可能なのでしょうか。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

ちょっとだけ実験してみました。以下のエクセルマクロで「マクロを無効にしてブック起動」が行えました。 Sub Macro()  Dim secAutomation As MsoAutomationSecurity  secAutomation = Application.AutomationSecurity  Application.AutomationSecurity = msoAutomationSecurityForceDisable  Workbooks.Open Filename:="z:\AAAAA.xls"  Application.AutomationSecurity = secAutomation End Sub >With ThisWorkbook.Worksheets("手当") とあるので、アクセスからエクセルのブックを起動しようとしているのではなさそうですが、 >Set NxL = CreateObject("Excel.application") のようにわざわざCreateObjectしなければならない理由は何ですか?

yoshio2
質問者

補足

ご教示ありがとうごさいます。 No2の方からご指摘があったように、使用しているのはExcel2000です。 ですので、 Dim secAutomation As MsoAutomationSecurityに対して、 「ユーザー定義型は定義されていません。」というエラーメッセージが表示されます。 また、CreateObjectとしたのは、Call read1(Mybook)として、ブックを特定してオブジェクトとしてサブルーチンに渡すためです。 新たに呼び出したブックと呼び出し元のブックが2つ開いた状態で、新たなブックを変数に代入して、以下のようなサブルーチンを処理しているのですが、もっとスマートな方法があるのでしょうか。 sub read1(WB as workbook) If WB.Name <> ThisWorkbook.Name Then WB.Activate WB_name = WB.Name WB_length = LenB(WB_name) WB_name = LeftB(WB_name, WB_length - 8)   ・   ・   ・ end if wb.worksheets("扶養手当").range(******)******* ・   ・ end sub

関連するQ&A