プロが教えるわが家の防犯対策術!

エクセルを終了して閉じるときコントロールの「変数が定義されていません」のエラーがでるのを解決したいです。通常の動作は問題ありません。

A 回答 (5件)

こんばんは。



どうやら、こちらでは、もう思うところは、ほとんど尽きてしまいました。

>もともと_Clikのところはコントロール変数も消えてなくてのも期待通りに動作しているので問題はないように思います

私が思っていたのは、今までの私の経験で、終了時のOLEがブックと関係が切れる場合の時間差というものです。だから、プロシージャの置き場所によっても変わると考えたのです。

ExcelのバージョンとかOSの問題によってもそういうことはあるらしいのですが。

コントロールツールは、シートの属性ですから、それだけ、ブック全体やアプリケーション全体からすると、つながりは低いのです。その点でいくと、フォーム・ツールのほうが上になります。

後は、アップデートや修復ということになりそうです。

ところで、「コントロール変数」とお書きになっていますが、コントロール変数にして受け渡しをするか、コントロールを変数として作っていらっしゃるという意味ですか?

コントロールを変数として入れておけば、エラーはなくなるはずですが、インスタンスを用いないと、イベントが走らないと思います。その辺りはご存知でいらっしゃるとなると、話の様子がだいぶ違ってきてしまいます。コードとしてはややこしいです。

Class 側に、以下のようにします。
Public WithEvents OpButton As MSForms.OptionButton
ここに、イベントを設定します。

VBEditor に出てくるのは、「オブジェクト名」です。コントロール変数は、特別に、プロシージャ等の引数に、コントロールを受け渡しとして使うか、Class で、OLEオブジェクトにインスタンスを設け、それをコントロールツールのオブジェクトに当てはめて、変数にすることです。ただし、ダブルクリックしても、コードは出ません。

この回答への補足

こんばんは。 時間経ってすみません。

>終了時のOLEがブックと関係が切れる場合の時間差というものです。
そうですね。ThisWorkbookのBefore_Closeまでは大丈夫なんです。そこから何が原因でどうなっていくのか?です。

「コントロール変数」は、エラーメッセージで変数が定義されていません。と出ていて、コントロールのオブジェクト名が対象になっていたのでそのようにしました。少し安易だったかもしれません。

>Class で、OLEオブジェクトにインスタンスを設け、それを
少し苦労しましたが、エラーが出なくなりました。ただややこしくなるので個人的にはなるべく使いたくないですね。

補足日時:2007/12/01 00:52
    • good
    • 0

こんにちは。



私も、今回のことは、勉強のひとつとして、長く記憶に残しておこうと思いますので、補足要求ではありませんが、もし良かったら、ExcelのバージョンとOSを教えていただけないものでしょうか?

似たような質問のケースは、今まで、1度しかありません。
あまり、特殊な解決は、私も望んではいませんが、今後、2007 から以降は、残念ですが、そういうスタイルになることは間違いないと思っています。

最近、別の方が、Wordマクロで、イベントの利かない問題が発生しました。それは、Microsoft サポートでトラブルシューティングとして公開されていましたが、やはり、Class インスタンスの解決方法でした。やがて、だんだんと、マクロも、本格的なオブジェクト指向になる可能性が強くなってきているような気がします。

この回答への補足

こんばんは。
分けの分からない問題を考えて下さってありがとうございます。
Excel2003 SP3 , 2000 SP4です。excel2000でも起きました。
MicrosoftサポートはVBAでは有料みたいです。バグは無料?
解決法がClassインスタンスという、根本を直さずに対処するマイクロソフトの姿勢は、情けないなぁ。

補足日時:2007/12/01 23:08
    • good
    • 0
この回答へのお礼

こんにちは。 ようやく解決しました。
直接の原因は、ComboBoxにありました。これを一旦消して全く同じものに
作り直したところ前記のエラーは表示しなくなりました。プロパティを比較しても全く同じなので、いつの間にかコントロール内部に不具合が蓄積してたようです。どうしてComboBoxなのかは、VBAと直接の変更が多かったぐらいの理由ですので対処法はここの事例によって違ってきます。
今後もコントロールを多く使ったソフトを作る過程で起きる可能性があると思いますので、皆さんの参考になればと思います。

お礼日時:2007/12/16 12:41

こんばんは。



>(General)ある変数の欄を見ますと閉じる前にあったOptionButton_chart1がそから消えてしまっているのです。

これは、内部でエラーが出ているから消えるのですが、

SetChartParemeter

というのは、プロシージャーですね。
それらは、ThisWorkbook には基本的には置かないことです。標準モジュールに置く必要があるはずです。それで直ればよいのですが。

私は、はっきりとした経験がないけれども、おそらく、閉じるときに、プロシージャのエラーチェックが走るのではないでしょうか?

そのChart は、別のシートにあるのではないでしょうか?グラフシートとか別のシートに作られているのでしょうか?そうでないと、そういうコードは考えられません。

