Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13064 / 13619 ツリー ←次へ | 前へ→

【7011】変数の値が初期化されてしまう現象について ichinose 03/8/20(水) 9:33 質問
【7012】こっちは出来たよ(98se+2002) つん 03/8/20(水) 10:06 発言
【7013】大うそつき野郎でした つん 03/8/20(水) 10:13 発言
【7015】Re:大うそつき野郎でした ichinose 03/8/20(水) 10:21 お礼
【7014】Re:こっちは出来たよ(98se+2002) ichinose 03/8/20(水) 10:17 お礼
【7016】Win2k/XP Office2k/xp すべて再現 こうちゃん 03/8/20(水) 11:48 発言
【7019】Re:Me Office2k でも0 BOTTA 03/8/20(水) 14:35 発言
【7027】Re:Me Office2k でも0 でれすけ 03/8/20(水) 16:29 発言
【7029】Re:変数の値が初期化されてしまう現象につい... MPUS 03/8/20(水) 16:33 回答
【7031】Re:変数の値が初期化されてしまう現象につい... ichinose 03/8/20(水) 18:21 お礼
【7032】Re:変数の値が初期化されてしまう現象につい... でれすけ 03/8/20(水) 19:38 発言
【7036】Re:変数の値が初期化されてしまう現象につい... ichinose 03/8/21(木) 0:00 お礼
【7059】いまごろ、結果だけ...。 Jaka 03/8/21(木) 13:13 発言
【7071】Re:いまごろ、結果だけ...。 ichinose 03/8/21(木) 17:34 回答

【7011】変数の値が初期化されてしまう現象について
質問  ichinose  - 03/8/20(水) 9:33 -

引用なし
パスワード
   おはようございます。
「変数の値が初期化されてしまう現象について」、今までもこのサイトで幾たびか
話題に上がっていました。しかし、何が起因で変数が初期化されてしまうのかについては、情報が少なかったように思います。
Win98+Excel2000ですが、簡単なコードでこの現象が再現できました(再現できると思っている私)。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=6970;id=excel

のご質問で回答をさせて頂いたのですが、
偶然にも同じようなコードを昨日作っていたところ、
標準モジュールに
'============================================
Public tes_data As Integer
'============================================
Sub main()
  Call add_chkbox(Range("a1"))
  tes_data = 5000
End Sub
'============================================
Function add_chkbox(rng As Range) As OLEObject
  With rng
    Set add_chkbox = _
      .Parent.OLEObjects.Add _
       (ClassType:="Forms.CommandButton.1", Link:=False, _
       DisplayAsIcon:=False, Left:=.Left, _
       Top:=.Top, Width:=.Width, _
       Height:=.Height)
    End With
End Function
'============================================================
と言うコードでMainを実行します(コマンドボタンは作成されますし、正常に何もなく終了します)。


次いで同じモジュール内にある以下のコードを実行すると、
'============================================================
Sub disp_data()
  MsgBox tes_data
End Sub

表示されるのは「0」です。「5000」のはずなのに・・・。
本来は、コントロール作成して、クラスモジュールにイベントコードを記述したかったのですが、「tes_data = 5000」の代わりにインスタンスを作成しても初期化されてしまいました。「フォーム」のボタンで代替しましたが・・・。

この現象について、「Win98+Excel2000だけど、こっちでは起こらない」とか、
「XPでは、起こらない」とか、「安心して!!(?)、バグだよ」とか
情報頂きたいのですが、よろしくお願いします。

【7012】こっちは出来たよ(98se+2002)
発言  つん E-MAIL  - 03/8/20(水) 10:06 -

引用なし
パスワード
   ichinoseさん、おはようございます。

コードをまるまるコピペして実行してみました。
うちは、Windows98SE+Excel2002ですが、
メッセージボックスには、ちゃんと「5000」と出ました。

ではでは


最近まとまったコードを全然書いてない・・・
なんか作りたいなあ。
誰か、こんなんあったら便利なんだけど・・・みたいなアイデアないですか?

【7013】大うそつき野郎でした
発言  つん E-MAIL  - 03/8/20(水) 10:13 -

引用なし
パスワード
   98SE+2002ではOK!と書きましたが、
よく見てみると、わたくし、標準モジュールを
Personal.xls内に追加して実行していました。
で、通常のブックでやりなおしてみたら、ダメでした(>_<)
メッセージボックスは「0」になってました。
でも、なんでPersonal.xls内ではOKなのに、
普通のブックでダメなのー?

