エクセルVBEのListBoxのイベント(change、BeforeUpdate、AfterUpdate)の使い方の違いが分かりません。
具体的例で簡単に教えていただきたいのですが。(web上にあればそれでも結構です。)

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>エクセルVBEの


リストボックスにも
(1)ワークシートに貼り付ける
(2)ユーザーフォームに貼り付けるばあいを明確に意識し、質問に書くこと。
(1)ではBeforeUpdateは見つからなかった。
ーー
(2)では
http://home.att.ne.jp/zeta/gen/excel/c04p32.htm
の終わりのほうに解説があるが、良くわからない。エクセルVBAのリストボックスぐらい(アクセスの関連説明が多い)ではあまり使う場合は無いのではとおもう。
Private Sub ListBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
とBeforeUpdateはCancel   がある。
Private Sub ListBox1_AfterUpdate()
にはない。
http://www.geocities.jp/cbc_vbnet/kisuhen/Event. …
    • good
    • 0
この回答へのお礼

教えていただいたページに書いてあった例をコントロールを作り、イミディエイトウィンドウを表示して
試してみました。次のような結果になり理解できました。ありがとうございます。
●Changeはデータを一部でも変更するたびにイベントが発生し、フォーカス移動が可能になる。
●AfterUpdateはデータを全部変更した時点でイベントが発生し、フォーカス移動が可能になる。
●BeforeUpdateはフォーカスを移動させる前に、自分で設定した条件にデータが合うかをチェックできて(数値か文字か等)、もし条件に合わなければ変更をキャンセルしてフォーカスを移動させない。合えばAfterUpdateと同じになりフォーカスを移動できる。

お礼日時:2011/04/09 12:55

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBA テキストボックスへのセットフォーカスについて

エクセルVBAでユーザーフォーム内に配置されたテキストボックス
への数値の入力時に、指定範囲内になければメッセージボックスで
規格外であることを警告し、その規格外が入力されたテキストボックス
を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが
どうすればよいのでしょうか?
自分で考えた構文です。
Private Sub TextBox1_AfterUpdate()
Dim A As Single

A = TextBox1.Text
If A < 1.99 Or A > 3.00 Then
MsgBox "規格外!!"
    TextBox1.Text = ""
TextBox1.SetFoucus
End If
Exit Sub

End Sub

これですと、次のテキストボックスにフォーカスが移動してしまいます。
次のテキストボックスにフォーカスを移動させずに、規格内の値が
入力されるまでフォーカスを移動させない方法を教えて下さい。
お願い致します。

エクセルVBAでユーザーフォーム内に配置されたテキストボックス
への数値の入力時に、指定範囲内になければメッセージボックスで
規格外であることを警告し、その規格外が入力されたテキストボックス
を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが
どうすればよいのでしょうか?
自分で考えた構文です。
Private Sub TextBox1_AfterUpdate()
Dim A As Single

A = TextBox1.Text
If A < 1.99 Or A...続きを読む

Aベストアンサー

こんにちは。Wendy02です。

>イベントをAfterUpdateにしましたが、Wendy02さんはExitを使っていますが、AfterUpdateではなぜ正しく動作しないのでしょうか?

イベント自体の問題よりも、イベントの機能を良くみたほうがよいですね。
_Exit(ByVal Cancel As MSForms.ReturnBoolean)

ここで、Return(戻り値)のブーリアン値があるようなので、それを利用しただけです。

>Cancel = True
が、フォーカスの移動をキャンセルしています。

別に、Exit でなくても良いのです。例えば、

_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
のKeyCode に入った 「13(Enter)」のコードを 0 で打ち消す方法でも、可能です。

If が True の時に、
 MsgBox "規格外!!",16
 TextBox1.Text = ""
 KeyCode = 0

でも可能です。

「なぜ?」というよりも、そういうパターンがあるということです。たぶん、AfterUpDateでも、方法によってはできるとは思いますが、かなり難しくなるのではないかなって思うだけです。

こんにちは。Wendy02です。

>イベントをAfterUpdateにしましたが、Wendy02さんはExitを使っていますが、AfterUpdateではなぜ正しく動作しないのでしょうか?

イベント自体の問題よりも、イベントの機能を良くみたほうがよいですね。
_Exit(ByVal Cancel As MSForms.ReturnBoolean)

ここで、Return(戻り値)のブーリアン値があるようなので、それを利用しただけです。