Chart に対する親オブジェクトとの不一致が起きているけれど、その時に、その元のコード自体ではなく、イベントの発生する、OptionButton_chart1_Click 等に対して、反映してくるからではないでしょうか?

一度、ためしに、
Private Sub OptionButton_chart1_Click()
'ThisWorkbook.SetChartParemeter "*****"
'Refresh_Chart "*****"
End Sub

と、コメントアウトしたら、おそらくは、発生しないのではないかと思いますが、どうでしょう。それでも、エラーが発生するでしょうか?

もし、それでエラーがとまるなら、今度は、

ThisWorkbook.SetChartParemeter
Refresh_Chart
Disp_ChartData

これらをひとつずつ見ていかなくてはなりません。簡単には終わりそうにありません。

なお、VBEditor のツール-オプション-全般
順次コンパイルは外してありますか?一度、チェックしてみてください。

この回答への補足

こんばんは。 おつき合いの程ありがとうございます。

_Click()のところの二つをコメントアウトしてみましたが、状況は
変わりませんでした。もともと_Clikのところはコントロール変数も消えてなくてのも期待通りに動作しているので問題はないように思います。
ツール-オプション-全般順次コンパイルは外していませんでした。
外してコンパイルしますとエラーメッセージはそのままで、OKを押すと
黄色のハイライトが無くそのまま閉じるようになりました。逐次コンパイルの過程がなくなっただけのような気がします。
コントロールのどこかに原因があるのか? 不思議です。

補足日時:2007/11/27 21:14
    • good
    • 0

こんばんは。



まず、TextBox は、コントロールツールなのですか。

それで、コントロールツール(=OLEオブジェクト)は、シートを親オブジェクトにするものですから、シートモジュールに、そのコントロール用のコードも基本的にはなくてはなりません。そうしないと、かなりややこしいコードになってしまいます。

出来れば、コントロールツールにコードを設定するときに、「青い三角定規」がオン(編集可能な状態)になっている時、コントロール(例:テキストボックス)をダブルクリックして、開いてから、そこにコードを書くということをすれば、まず、間違いないのです。

以下のことを試してみてください。

「編集可能な状態」の時、そのコントロールをダブルクリックしてみてください。

きちんとコントロールとコードが設定されていれば、その設定されたコードが開くはずです。開いたら何もない状態なら、その登録したコードの場所が違うか、そのコードを一度見せていただくしかありません。

コントロールツール用のコードは、ネットでは高度な設定を公開している人もいます。その場合は、ダブルクリックしても、設定されたコードは開きませんから、そのコードを全部みないとチェックできません。

なお、フォームツールは、基本的には、標準モジュールで登録しますから、そのような問題は起こりません。

この回答への補足

こんばんは。回答を頂きありがとうございます。
コントロールと言うのはツールバーのコントロールツールボックスからシートに貼り付けたものです。ダブルクリックすると開きます。
以下にOptionButtonのコードで説明します。(OptionButtonでも同じエラーになりました。)
ダブルクリックしますと普通に_Click()が開きます。繰り返すのですが通常の動作は問題ありません。閉じて終了するときにComboBox_Chartlength_Change のところでOptionButton_chart1が反転してSubのタイトルが黄色にハイライトされます。
それから(General)ある変数の欄を見ますと閉じる前にあったOptionButton_chart1がそから消えてしまっているのです。
困った状態です。

Private Sub OptionButton_chart1_Click()
ThisWorkbook.SetChartParemeter "*****"
Refresh_Chart "*****"
End Sub

Private Sub ComboBox_Chartlength_Change()
....
If OptionButton_chart1.Value = True Then
Refresh_Chart "*****"
Disp_ChartData 2, 1, "******"
ElseIf OptionButton_chart2.Value = True Then
....
End Sub

補足日時:2007/11/26 20:42
    • good
    • 0

こんにちは。



ご質問のタイトルの
「コントロールの変数が定義されていません 」
というエラー自体は思い当たりません。また、インターネット検索しても、ヒットしないです。

ともかく、VB Editor (Alt + F11)を開いて、プロジェクトエクプローラ(でていない場合は、Ctrl + R )で、ひとつずつ、中を開いていただくしかありません。しかし、フリーのアドイン辺りになるなら、それは、捨てていただいたほうがよいです。

その中に、
Workbook_BeforeClose(Cancel As Boolean)
や、
Auto_Close()

などの文字があったら、その画面の一番上の

Option Explicit を削除してください。

この回答への補足

説明不足で申し訳ありませんでした。
補足しますとTextBoxなどのコントロールですがブックを開いている時は
普通に認識して動作しています。閉じて終了する時にそのTextBoxが(General)などの変数があるの欄の中からなぜか消えてしまって、VBA本体が未定義の変数としてみなしているかのように「変数が定義されていません」のエラーを表示します。全てのコントロールがそうなるわけではありません。
ちなみに Option Explicit を削除して試してみますとエラー内容が「オブジェクトが必要です」に変わってしまいました。開いているときは同じように問題はありません。

補足日時:2007/11/25 21:56
    • good
    • 0

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