【7014】Re:こっちは出来たよ(98se+2002)
お礼  ichinose  - 03/8/20(水) 10:17 -

引用なし
パスワード
   ▼つん さん:
おはようございます。
レス、ありがとうございます。
そうですか。2002では、OKなんですね。
直っているなら、良いのですが・・・。
私の間違いかと思い、再度、Excel2000で実行しましたが、
結果は同じでした。
Excel2000では再現性があると申し上げた事に
ちょっと不安になってきました。私だけ?(という漫談する女性がいたっけ)

もう少し、回答を待ってみます。

ともあれ、つんさん、情報をありがとうございました。

>
>コードをまるまるコピペして実行してみました。
>うちは、Windows98SE+Excel2002ですが、
>メッセージボックスには、ちゃんと「5000」と出ました。
>
>ではでは
>
>
>最近まとまったコードを全然書いてない・・・
>なんか作りたいなあ。
>誰か、こんなんあったら便利なんだけど・・・みたいなアイデアないですか?

【7015】Re:大うそつき野郎でした
お礼  ichinose  - 03/8/20(水) 10:21 -

引用なし
パスワード
   ▼つん さん:
再び、ありがとうございます。

>98SE+2002ではOK!と書きましたが、
>よく見てみると、わたくし、標準モジュールを
>Personal.xls内に追加して実行していました。
>で、通常のブックでやりなおしてみたら、ダメでした(>_<)
>メッセージボックスは「0」になってました。
>でも、なんでPersonal.xls内ではOKなのに、
>普通のブックでダメなのー?

ふーん、そうですか。試してみる価値ありですね。ちょっと確認してみます。
アドインまで確認して後でご報告します。
貴重な情報です。ありがとうございましす。

【7016】Win2k/XP Office2k/xp すべて再現
発言  こうちゃん E-MAIL  - 03/8/20(水) 11:48 -

引用なし
パスワード
   ichinoseさん、こんにちは

タイトルですべてですが(^^;)

Windows2000・WindowsXP_ProとExcel2000・Excel2002の各組み合わせ4種類とも再現いたしました。(つまり、0 表示)

ちょっと興味深い現象ですね。是非現象解明して、お教えください^^;

【7019】Re:Me Office2k でも0
発言  BOTTA  - 03/8/20(水) 14:35 -

引用なし
パスワード
   ichinoseさん、みなさん、こんにちは。

やっぱり同じです。
FunctionをSubに変えたり、データ型をLongにしたりもしましたが、
全部初期化されちまいました。

ichinose教授、是非解明してネ。

【7027】Re:Me Office2k でも0
発言  でれすけ  - 03/8/20(水) 16:29 -

引用なし
パスワード
   こんにちわ。

他のサイトの過去ログですが、
マクロが終了してもpublic変数の内容を保存するには?
http://keep-on.com/excelyou/2000lng4/200007/00070007.txt
ということらしいです。

ichinoseさんが提示されたマクロをステップ実行すると、
コマンドボタンを追加するところで、
「中断モードでは入力出来ません」とメッセージがでて、
実行が終了します。

私の経験では、こういうときは変数が初期化されます。

ステップ実行中(デバックモードに入ったときも)マクロを書き換えると
「このアクションを実行するとプロジェクトがリセットされます。実行しますか?」
とメッセージがでる場合がありますが、そのように、プロジェクトが変更される
ような場合は、実行が終了してしまうので、ENDステートメントを実行したときと
同じように変数が初期化されます。

んでわ。

【7029】Re:変数の値が初期化されてしまう現象につ...
回答  MPUS  - 03/8/20(水) 16:33 -

引用なし
パスワード
   こんにちは

コントロールツールボックスのaddは変数を初期化してしまう仕様(バグ)の
ようですね。
シートでコントロールツールボックスを用いるのは色々不都合の元みたいです。

正確に言うとOLEObjects.Addしたシートのbookの変数を初期化するみたいです。
従って、コードの書かれた以外のbookのシートにaddすると、変数は初期化されない
のではないでしょうか?


【7031】Re:変数の値が初期化されてしまう現象につ...
お礼  ichinose  - 03/8/20(水) 18:21 -

引用なし
パスワード
   MPUS さん、でれすけさん、BOTTAさん、こうちゃん、つんさん。
みなさん、こんにちは。
大変参考になる情報をありがとうございました。

BOTTAさん、こうちゃん、つんさん。
ありがとうございました。再現性があるバグ?だと認識できました。

でれすけさん、初めまして、ご回答ありがとうございます。

