こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA初心者です。

VBA初心者です。

ユーザーフォーム上にテキストボックスとコンボボックスを1つずつ作りました。その二つを以下のように関連させています。

Private Sub ComboBox2_Change()

'コンボボックスの値で100を割ったものを、小数第三位を四捨五入してテキストボックスに表示する
TextBox1.Value = WorksheetFunction.Round(100 / ComboBox2.Value, 2)

End Sub

コンボボックスのリストから値を選択したり、直接値を入力するときちんとその通りになってくれるのですが、コンボボックスの値をBackSpaceで消すと、「実行時エラー'13':型が一致しません」と出ます。デバックで落ちるのはこの部分なので、このプログラムに問題があると思うのですが、どこがいけないのかが分かりません。問題点が分かる方、ぜひ教えて下さい。

投稿日時 - 2010-02-19 16:32:49

QNo.5689654

暇なときに回答ください

質問者が選んだベストアンサー

Private Sub ComboBox2_Change()
ということなので、変更されたら以下が実行されるということですよね。
そうなるとComboBox2.Valueの値が何もない状態に"変更"されたらどうなるでしょう。
エラーが出ます。
なので

Private Sub ComboBox2_Change()
if ComboBox2.Value <> "" then
実行内容
end if
end Sub

とすればいいかと思いますよ?

投稿日時 - 2010-02-19 16:40:01

お礼

的確かつ明快、そして素早い回答ありがとうございました。

投稿日時 - 2010-02-19 16:57:27

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

この

ComboBox2_Change()

というプログラムは、「コンボボックスの内容が変わった時」に起動
されるプログラムという意味です。ですので、「データを削除した時」
も「コンボボックスの内容が変わった時」ですから、自動的に起動して
しまいます。

起動したら、当然コンボボックスの中身は「ブランク」ですから、
データの被除数(ComboBox2.Value)がブランクになって、計算
出来なくなってしまいます。

これを回避するためには、先にComboBox2.Valueの中身をチェックする
必要があります。例えば

IF ComboBox2.Value>0 Then
 TextBox1.Value = WorksheetFunction.Round(100 / ComboBox2.Value, 2)
Else
 TextBox1.Value = ""
EndIf

と言う様な感じですね。

なお、本来なら「ComboBox2.Value」は文字列が来てしまう可能性があり
ますので、文字列でないかも事前にチェックしておく必要があります。

投稿日時 - 2010-02-19 16:40:41

お礼

今までChangeの意味をなんとなく分かったつもりでいましたが、FEX2053さんの解説で100%理解できました。

>文字列でないかも事前にチェックしておく必要があります

自分でやってみます。丁寧な説明、ありがとうございました。

投稿日時 - 2010-02-19 17:17:19

あなたにオススメの質問