- ベストアンサー
エクセルを開くと同時にマクロが実行されない問題とマクロを無効にした場合の対処方法
- エクセルファイルを開くと同時にマクロが実行されない問題があります。マクロの実行からマクロをスタートさせると思い通りの結果になりますが、目的を達成できません。マクロを実行させる方法を教えてください。
- マクロを無効にされると、マクロを用意したすべてのシートが削除される可能性があります。マクロを無効にしないでエクセルを使用する方法はありますか。また、エクセル2007の場合は拡張子を変えられる心配もあります。この問題に対処する方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんわ himinana さん 果たして今の時間はこんばんわかこんにちわかを本気で調べてきたargumentです。・・どうでもいいですね? ・・・。 まぁ、これは極端かもしれません(実際しらべましたが)。ですが私は気になれば調べます。 便利な事に世の中で気になった単語を入れると関連する項目を表示してくれる google大先生やyahoo先生なんていうそこいらの大学教授より知識を持った検索サービスが存在します。 知りませんでしたか?それは残念です。 google : http://www.google.co.jp/ ぜひとも活用してください。知らないのは損ですから。 >「コンパイルエラー >名前が適切ではありません:Workbook_Open」 さて、では私はソースを見るまでもなくこのエラーは幾度となく見たことあるのでわかりますが。 それでも一応下記で検索しました((作成中のソフト(又は言語) スペース エラー)と調べるとよいでしょう) VBA 名前が適切ではありません: 結果: http://www.google.co.jp/search?hl=ja&q=VBA%E3%80%80%E5%90%8D%E5%89%8D%E3%81%8C%E9%81%A9%E5%88%87%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%EF%BC%9A&lr=&aq=f&oq= はい。あぁなんだか幾つも事例が存在します。答えも書いてあります。 そうそう、参考までに教えますがこの結果を得られるまでに3秒もかかりませんでした。 ページを上からいくつか見ましたがなんと五分と経たずあなたの望む結果が書いてありました。 便利ですねさすがgoogle大先生です。 文句ひとつ言わず何でも教えてくれるgoogle大先生に私は土下座せずには要られません。 さて、あなたはエラーを知るときにマクロ大全のような分厚い本からきっと探していたのでしょう いやきっとこんな便利なサービスを知らずになんだろうこのエラー見たこともない。よし質問しよう!と思い至ったのでしょう(このQ&Aサイトにどう来たのかはきっと知り合いからの紹介ですねアドレスも打ち込んだのでしょう)。 ですがどうでしょうか?検索するのと私のレスポンスを待つのはどちらが早いでしょうか? もちろん私は極力私のわかる範囲の回答を知恵を絞りながらまとめてわかりやすく書いているつもりですが私の知識というのは実はこの世界に存在する情報のわずかほんの一部でしかありません。 ましてや残念な事に私含める回答者は機械のように毎回完全に正しく回答できるわけではありません(前回の誤字がいい例です)。 まぁ良いでしょう。これは回答者が苦心程度の問題です。 つまり貴方は全く困る事はありません。あるとしても回答者が減る程度の問題です。 あぁ長くなりましたね。すいません。えぇ・・っと。・・あぁ。 >「コンパイルエラー >名前が適切ではありません:Workbook_Open」 でしたね。上記を見て解決したかも知れませんが・・・。 正直このエラー表記はだいぶ的を得ている表示だと思うのですがまぁ考えましょう。 まずは貴方の書いたソースをVBEに貼り付けましょうか。 ・・・・。 あぁきっと私のVBEは空気が読めないのでしょう。コードが真っ赤です。 芸術的なほど改行コードの位置がおかしくなっていますね。 ANo.4の貴方の回答補足を貴方のVBEに張って赤くならないかちょっと確認したくなりましたがきっと私が絶妙にコードを張り間違ったに違いありません。 自分で改行コードを修正っと。では改めて 貴方のソースを・・・・。 あ、シート名は変わっていましたね。私のソースではなく貴方のソースです。貴方の書いた(変更した)部分が余りに少なくて作成依頼だったかなと思ってしまいました。 このQ&Aサイトでは作成依頼は実は削除対象なのですが消されてないので安心してください。これは貴方のソースです。 貴方のソースでsub名だけを取り出して見ます。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Private Sub Workbook_Open() Sub Workbook_Open() もう少し邪魔な部分を消しましょう Sub Workbook_BeforeSave() Sub Workbook_Open() Sub Workbook_Open() さてこの時点で気づいて頂けると正直うれしいのですが何か同じものがありませんか? そう、Workbook_Open()です。では、何が困るでしょうか? VBAのソースではsubをcallつまり呼んでから実行します。 さてではプログラムの気持ちになりましょう。 貴方は友達に頼まれて待ち合わせ場所にいる「佐藤」さんを連れてきてといわれました。 そしてその場所へ行ってみると 「佐藤」 「佐藤」 「加藤」 と名札をつけた三人いました。貴方はどうしますか?という話です。 すると貴方は友達の所へ戻って「名前が適切ではありません:佐藤」が二人居たんだけどどっち? と言うわけです。 分かりましたか?すいません説明が下手なのは許容して頂きたい。 つまり、プログラムさんはイベント処理であるWorkbook_Openさんを呼びに行ったのですが二人いてどっちを呼べばいいのか困っている状態です。 Workbook_Openを一人にすればOKですね。ですが二人は同じ名前ですが処理が違います。ではどうしましょうか? 「佐藤」飴を持っている 「佐藤」チョコを持っている 貴方は飴とチョコを持っている佐藤さんを連れて行きたい。という状態です。まぁしかし簡単な話で片方の佐藤さんにどちらももたせれば解決ですね。 ソースでは Sub Workbook_Open()シートを表示する処理 Sub Workbook_Open()期日をチェックする処理 こうなっていますが Sub Workbook_Open() シートを表示する処理と期日をチェックする処理を書く はい、こうすれば完了です。これをソースに置き換えると以下のようになります。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("仕訳入力シート").Visible Then Sheets("取り込みシート").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "2008/09/28" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = "取り込みシート" Then If Not Sheets("取り込みシート").Visible Then Sheets("取り込みシート").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("a" & 1).Value = "有効期限が来ましたので、再度お申し込みください。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets("取り込みシート").Visible Then Sheets("取り込みシート").Visible = True End Sub さて実行してみてください。・・・どうでしょうか試してみましたか?どちらの処理も共存できました。 実は問題解決よりも私は文章を書いている時間の方が長いことに気づきました。私はとても暇人ですね(自覚はしています)。 実際十数分で修正したソースを貼ればこの問題は解決します。 そして、実際問題小一時間考えてまとめた文章なんてスルーされるのかもしれません。 ですが私は欲しい情報が欲しい時に必要な詳細を得たい為に回答も質問もわかるようにあるべきだと思います。 もちろん私が丁寧に回答できたとしても私が誰かに丁寧に教えてもらえる訳ではありません。 処理違い・補足・追加処理等必要でしたらいってください。
その他の回答 (4)
- argument
- ベストアンサー率63% (21/33)
こんばんわ himinana さん あれ?もうおはようなのでしょうか?あぁなんだか眠いです。 状況を把握しました。それならば簡単です。 かくして表示させなければよいですね。 マクロ有効時のみ表示させるようにする方法で良いでしょう。 ThisWorkbookに以下の二つをコピー&ペーストしてください。 "ThisWorkbook"ですよ?もう大丈夫ですね貼れますよね?(大切なので二度言いました)。 (「保護されたシート」名の部分は任意のシート名にしてください。) Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Sheets("Sheet1").Visible Then Sheets("保護されたシート名").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() If Not Sheets("保護されたシート名").Visible Then Sheets("保護されたシート名").Visible = True End Sub 一度マクロが有効状態で保存した後開いてください。 まず保存したときにシートが隠れると思います。 エクセルのデフォルトだとマクロの有効化無効化が聞かれますね? まず無効で開いてください。シートは隠れたままです。 次にマクロを有効で開いてください。シートが表示されます。 もちろんこのままでは通常保存するときも隠れるので別途表示するボタンか何かはつける必要はありますので作ってくださいね。 (ボタンからであってもマクロを経由するのでマクロを有効にしなければ表示できないので安心してください。) 処理違い・補足・追加処理等必要でしたらいってください。
補足
argument様 引き続きご対応いただきまして、 本当にありがとうございます。 お教え頂きましたコードにより、 マクロを無効にした場合は、 該当するシートが表示されないように することができました。 (エクセル2007でしか確かめておりませんが) ところが、 今回教えて頂いたコードと、 前回教えて頂いた、 VBEに入力した日付が来ると シートがすべて削除され、 有効期限切れというシートだけでてくるという 方法を両立させる方法が分からないでおります。 「コンパイルエラー 名前が適切ではありません:Workbook_Open」 というメッセージが出てしまいます。 私の作成したコードは以下のとおりですが、 どのように直せばよいか ご教示頂けませんでしょうか。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Sheets("仕訳入力シート").Visible Then Sheets("取り込みシート").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() If Not Sheets("取り込みシート").Visible Then Sheets("取り込みシート").Visible = True End Sub Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "2008/09/28" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("a" & 1).Value = "有効期限が来ましたので、再度お申し込みください。" ActiveWorkbook.Save Application.DisplayAlerts = True End If End Sub
- argument
- ベストアンサー率63% (21/33)
おひさしぶりです himinana さん また会いましたね。一つあやまるならば1番さんの言うとおり誤字がありましたね、すいません。 正しくはThisworkbookでした。少し言葉では説明するのが難しいのですがまぁ試みてみましょう。 通常VBEを開くとデフォルトならば左側にプロジェクトが表示されます。 -■VBAProject(Book1) -□MicrosoftExcelObject │├Sheet1(Sheet1) │├Sheet2(Sheet2) │├Sheet3(Sheet3) │└ThisWorkbook -□標準モジュール └Module1 と成っていますね?この一MicrosoftExcelObjectの番最後のThisWorkbookをダブルクリックしてそこにデータを書き込んでください。 Private Sub Workbook_Open()これはワークブックを開いた時に自動で実行されるsubつまりイベント関数です。 動作確認はこちらでも何度か実行し動確済みなので正しくコピーされていれば保存し再度開けば実行されるはずです。 (2)マクロを無効にされたら? さてマクロ無効に付いては結局のところ前回お教えしたとおり、マクロ にパスワードがあるため中身は見られません。大切なのはマクロ(技術を盗まれない事)なのだと私は思いますが・・・。 マクロ無効時は確かにシートは削除されません。ですがシートに重要な情報があるのでしょうか?期日内ならば結局表面上のデータならば幾らでもほかのエクセルへコピーできてしまいます。 仮に起動時にのみにシートをVBAから罫線や色などの設定を全て施し生成、終了時にはそのつどシートを削除する必要がありますか? ですがそれでは期日中エクセルに一時的に保持しておきたいデータもきっと残せないでしょう。 そしてエクセルを終了するときもAPIなどでExcelの起動状況・サービスを逐一監視しなければなりなくなります。 この事を理解した上でどうしても期日を過ぎたら削除しなければならない理由があるならばどんな理由なのでしょうか? よろしければ教えていただきたいです。 処理違い・補足・追加処理等必要でしたらいってください。 (あぁ、それから"誤字”があったら言ってください。私も人間ですので間違えたりすることなんて多々ありますので・・・)
補足
argument様 いつもいつも本当にありがとうございます。 argument様は、知識が豊富であるのみならず、 ソフトでわかりやすいご説明ですので、 お客様のハートもがっちりつかまれている、 大変優秀な方であろうと 推測しております。 さてさて、 > マクロ無効時は確かにシートは削除されません。 > ですがシートに重要な情報があるのでしょうか? > 期日内ならば結局表面上のデータならば幾らでも > ほかのエクセルへコピーできてしまいます。 私、マクロは今まで全くやったことがなく、 結構複雑な関数を組み合わせて 必要なエクセルファイルを作っております。 IFとISERRORとVLOOKUPを組み合わせたものや、 あちこちに条件付き書式があります。 せっかく作りこんだので、それをマクロに組み直すのは 100時間以上かかってしまうと思いますので避けたいところです。 その複雑な計算式は、シートを保護することによって 見えないようにしようと思っています。 式の入っている列を非表示にしたうえで、 そのシート全体を選択⇒セルの書式設定⇒保護のタブ ロックにチェック。 その後、エクセル2007でいうところの、校閲⇒シートの保護で、 全てのチェックをはずして、OK。 これで計算式を一切見れないし、コピーもできないようにしました。 でもって、これを他の人に使ってもらおうと思っていますが、 期限を設けておきたいため、一連のご質問をさせて頂きました。 という事情ですので、たとえば、マクロを有効にしないと エクセルそのものを操作できないような仕組みを お教え頂けませんでしょうか。 (前に、他の人の作ったエクセルでそんなものを目にしたことがありますので) お忙しいところ本当に申し訳ございませんが、 ご教示頂けますと幸甚です。
- xls88
- ベストアンサー率56% (669/1189)
>argumentさんのおっしゃる >「※以下は必ずVBE上のThinworkbookの中に書き込んでください。」 >という意味が分からないでおりますので、 VBE(Visual Basic Editor/VBエディタ)の画面について http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_vbe.html VBEを開くと、プロジェクトエクスプローラウインドウに該当ファイル(ブック)のVBAに関する内容が表示されます。 上記ページの掲載例では VBAProject(Book4)のMicrosoft Excel Objectsに「ThisWorkbook」モジュールがあります。 ファイル(ブック)名は、Book4です。 「ThisWorkbook」をダブルクリックすれば、コードウインドウが該当ファイルの「ThisWorkbook」編集画面になります。 そこへ、書き込む(コピペ可)ということです。 argumentさんの提示されたコードの1行目が Private Sub Workbook_Open() となっていますから、WorkbookがOpenされたときに自動的に実行されます。
補足
ありがとうございます。 おかげさまで、ファイルを開いたときに マクロを実行することができました。 つきましては、 (2)についてもご教示頂けませんでしょうか。
- bin-chan
- ベストアンサー率33% (1403/4213)
Thinworkbook との記述がありますが Thisworkbook ではありませんか?
補足
ありがとうございます。 (2)についてもご教示頂けませんでしょうか。
お礼
argument様 いつもお世話になっております。 この度も完璧なご回答ありがとうございました。 一日に1回しか確認できないので 回答が遅くなって申し訳ないです。 ばっちり思ったとおりのものができました。 本当にありがとうございました。 また教えてGOO等でご質問させて頂くことがあるかもしれませんが、 何卒よろしくお願い致します。