>ichinoseさんが提示されたマクロをステップ実行すると、
>コマンドボタンを追加するところで、
>「中断モードでは入力出来ません」とメッセージがでて、
>実行が終了します。
>私の経験では、こういうときは変数が初期化されます。
↑このご経験、別の事象の「変数の初期化」を探る時に参考になりそうです。

手動でActiveXControlを貼り付けるときにデザインモードになりますよね。
デザインモードに入った時点で変数は初期化されます。
これがAddメソッドにも影響を及ぼしているというようなバグかな?等と考えていました。

MPUSさん、初めまして。
ご回答ありがとうございます。

>コントロールツールボックスのaddは変数を初期化してしまう仕様(バグ)の
>ようですね。
>シートでコントロールツールボックスを用いるのは色々不都合の元みたいです。
↑ですね、でも、基本的には私、新しいもの好きなもので・・・。


>正確に言うとOLEObjects.Addしたシートのbookの変数を初期化するみたいです。
>従って、コードの書かれた以外のbookのシートにaddすると、変数は初期化されない
>のではないでしょうか?
実際には、作成したボタンのイベントモジュールが作れなかったので、この現象に
気が付いたのですが・・・。
ヒントになりました。ありがとうございます。

文字列変数や数値変数などは、これがバグだと分かれば、セルに保存するとして・・。

イベントプログラムやインスタンスを作成するブック(変数を保持するブック)とボタンを作成するブックを分けてしまおう と思いました。

仮に
 ブックA.xlsがボタンを貼り付けるブックとします。
 ブックB.xlsには、イベントプロシジャーやクラスのインスタンスを作成します。
 ブックA.xlsは、ブックB.xlsを参照設定しておきます。
A.xlsの標準モジュールでは
'=============================================
Sub main()
  Dim btn As OLEObject
  Set btn = myclss.add_chkbtn(Range("a1"))
  btn.Object.Caption = "感謝"
End Sub

これだけ。

B.xlsの標準モジュールには、
'====================================
Public myclss As New Class1

クラスモジュール(Class1)に
'=====================================
Public WithEvents cbt As CommandButton
'=====================================
Private Sub cbt_Click()
  MsgBox "ok"
End Sub
'=============================================
Function add_chkbtn(rng As Range) As OLEObject
  With rng
    Set add_chkbtn = _
      .Parent.OLEObjects.Add _
       (ClassType:="Forms.CommandButton.1", Link:=False, _
       DisplayAsIcon:=False, Left:=.Left, _
       Top:=.Top, Width:=.Width, _
       Height:=.Height)
    Set cbt = add_chkbtn.Object
    End With
End Function

とし、A.xlsのmainを実行し、作成されたボタンをクリックしたところ、
クリックイベントが作動してくれました。

実際には、B.xlsは、アドインにするか見えなくしておく等の処理が必要ですが・・。

こんなに大勢の方に回答を頂いたのに何も結果を残さないのでは・・と思い、
コードを記述しました。

みなさん、ありがとうございました。


追伸
このサイトで新規質問をしたのは、記憶違いでなければ、これで2回目です。
普段は、質問すら浮かばない・・・なので、他の方のご質問を勉強材料にさせて
頂いています。

前の質問したときは、説明が悪かったのか回答を頂けませんでした。
今回は、大勢の方からの回答を頂き、正直すっごくうれしいです。

繰り返しになりますが、本当にありがとうございました。

【7032】Re:変数の値が初期化されてしまう現象につ...
発言  でれすけ  - 03/8/20(水) 19:38 -

引用なし
パスワード
   ?>私の経験では、こういうときは変数が初期化されます。
>↑このご経験、別の事象の「変数の初期化」を探る時に参考になりそうです。
いえ、まさにこの事象もこれにあてはまると考えているのですけど...

ステップ実行して、このようなメッセージがでるということは、マクロが自分自身を書き換えて
プロジェクト、すなわち、ソースコードに決定的な変更が加えられている
ということですよね。

もし実行形式のプログラムをつくっているのならば、リコンパイルしなくちゃいけないような変更ですね。

変数の値を保持しているというのは、実行状態が継続しているということですが、
今回のような場合、「バグ」というより、そのようなプログラムの変更を加えて
おきながら、実行状態をそのまま続けておくというのが無理な相談なのでは
無いかと思います。

【7036】Re:変数の値が初期化されてしまう現象につ...
お礼  ichinose  - 03/8/21(木) 0:00 -

