- ベストアンサー
EXCELのイベントの保存について
EXCEL2000で新規にBOOKを作り、microsoft excel objectsのsheet1に、次のイベントを書きました。 Private Sub Worksheet_Calculate() If Sheet1.Cells(1, 2).Value = 1 Then Sheet1.Cells(1, 3).Value = "当たり” End If End Sub B1のセルは、A1のセルの値をコピーするようにしています。 A1のセルに1を入力されると、C1のセルに”当たり"が表示されるのですが、 BOOKを登録した後、BOOKを閉じ、そのBOOKを開けた後に、A1のセルに1を入力しても、C1のセルに”当たり"が表示されません。 イベントを登録する際に、足りない操作があるのでしょうか? よろしくお願いします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 私の余談を含めて書いておきます。 >(1)EXCELを終了させないと、セキュリティレベルの反映はしない。 そのとおりです。だから、Excelの中から、セキュリティレベルをいじっても、Excelのみでは、ウィルスのプロテクトには何にもならない、ということです。Excelを終了させて反映すると同じように、Excelを起動する前に、セキュリティレベルを変更することも可能なのです。だから、「ウィルス検索プログラム」というのが必要なのですね。 セキュリティレベルを「高」にしたところで、何にも役に立っていません。 もう少し詳しく書くと、Excelの悪意のないマクロでも、危険なものはあります。特に、熟練していない人のマクロで、とんでもないものも存在します。それをどうやって見分けるか、プロテクトが掛けられたら、どうしようもない、ということです。また、MacroCutter というツールで中を開けても、それが読める人でないと、マクロは安全かどうか分からないです。 一番悪いのは、アドインです。アドインは、一般的にフリーでセキュリテイには掛かりません。なお、Office のウィルスは、Personal.xls に置き換わります。同じようなフォルダーが出来ています。 >(2)セキュリティレベルが高の場合、PERSONAL.XLSに登録してあるマクロは動作するが、BOOKに登録しているマクロとイベントは動作しない。また、PERSONAL.XLSにはイベントがかけない。 セキュリティレベルが「高」では、セキュリティ・ダイアログメッセージの 「信頼のおけるソース元(T)」のすべての組み込み済みのアドインとテンプレートを信頼する(A) にチェックを入れている限りは、Personal.xls のマクロは稼動します。はずしたら、動きません。 Personal.xls のイベントは、多くは、Application全体のイベントにします。一般的には、Excelの StartUp フォルダーに入れて、テンプレートにしますが、私は、テンプレートよりも、Application イベントの安全性のほうが高いと思い、そちらを使っています。かなり内容は特殊です。 >(3)セキュリティレベルが中か低の場合、PERSONAL.XLSに登録してあるマクロ、及び、BOOKに登録しているマクロとイベントは動作できる。 そのとおりです。 >(4)よって、イベントを動作させるためには、セキュリティレベルを中か低にする必要がある 安全に活用するために、「高」にするというのが、もっぱらのキャッチフレーズと言うわけですが、最初の(1)で述べたように、本当は、Excel内のセキュリティ設定というのは、私は、形骸化したもので、何の役にも立っていないように思います。簡単に、そのセキュリティレベルは、外部から換えることが可能です。 そこで、私は、このようなことを気をつけています。 ・むやみにVBEプロテクトの掛かったものは、使わないこと。 (隠さなくてはならないのか、理由がないものに対してですが。) ・作った人が知れないもの、作った人のレベルが分からないものは使わないこと。 ・個人作成のアドインは、極めて慎重に選択すること。むやみにインストールはしない。 ・コードがオープンされているものは、一度、全体を読んでみること。コードの中に、Wrete/Read などの用語、また、参照設定に特別なものはつけられていないか、などのチェックをする。Declare で、別なDll が呼び出されたりすることもあります。 なお、COMアドインは、インストール時に気をつけます。ここの掲示板でも、原因不明のトラブルが発生している方がいますが、COMアドインが原因のことがあります。COMアドインのオプション・ボタンは、表示―ツールバー―ユーザー設定の[コマンド(タブ)]の中の、ツールの中に、「COMアドイン」の コマンド・ボタンがあります。それを、ツール・メニューの中に入れて確認できるようにしておいたほうがよいです。 また、Office 2000 までは、個人証明だけでも、セキュリティレベル「高」でも、認められていたのですが、Office XP以降では見事にシャットアウトされてしまいます。その上の証明書のCA証明なら、「高」でも動くのですが、私のような個人は、経費的な問題で出来ません。 セキュリティに対して、私は、このように考えています。ながなが、失礼しました。
その他の回答 (9)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >PERSONAL.XLSのSHEET1にもイベントを書き、BOOKを登録してみましたが、そのBOOKを開くと、登録されたイベントが動作しません。 Personal.xls に書くイベント・ドリブン型マクロは、特殊なイベントです。Personal.xls のシートモジュールに書いても、シートそのものを触ることがありませんので、マクロは起動しません。 >BOOKに登録したイベントは動作しません。 一般的なマクロはどのようか、と思います。 例えば、 '---------------- Sub Test1 MsgBox Time End Sub '---------------- のようなもので、ちゃんと反応するか、ということです。 なお、 ツール―マクロ―セキュリティ 下の所に、ウィルス検索プログラムの有無が出ているかとは思います。
お礼
PERSONAL.XLSに登録してあったマクロは動作しましたが、教えていただいた一般的なマクロは動作しませんでした。 ツール―マクロ―セキュリティでセキュリティレベルが高になっており、「ウィルス検索プログラムがインストールされました」の表示があったので、セキュリティレベルを低に下げてみましたが、マクロは動作しませんでした。 試しに、セキュリティレベルを低のまま、BOOKを保存した後、BOOKを開いて、マクロを動作させてみると、正常に動作しました。 どうも私はセキュリティレベルの意味を勘違いしていたようで、セキュリティレベルを高から低に下げると、瞬時にセキュリティレベルが変わるものだと思っていましたが、一旦EXCELを終了させないと、セキュリティレベルの反映がされていないことがわかりました。 おかげさまで、イベントも実行できるようになりました。この問題が解決するまで3週間ほど期間を要しましたが、解決できてすごくうれしいです。 申し訳ないのですが、もうひとつ質問を。 これまでのことをまとめると、 (1)EXCELを終了させないと、セキュリティレベルの反映はしない。 (2)セキュリティレベルが高の場合、PERSONAL.XLSに登録してあるマクロは動作するが、BOOKに登録しているマクロとイベントは動作しない。また、PERSONAL.XLSにはイベントがかけない。 (3)セキュリティレベルが中か低の場合、PERSONAL.XLSに登録してあるマクロ、及び、BOOKに登録しているマクロとイベントは動作できる。 (4)よって、イベントを動作させるためには、セキュリティレベルを中か低にする必要がある (1)(2)(3)(4)の考え方はあっているのでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >現在はRSSからのデータでテストしている訳ではなく ここで、他の方がご質問になる方法とは違うようですね。 >(5)BOOKをオープン → イベントが動作しない そのように、最初は動いて、次にオープンした時に、マクロが動かなくなるというのは、セキュリティプログラムのせいだと思います。 一度、他の一般のマクロが動くのかはチェックされましたか? もし、動かないようでしたら、その設定ををはずさない限りは、どのマクロも、最初しか使えないことになります。起動時に、マクロを停止されているのかもしれません。通常、Excelのみで、そのような現象はありません。 セキュリティプログラムの設定のチェックをお願いします。こちらでは、わかりかねます。
補足
PERSONAL.XLSに登録しているマクロは「マクロ」→「実行」で動作しますが、BOOKに登録したイベントは動作しません。 試しに、PERSONAL.XLSのSHEET1にもイベントを書き、BOOKを登録してみましたが、そのBOOKを開くと、登録されたイベントが動作しません。 EXCEL自体がおかしくなっているのかも知れません。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 返事が遅くなりました。 >証券会社のRSSから送られてくるデータで、一定時間毎に変化しているものなのですが、 そうでしたか。この件については、ここでも、同じような内容で、何度も出ています。しかし、私自身、この質問の解決度はとても低いです。それは、私は、その元の仕組みが分かっていないからです。(検索しても参考になるレベルはないと思います) 私は、不勉強なので、何度も、同じ内容に当たっていながら、直接、そのRSSを勉強しておりません。 何人かは、OnTimeメソッドなどにして解決に近づいているようです。私自身が、その問題に直接当たれば話は早いような気がしますが、証券関係は、本は買ったものの、もう1年も置いたままで、まったくのど素人なのです。 私は、そのインターネットからの取得の仕組みが分からないのですが、もしかしたら、それ自身が、マクロなど(VBAや他のプログラムで働くもの)ではないでしょうか?確か、そんな記憶があります。それで、 取得していない時を見計らって、インターバルで、書き換えるわけです。(前の人は、1分か2分の周期だったので、とても驚きました。負担が強すぎるような気がしました。) Application.OnTime 私はもっとスマートの方法はないものか、と思うだけです。それこそ、Calculate イベントが働かないのかなって思いました。(どうやら、見事に違うようですね。) 一度、その取得のシステム自体を調べていただけませんか? 私自身、この件については、満足のいける終止符を打ちたいな、と思っています。 なお、ウィルスチェッカーは、例えば、RegWrite やRead ような単語をチェックして、ストップは掛けても、マクロ自体が動かなくなることはないはずです。
補足
すみません。誤解を与えたようなのですが、現在はRSSからのデータでテストしている訳ではなく、手入力でA1のセルにキーボードで入力している状態でイベントが動作しません。 2つ下で記載していただいたWorksheet_Calculate()とWorksheet_Change()の場合 (1)EXCEL2000で新規にBOOKを作成 (2)microsoft excel objectsのsheet1にイベントを作成 → イベントが正常動作 (3)BOOKを登録 (4)BOOKのクローズ (5)BOOKをオープン → イベントが動作しない =NOW()をA2のセルにいれても動作しません。 これはRSSのデータではなく、キーボードでA1のセルに入力したときの状態です。 登録されたBOOKのイベントが、動作しないのがわかりません。
s_husky です。 先の回答をキャンセルします。 Caluculate イベントをWorksheet_Change イベントで制御しようと考えたのですが、その目的を達していません。 Worksheet_Change イベントに全てを書くべきでした。 ※折角だからCaluculate イベントを残そうと思いましたが、とんでもないミスでした。失礼!
- Wendy02
- ベストアンサー率57% (3570/6232)
なぜ、Caluculate イベントが使われるのか良く分かりません。Calculate イベントは、数式とともに用いるもので、ひじょうに特殊なイベントです。 Private Sub Worksheet_Calculate() Application.EnableEvents = False If Cells(1, 2).Value = 1 Then 'B1 Cells(1, 3).Value = "当たり" 'C1 Else Cells(1, 3).Value = "" 'C1 End If Application.EnableEvents = True End Sub >A1のセルに1を入力しても、C1のセルに”当たり"が表示されません。 この時には、どこにも、Calculate イベントは働いてはいません。 そのようなイベントを書いたら、どこか見えない部分に、=NOW() の式を入れておけば、常に、入力するたびに、Calculate イベントが働きます。ただ、何も触らなくても、シートは変更されています。 むしろ、以下のように、Worksheet_Change イベントを用いたほうがよいです。直接入力する場所が、A1 なら、A1 をTarget にすればよいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then If IsNumeric(Range("A1").Value) = False Then Exit Sub Application.EnableEvents = False If Range("A1").Value = 1 Then Range("C1").Value = "当たり" Else Range("C1").ClearContents End If Application.EnableEvents = True End Sub
お礼
(訂正)ウィルセセキュリティ2006ではなく、ウィルスキラー2006でした。
補足
Caluculate イベントを使う理由は、実際のB1のセルのデータは、A1のセルのデータをもとに計算されるものではなく、証券会社のRSSから送られてくるデータで、一定時間毎に変化しているものなのですが、説明が難しいので、これまでのような記述になりました。申し訳ありません。 記載していただいたWorksheet_Calculate()とWorksheet_Change()なのですが、EXCEL2000で新規にBOOKを作り、microsoft excel objectsのsheet1にイベントを書いた直後は動作するのですが、一旦、BOOKを登録した後、BOOKを閉じ、そのBOOKを開けた後では動作しません。、=NOW()をA2のセルにいれても動作しません。 イベントを作るのは初めてでよくわからないのですが、イベントが発動するためには、なにか設定があるのでしょうか? ためしに、マクロのセキュリティレベルを低に下げてみても、動作しませんでした。 登録したBOOKをダブルクリックで開くとき、ウィルセセキュリティ2006が一瞬動作するようなのですが、これがイベントの発動の障害となっている可能性はありますか?
s_husky です。 Sheet1.Cells(1, 1)->Sheet1.Cells(2, 1)
補足
回答ありがとうございます。 新規のBOOKを開けて、microsoft excel objectsのsheet1に、イベントを書いた場合は、表示されるのですが、そのBOOKを登録し開くとイベントが起動せず表示しないところがわかりません。
・A1が変更されたら計算ということでOKかと。 ・ただし、”当たり”を消すことも必要では... Option Explicit Private Sub Worksheet_Calculate() Sheet1.Cells(1, 3).Value = IIf(Sheet1.Cells(1, 1).Value = 1, "当たり", "") End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target = Sheet1.Cells(1, 1) Then Worksheet_Calculate End If End Sub
- toshi_2000
- ベストアンサー率30% (306/1002)
補足の方法では、私のPCでは、正しく表示されます。 その時、B1のセルは、何になっていますか?
補足
A1,B1,C1のセルの値は次のようになります。 括弧の中が値です。 (1)C1のセルをクリア・・・A1(0),B1(0),C1(空白) (2)A1のセルに"9”を入力・・・A1(9),B1(9),C1(空白) (3)改めてA1のセルに"1"を入力・・・A1(1),B1(1),C1(空白)
- toshi_2000
- ベストアンサー率30% (306/1002)
確かにその通りになりますね。 A1の値が1以外から1になる時にしか表示されません。 (再計算が発生する時のみ)
補足
回答ありがとうございます。 C1のセルに”当たり"が表示されている場合は、次の処理をしています (1)C1のセルをクリア (2)A1のセルに"9”を入力 (3)改めてA1のセルに"1"を入力 この処理で再計算はされていると思うのですが、C1のセルに”当たり"が表示されません。 よろしくお願いします。
お礼
こんにちは。 詳しく説明をつけていただいて、ありがとうございました。 セキュリティレベルについて、勉強になりました。 セキュリティは規定値から下げないほうが良いというのが頭にあり、規定値のままでEXCELは動作できるものと思っていたため、問題の解決に時間がかかりました。 あえて言うなら、EXCELのセキュリティの変更後に、「EXCELを終了しないと設定が反映しませんよ」みたいなメッセージが出てくれれば解りやすいのにと思います。 COMアドインも確認してみましたが、何も入っていませんでした。 何回も回答をいただき、本当にありがとうございました。