Excel VBA質問箱 IV

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

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


6389 / 13644 ツリー ←次へ | 前へ→

【45491】終了時のイベント sarai 06/12/27(水) 11:56 質問[未読]
【45492】Re:終了時のイベント Statis 06/12/27(水) 12:50 発言[未読]
【45493】Re:終了時のイベント sarai 06/12/27(水) 13:08 発言[未読]
【45494】Re:終了時のイベント Boo 06/12/27(水) 13:12 発言[未読]
【45496】Re:終了時のイベント sarai 06/12/27(水) 14:10 お礼[未読]
【45503】Re:終了時のイベント ichinose 06/12/27(水) 18:46 発言[未読]
【45504】Re:終了時のイベント sarai 06/12/27(水) 20:35 お礼[未読]
【45505】Re:終了時のイベント ichinose 06/12/27(水) 21:38 発言[未読]

【45491】終了時のイベント
質問  sarai E-MAIL  - 06/12/27(水) 11:56 -

引用なし
パスワード
   ちょとハマってしまいました。

シート上にコンボボックスを直に貼っています。
コンボボックスのリストは2列(コード+名称:1234 ●●●●)にしています。
選択すると別シートから情報を編集して来て表にするようなプログラムを書いています。(シートのPrivate Sub ComboBox_Change()に書いています)

ブックを閉じる際、どうもComboBox_Changeのイベントが発生しているらしいのですが、発生理由が分かりません。
何かComboBoxのプロパティが強制的に変えられてしまっているような気がするのですが、VBEditorでイベントの発生理由を追跡する方法がありますでしょうか。

手がかりさえつかめなくて漠然とした記述ですみませんが、ヒントを頂けると助かります。
よろしくお願いします。

【45492】Re:終了時のイベント
発言  Statis  - 06/12/27(水) 12:50 -

引用なし
パスワード
   ▼sarai さん:
こんにちは
>ちょとハマってしまいました。
>
>シート上にコンボボックスを直に貼っています。
>コンボボックスのリストは2列(コード+名称:1234 ●●●●)にしています。
>選択すると別シートから情報を編集して来て表にするようなプログラムを書いています。(シートのPrivate Sub ComboBox_Change()に書いています)
>
>ブックを閉じる際、どうもComboBox_Changeのイベントが発生しているらしいのですが、発生理由が分かりません。
MSGBOXを追加した実際に発生しているか確認して下さい。

>何かComboBoxのプロパティが強制的に変えられてしまっているような気がするのですが、VBEditorでイベントの発生理由を追跡する方法がありますでしょうか。
>
>手がかりさえつかめなくて漠然とした記述ですみませんが、ヒントを頂けると助かります。
>よろしくお願いします。


実際のコードも見ないと何とも言えませんが?

【45493】Re:終了時のイベント
発言  sarai E-MAIL  - 06/12/27(水) 13:08 -

引用なし
パスワード
   ▼Statis さん:

>MSGBOXを追加した実際に発生しているか確認して下さい。

はい、ブレークポイントを入れて確認しました。
確かにイベントが拾われています・・・

>実際のコードも見ないと何とも言えませんが?

そうですね、、、
ですがブックの終了時に発生するイベントには何も記述していません。
コンボボックスのほかはボタンを押したときに他のシートをSelectするくらいなので。

【45494】Re:終了時のイベント
発言  Boo  - 06/12/27(水) 13:12 -

引用なし
パスワード
   フラグを立て、終了時に
Private Sub ComboBox_Change()
からExit Sub すれば良いのでは?

【45496】Re:終了時のイベント
お礼  sarai E-MAIL  - 06/12/27(水) 14:10 -

引用なし
パスワード
   ▼Boo さん:
>フラグを立て、終了時に
>Private Sub ComboBox_Change()
>からExit Sub すれば良いのでは?

Booさん、ありがとうございます。
Workbook_DeactivateとWorkbook_Openでフラグ制御することでExitできました。
ですがちょっと悔しいですね、、、なぜ勝手にコンボボックスが変わってしまうか、あるいはどのプロパティが変えられてるかが分かりませんので・・・

【45503】Re:終了時のイベント
発言  ichinose  - 06/12/27(水) 18:46 -

引用なし
パスワード
   ▼sarai さん:
こんばんは。

>ですがちょっと悔しいですね、、、なぜ勝手にコンボボックスが変わってしまうか、あるいはどのプロパティが変えられてるかが分かりませんので・・・

再現手順

・新規ブックを用意してください。
 尚、上記の新規ブックには、必ず、Sheet1とSheet2という名前のシートは
 存在することとします。

・標準モジュールに以下のコード

'========================================================

Sub 設定()
  Dim olecomb As OLEObject
  Dim r As Range
  With Worksheets("sheet2")
    With .Range("a1:b5")
     .Formula = Array("=row()", "=char(row()+64)")
     .Value = .Value
     End With
    End With
  With Worksheets("sheet1")
    Set r = .Range("b5:d6")
    With .OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
          DisplayAsIcon:=False, Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:= _
          r.Height)
     .Object.Style = 2
     .ListFillRange = "sheet2!a1:b5"
     .Object.ColumnCount = 2
     .Object.BoundColumn = 2
     End With
    End With
  ThisWorkbook.SaveAs "D:\My Documents\cmbsample.xls"
  '           適当な名前で保存します。
End Sub


上記のコードを実行してください。

