Excel VBA質問箱 IV

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

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


13063 / 13618 ツリー ←次へ | 前へ→

【7011】変数の値が初期化されてしまう現象について ichinose 03/8/20(水) 9: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 回答

【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さんの回答見て、
笑ってしまった私、読み返してみると、別に笑うような事書いてないけどねえ。
ある意味、さすが・・・。

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