引用なし
パスワード
   ▼でれすけ さん:
再度の投稿、ありがとうございます。

>>私の経験では、こういうときは変数が初期化されます。
>>↑このご経験、別の事象の「変数の初期化」を探る時に参考になりそうです。
>いえ、まさにこの事象もこれにあてはまると考えているのですけど...
はい、確認しております。
といっても、でれすけさんの前回の投稿で初めて現象が確認できたのですが。
しかも、次回にも参考になる内容です、と言う意味で申し上げたんですが・・。
実際、今回、ステップインで実行させてみようなんて発想になりませんでしたから。
(プログラムが止まったときなどは使ってますが・・)

>ステップ実行して、このようなメッセージがでるということは、マクロが自分自身を書き換えて
>プロジェクト、すなわち、ソースコードに決定的な変更が加えられている
>ということですよね。
>もし実行形式のプログラムをつくっているのならば、リコンパイルしなくちゃいけないような変更ですね。

おっしゃる事はよくわかりますし、実際には、フォームのボタンに代替しています。

以前にも内容は違いますが、この「バグ」というキーワードで意見交換させて頂いたことがありました。

>変数の値を保持しているというのは、実行状態が継続しているということですが、
>今回のような場合、「バグ」というより、そのようなプログラムの変更を加えて
>おきながら、実行状態をそのまま続けておくというのが無理な相談なのでは
>無いかと思います。

仮に今回の事象が「バグ」でないのなら、つまり、将来、修正される見込みがないのであれば、おっしゃるとおりだと思うのですが、
もし「バグ」であるならば、Addメソッドを実行したときに実行状態が終了してしまう
というバグであり、本来なら実行状態が維持されるはずだということになれば、
「私が仕様変更を迫られるのではなく、ベンダーがバグを早く直すべきだ」という思いが頭を擡げてきてしまいます(現実には、待ってられないという事情もありますから、実際の処理方法は思いとは違ってしまいますが・・・)。

バグならば「コントロールツールバー」から「フォーム」に変えるのではなく、
「コントロールツールバー」での応急処置を施し、修正されたらコードを元に戻す。
今後のため、その応急処置の模索が投稿のひとつの理由でした。
よって、「バグ」か否かが私にとって、大きな問題でもありました。

でも、でれすけさんが再度強調された点、それから、皆さんのご意見をヒントに見つかったと思われた方法、再度検証して見るつもりです。
簡単な事例では取りあえず、動いていますが、コード量が多いものに取り入れた場合、
でれすけさんが言われた事が原因で例えば(強制終了)なんていう現実が見えてくるかもしれません。

でれすけさん、的確なご指摘、本当にありがとうございました。

【7059】いまごろ、結果だけ...。
発言  Jaka  - 03/8/21(木) 13:13 -

引用なし
パスワード
   こんにちは。
すでにと言うか、もう必要なさそうですけど...。
一応報告。
               結果
Win98SE    Office2000SR-1  0

Win98SE    Office97SR-2   5000

MacOS8.1 on
SoftWin95SR-2 Office2000    0

MacOS8.1   Office98     実行エラー。
               「エラーNo1004。 メモリが足りません。」と
               意味不明でいい加減なエラーの為、中止。
               要するにまんまのコードじゃ動かないって事ですか
               ね!その後は、追求しませんでした。

【7071】Re:いまごろ、結果だけ...。
回答  ichinose  - 03/8/21(木) 17:34 -

引用なし
パスワード
   ▼Jaka さん:
こんにちは。
おー、こんなに調べてくださって・・・、
ありがとうございます。

>すでにと言うか、もう必要なさそうですけど...。
>一応報告。
そんなことはありません。97では、動いていると言う事もわかりましたし・・。
本店のサポートサイト何度か検索かけたんですが、引っかからないんですよねえ。


>               結果
>Win98SE    Office2000SR-1  0
>
>Win98SE    Office97SR-2   5000
>
>MacOS8.1 on
>SoftWin95SR-2 Office2000    0
>
>MacOS8.1   Office98     実行エラー。
>               「エラーNo1004。 メモリが足りません。」と
>               意味不明でいい加減なエラーの為、中止。
>               要するにまんまのコードじゃ動かないって事ですか
>               ね!その後は、追求しませんでした。
いやー、お手数をおかけしました。
真面目に回答されているのに又、Jakaさんの回答見て、
笑ってしまった私、読み返してみると、別に笑うような事書いてないけどねえ。
ある意味、さすが・・・。

13064 / 13619 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free