Sheet1に「コントロールツールボックス」にあるコンボボックスが
配置され、メンバーはSheet2!A1:B5が設定されます。

・次にSheet1のモジュールに

'============================================================
Option Explicit
'============================================================
Private Sub ComboBox1_Change()
  MsgBox ComboBox1.Value
End Sub

上記のコードを追加して 上書き保存を行ってください。

・Sheet1のコンボボックスは、いまだ入力されていません。

・コンボボックスから適当な値を選択してください。
・Combobox1_Changeイベントが作動し、Combobox1.Valueの値が表示されます。
 (AとかBとか・・・)

・次にこのブックを閉じる操作を行ってください。
・変更の保存の有無を聞いてきますから、「いいえ」を選択してください。

・ここでChangeイベントが発生します。


いかがですか?
ご自分が作成したコンボボックスと比べてみてください。
上記の例では、BoundColumnの変更が起因しています。

【45504】Re:終了時のイベント
お礼  sarai E-MAIL  - 06/12/27(水) 20:35 -

引用なし
パスワード
   ▼ichinose さん:

こんばんは。

>いかがですか?
>ご自分が作成したコンボボックスと比べてみてください。
>上記の例では、BoundColumnの変更が起因しています。

ありがとうございます。
私のプログラムの動作と同じです。
ただ違いはBoundColumnのデフォルトで、

ichinoseさんのプログラム
 デフォルト:2 →Changeイベント発生
 プロパティを1に変更 →発生せず
私のプログラム
 デフォルト:1 →Changeイベント発生
 プロパティを2に変更 →発生せず

この違いは何でしょうか。
と言いますかそれ以前に、なぜBoundColumnが終了時に変更されて
しまうのかが分かりません。

現状、Booさんに教えていただいたフラグ方式でとりあえず
動いていますので急ぎではないのですが、参考までに教えて
頂ければ嬉しいです。

よろしくお願いいたします。

【45505】Re:終了時のイベント
発言  ichinose  - 06/12/27(水) 21:38 -

引用なし
パスワード
   >私のプログラムの動作と同じです。
>ただ違いはBoundColumnのデフォルトで、
>
>ichinoseさんのプログラム
> デフォルト:2 →Changeイベント発生
> プロパティを1に変更 →発生せず
>私のプログラム
> デフォルト:1 →Changeイベント発生
> プロパティを2に変更 →発生せず
>
>この違いは何でしょうか。
>と言いますかそれ以前に、なぜBoundColumnが終了時に変更されて
>しまうのかが分かりません。
ん?終了時に
BoundColumnの値が変更されてしまうわけではありませんよ!!
私が提示した例では、BoundColumnの規定値(1)を2に変更したことが
影響したと申し上げているのですよ!!

>
>現状、Booさんに教えていただいたフラグ方式でとりあえず
>動いていますので急ぎではないのですが、参考までに教えて
>頂ければ嬉しいです。
回避方法は、フラグで判断するが良いと思います。


原因はバグだと私は思っています・・・が、
さて、MS社は何て言っているのかなあ?


再度、新規ブックの標準モジュールに
(Sheet1、Sheet2というシート名が存在するブック)

'============================================================
Sub 設定()
  Dim olecomb As OLEObject
  Dim r As Range
  With Worksheets("sheet2")
    With .Range("a1:b5")
     .Formula = Array("=row()", "=char(row()+64)")
     .Value = .Value
     End With
    End With
  With Worksheets("sheet1")
    Set r = .Range("b5:d6")
    With .OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
          DisplayAsIcon:=False, Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:= _
          r.Height)
     .Object.Style = 2
     .ListFillRange = "sheet2!a1:b5"
     .Object.ColumnCount = 2
     .Object.BoundColumn = 1
     .Object.TextColumn = 2
     End With
    End With
  ThisWorkbook.SaveAs "D:\My Documents\cmbsample.xls"
  '           適当な名前で保存します。
End Sub


として、設定を実行してください。


さらにSheet1のモジュールに

'==================================================================
Private Sub ComboBox1_Change()
  MsgBox "ComboBox1.Value = " & ComboBox1.Value & vbCrLf & _
      "ComboBox1.Text = " & ComboBox1.Text
     
End Sub


として、上書き保存を行ってください。


前回と同じようにコンボボックスを適当に選択した後、
ブックを閉じる操作を行ってください。
保存の有無で「いいえ」を選択します。

いかがですか?
また、Changeイベントが発生しましたね?

しかも、ComboBox1.value と 
Textプロパティが同じ値を表示していませんか?

原因はこれだと思っています。
最初の例も今回の例も ComboboxのValueプロパティとTextプロパティが
違う値を持つような設定になっています。
ブックを閉じる時に何故かこのValueとTextを同じにしようとする処理が
なされています。

Changeイベントが発生するのはこのためです。
値が変更されていますからね!!

バグだと思うでしょう??

本当は、この再現手順をsarai さんに記述してほしかったのです。
何が原因か分からなければ、私ならコンボボックスのプロパティは、
プロパティウインドウに出ているプロパティの値は全て記述します。
当然、コードも・・・。

一人でも多くの方に再現しもらう最大限の努力(記述)をしてください。

この手の問題は、再現できなければお話になりません。
(今回は、解決策は見つかりましたけどね!!)

逆に再現さえしてもらえば、色んな意見がもらえますよね!!

次回は是非、そういう記述を心がけてください。

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