>Cancel = True
が、フォーカスの移動をキャンセルしています。

別に、Exit でなくても良いのです。例えば、

_KeyDown(By...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qエクセルで、任意のテキストボックス等にフォーカスを移したい

すいません、またまた質問です。

エクセルXPで、ユーザーフォーム上に
複数のテキストボックスやリストボックスを
置いて入力した値が任意のシートのセルに
入力されるというものを作っています。
(しかしながらVBAがほとんど見様見真似レベル
なのでかなり悪戦苦闘(~_~*))

そこで、ユーザーフォームにて例えばTEXTBOX1に
入力後、Enterで次のテキストボックス(又は
リストボックス)にフォーカスを移したいのですが、
その時に任意のテキストボックス等にフォーカスを
移すことは可能でしょうか。

番号順(なのかな?)に自動でフォーカスを
移動させることはできたのですが、任意の対象へ
移動させるやり方とかってあるのでしょうか。

例えばTEXTBOX1からRISTBOX5へ移すとか。

入力する順番に移動できたらユーザーフォーム上での
入力作業が非常に楽になると思って(^o^;)

どうぞよろしくお願いします。

Aベストアンサー

#2 tommy-pie83 さんのご回答で良いとおもいますが、
その作業は面倒なので、

VBE でフォームオブジェクトを表示した状態で、
[表示]-[タブオーダー]

で調整です。ちなみに、フォーカスを取得させない
コントロールなら、「TabStop」プロパティーを
False にします。

QVBA エンターキーでイベントに入りたい。

テキストボックスにデータ入力後エンターキーの押下でイベントに入りたいのですが、下記のコーディングで[通過]メッセージが表示されません。英数字は通過しますが、エンターキーは動作停止します。
これと全く同じコーディングでVB6は正しく動きます。(ただし、Pvate Sub text1_KeyPress(KeyAscii As Integer)に変更してます。)
<コーディング>
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Msgbox "通過"
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
End If
End Sub

これが出来ると、そのつどキーボードから手を離さずに済むので作業効率がグンとあがります。どうかよろしくご教示ください。Excel2003SP3

Aベストアンサー

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃっているようですが、はっきり言えば、その最初のコードは、VBAでは間違っています。それに気がついてください。

質問のコードのままのコードでは、Enter キーのイベントは、取れないのです。別にPCの故障でもソフトの問題でもないし、こちらが試していないわけでもありません。

Visual Basic とVBAは、細かい点で違います。

VBAのこの種のイベントの KeyAscii では、VB6 で取れる、EnterキーのKeyAsciiの 「13」 は、取れません。 KeyAscii は、MSForms.ReturnIntegerとなって、Integer ではありません。

だから、私は、その代わりとして、KeyDown イベントを使えばよいとしているわけなのです。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = vbKeyReturn Then
  MsgBox "Enterキーが入りました", 64
  'KeyCode =0
 End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 MsgBox "通過"
End Sub

こんにちは。

>ご指摘のオブジェクトとプロシージャは間違いないことを確認しています。(TextBox1,keyPress)コードのロジックはこれ以上簡単に書きようがないほど単純明快です。

>Excelで実際にこのコードを実行していただけませんか。

ご自身のコードが間違いがないと思い込んでいられるから、そういう発言をされるのだと思いますが、ここでのお話の前提は、あくまでも、VBAです。VB6ではありません。

私が、期待通りの反応を示さないので、「実際にこのコードを実行してください」とおっしゃってい...続きを読む

QVBA ユーザーフォームのChangeイベントを停止したい

ユーザーフォームのChangeイベントは
Application.EnableEvents = Falseで停止できないのですか?
シート上のChangeイベントの停止はできましたが、ユーザーフォーム上のテキストボックス等のChangeイベントは停止できませんでした。
ユーザーフォームのChangeイベントを停止する方法があれば教えてください。

Aベストアンサー

こんにちは。

> Application.EnableEvents = Falseで停止できないのですか?

できません。あくまで、Application(Excel)のイベントに対するモノであり、
OLE オブジェクトであるフォームのイベントまでは制御できません。

> ユーザーフォームのChangeイベントを停止する方法があれば教えてください。

イベントの実行可否フラグを用意する方法があります。イベントの発生
自体は抑止できませんが、フラグが立っていなければイベント内の処理を
キャンセルすることで事実上、イベントを抑止したことになります。

新規 Userform に CheckBox1 と TextBox1 を配置して、下記ソースを
貼り付け、動作確認してみて下さい。

Private fEnableEvents As Boolean

Private Sub UserForm_Initialize()
  With Me.CheckBox1
    .Value = True
    .Caption = "Enable Events"
  End With
End Sub

Private Sub CheckBox1_Change()
  fEnableEvents = CBool(Me.CheckBox1.Value)
End Sub

Private Sub TextBox1_Change()
  If fEnableEvents Then
    MsgBox "Raise Change Event."
  End If
End Sub

こんにちは。

> Application.EnableEvents = Falseで停止できないのですか?

できません。あくまで、Application(Excel)のイベントに対するモノであり、
OLE オブジェクトであるフォームのイベントまでは制御できません。

> ユーザーフォームのChangeイベントを停止する方法があれば教えてください。

イベントの実行可否フラグを用意する方法があります。イベントの発生
自体は抑止できませんが、フラグが立っていなければイベント内の処理を
キャンセルすることで事実上、イベントを抑止したこ...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QVB6,リストボックスの特定行の色変更は可能?

リストボックスに複数行テキストが登録されているときに、特定の行の背景色を変更することは可能でしょうか?
リストボックスのプロパティ等をいろいろ探してみたのですがそれらしきものは見つかりません。
サブクラス化というやつをすればできるのでしょうか?
よろしくお願いします。

Aベストアンサー

これは「オーナードロー」というテクニックになります。

例えばListBoxの描画をVBでは意識する必要がありませんが(マウスで選択するとハイライトしたり、ウインドウを再表示した時に再描画してくれたり等)、これはOSが勝手にやってくれるからなのです。
「オーナードロー」とは、このOSがやってくれる作業を自分で行う、ということになります。
自分で行えば背景色の変更も、前景色の変更も可能になります。
背景にビットマップを描画することも可能です。

>サブクラス化というやつをすればできるのでしょうか?

オーナードローをVB6で実現するには、サブクラス化が必須になります。
オーナードローのコントロールからWM_DRAWITEMというメッセージが送られてくるので、それを処理しなければいけないからです。
ただ、VB6標準のListBoxには「オーナードローを許可する」ListBoxというのがありません。
具体的に言うと
LBS_OWNERDRAWFIXED:(デフォルト)普通のListBox
LBS_OWNERDRAWVARIABLE:オーナードローが有効なListBox
という2つのウインドウスタイルがありますが、VB6標準のListBoxはLBS_OWNERDRAWFIXED固定になっています。

これを変える事は難しいので、CreateWindowEx()API関数を使って「一から(LBS_OWNERDRAWVARIABLEを有効にした)ListBoxを作成する」という作業が必要になります。
そのうえで、サブクラス化を行い、ウインドウプロシージャでWM_DRAWITEMを捕まえて、描画を行います。

しかも、描画にしてもVC++などでウインドウ描画(ブラシなど)の知識があればその辺は何とかなると思いますが、やったことが無いとかなり大変です。
なにせ、OSがやってくれたことを全部(に近い状態で)行わなくてはいけないのですから。

もしサブクラス化の知識もおありでないようでしたら、潔くListBoxを使うのはあきらめたほうがいいかもしれませんね(^^;
一応、参考になりそうなサイトを挙げておきます。

<<ボタンのオーナードロー>>
http://www5.ocn.ne.jp/~minute/article/vb/a2.html
このケースではCommandButtonですが、考え方は一緒です。
<<サブクラス化>>
http://www.galliver.co.jp/writing/susume_vb/tre908/
ListBoxそのものではありませんが(MS提供のユーザーコントロールを使う)、参考になるサンプルとその情報があります。

いちばん簡単なのは、多少運用は面倒ですがListBoxの代わりにTreeViewなどを使う方法ですね。
時間があればListBoxでチャレンジしても構いませんが、サブクラス化一つとってもそれなりの知識が必要ですので、段階を踏んで知識を積み上げていくことをオススメします。

これは「オーナードロー」というテクニックになります。

例えばListBoxの描画をVBでは意識する必要がありませんが(マウスで選択するとハイライトしたり、ウインドウを再表示した時に再描画してくれたり等)、これはOSが勝手にやってくれるからなのです。
「オーナードロー」とは、このOSがやってくれる作業を自分で行う、ということになります。
自分で行えば背景色の変更も、前景色の変更も可能になります。
背景にビットマップを描画することも可能です。

>サブクラス化というやつをすればできるのでし...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報