dポイントプレゼントキャンペーン実施中!

前に、http://oshiete1.goo.ne.jp/qa4335365.html
で質問させて頂きました。
その節は、お世話になりありがとうございます。
本件で2点、困った点がありますので
ご教示何卒よろしくお願いいたします。

(1)回答No.5のargumentさんに教えて頂いた通りに
コードを作成したつもりなのですが、
エクセルファイルを開くと同時にマクロが実行されません。
マクロの実行から、マクロをスタートさせれば
思い通りの結果になるのですが、
自分でマクロを実行させなければならず、
目的を達成でき兼ねております。
argumentさんのおっしゃる
「※以下は必ずVBE上のThinworkbookの中に書き込んでください。」
という意味が分からないでおりますので、
このことと関係があるかもしれません。

お手数ですが、エクセルファイルを開くと同時に
マクロが始まる方法を素人向けにご教示頂けませんでしょうか。


(2)マクロを無効にされたら?
エクセル2003の場合、ファイルを開くときに
「マクロを有効にしますか?」という
メッセージボックスが出てきますが、
ここでマクロを無効にするを選ばれてしまったら、
せっかくマクロを用意して、すべてのシートが
削除されるようにしたのが無意味になってしまう気がしております。
マクロを有効にしないと、エクセル画面で
何もできないような方法はございませんでしょうか。
エクセル2007でも拡張子を変えられちゃったらどうしようと
心配でなりません。
この点、対処方法をご教示頂けませんでしょうか。

何卒、よろしくお願い申し上げます。

A 回答 (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 …


はい。あぁなんだか幾つも事例が存在します。答えも書いてあります。
そうそう、参考までに教えますがこの結果を得られるまでに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





さて実行してみてください。・・・どうでしょうか試してみましたか?どちらの処理も共存できました。
実は問題解決よりも私は文章を書いている時間の方が長いことに気づきました。私はとても暇人ですね(自覚はしています)。
実際十数分で修正したソースを貼ればこの問題は解決します。
そして、実際問題小一時間考えてまとめた文章なんてスルーされるのかもしれません。
ですが私は欲しい情報が欲しい時に必要な詳細を得たい為に回答も質問もわかるようにあるべきだと思います。
もちろん私が丁寧に回答できたとしても私が誰かに丁寧に教えてもらえる訳ではありません。

処理違い・補足・追加処理等必要でしたらいってください。
    • good
    • 0
この回答へのお礼

argument様
いつもお世話になっております。
この度も完璧なご回答ありがとうございました。
一日に1回しか確認できないので
回答が遅くなって申し訳ないです。
ばっちり思ったとおりのものができました。
本当にありがとうございました。
また教えてGOO等でご質問させて頂くことがあるかもしれませんが、
何卒よろしくお願い致します。

お礼日時:2008/09/30 16:02

こんばんわ 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

補足日時:2008/09/28 16:57
    • good
    • 0

おひさしぶりです 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。
これで計算式を一切見れないし、コピーもできないようにしました。

でもって、これを他の人に使ってもらおうと思っていますが、
期限を設けておきたいため、一連のご質問をさせて頂きました。

という事情ですので、たとえば、マクロを有効にしないと
エクセルそのものを操作できないような仕組みを
お教え頂けませんでしょうか。
(前に、他の人の作ったエクセルでそんなものを目にしたことがありますので)

お忙しいところ本当に申し訳ございませんが、
ご教示頂けますと幸甚です。

補足日時:2008/09/24 21:02
    • good
    • 0

>argumentさんのおっしゃる


>「※以下は必ずVBE上のThinworkbookの中に書き込んでください。」
>という意味が分からないでおりますので、

VBE(Visual Basic Editor/VBエディタ)の画面について
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …

VBEを開くと、プロジェクトエクスプローラウインドウに該当ファイル(ブック)のVBAに関する内容が表示されます。
上記ページの掲載例では
VBAProject(Book4)のMicrosoft Excel Objectsに「ThisWorkbook」モジュールがあります。
ファイル(ブック)名は、Book4です。

「ThisWorkbook」をダブルクリックすれば、コードウインドウが該当ファイルの「ThisWorkbook」編集画面になります。
そこへ、書き込む(コピペ可)ということです。

argumentさんの提示されたコードの1行目が
Private Sub Workbook_Open()
となっていますから、WorkbookがOpenされたときに自動的に実行されます。

この回答への補足

ありがとうございます。
おかげさまで、ファイルを開いたときに
マクロを実行することができました。
つきましては、
(2)についてもご教示頂けませんでしょうか。

補足日時:2008/09/24 17:15
    • good
    • 0

Thinworkbook との記述がありますが


Thisworkbook ではありませんか?

この回答への補足

ありがとうございます。
(2)についてもご教示頂けませんでしょうか。

補足日時:2008/09/24 16:09
    • good
    • 0

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