こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2007-05-26 15:20:26

QNo.3032034

すぐに回答ほしいです

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

#3 です。肝心なことを忘れてました。

完全にマクロを無効...ってことじゃないんですが、Auto_Open や
ThisWorkbook_Open マクロを実行させないでブックを開く方法です。

  Application.EnableEvents = False
  Workbooks.Open "C:\a.xls"
  Application.EnableEvents = True

投稿日時 - 2007-05-26 22:06:34

お礼

ご教示ありがとうございました。
機能するようになりました。
下記の部分のご指摘も、ご指摘のとおり修正したところエラーにならなくなりました。
なお、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

投稿日時 - 2007-05-26 23:47:28

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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

投稿日時 - 2007-05-26 21:58:40

ANo.2

こんばんは。

下記マイクロソフト情報によると、
AutomationSecurity プロパティは、Office XPからのようですね。

http://support.microsoft.com/kb/317405/

で、Excel2000などでは使えませんので代案として、
標準モジュールにAuto_Openプロシージャを作ってそこに
WorkBook_Openイベントに書いてあるコードをそっくり移してください。

Sub Auto_Open()
  ●ここに移す●
End Sub

通常はAuto_Openに書いたコードはそのブックがOpenされたときに動作しますが
今回のように、他のブックから、コードで開いた場合は無視されます。

新しいブックで試してみてください。
以上です。
 

投稿日時 - 2007-05-26 19:37:25

補足

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

投稿日時 - 2007-05-26 21:30:05

ANo.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しなければならない理由は何ですか?

投稿日時 - 2007-05-26 16:17:03

補足

ご教示ありがとうごさいます。
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

投稿日時 - 2007-05-26 21:41:00

あなたにオススメの質問