[[20170213215624]] 『VBAでの型が一致しませんエラーの回避について』(猫毛100) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでの型が一致しませんエラーの回避について』(猫毛100)

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

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim tt As Long

tt = TextBox1
Cells(1, 1) = tt

End Sub

TextBox1 はUserFormでの入力で、IMEModeは8を指定しております。
TextBox1 に数値が入力された場合はエラーにならないのですが、
空白状態で次のTextBoxに移動しようとすると、

tt = TextBox1 の場所で
型が一致しません エラー13
が返ってきてしまいます。

TextBox1で入力された値をCells(1,1)に数値として入力したい理由は、
Cells(1,1)+Cells(1,2)+Cells(1,3) と計算式を入れたいためです。
TextBoxをそのままCellsに格納すると文字列になってしまうため、
回避させようと、ttというLong型に一旦格納してみようと試みたのですが、
上記のようにうまくいきません。
ttは数値型、TextBox1は””で文字型空白と理由はわかっているのですが、
回避の方法がわりません。
どうかよろしくお願い申し上げます。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 とりあえず tt = Val(TextBox1) とでも書けばエラーは回避されます。

 ただし、このコード、あまり感心しません。

 ・まず Exit イベントを使っているということ。
  何も入力せず、タブキーで【通り過ぎるだけ】でも発生します。無駄ですね。
  同じ Exit系イベントでも、BeforeUpdate や AfterUpdate といった
  入力されたときのみ発生するイベントで処理すべきです。

 ・IMEModeを8 にしても abc といったものは入力可能です。(うっかり手が滑ってタイプした場合も含み)
  転記前に IsNumeric あたりでチェックして、エラーであれば、このテキストボックスからの脱出を
  禁止できる BeforeUpdateを使い、エラーメッセージ表示した上で、Cancel = True とすべきですね。

  空白も IsNumeric でOKになってしまいますので、そのあたりは、そちらの要件次第で
  空白なら、これもエラーにするといったことが必要です。

  で、こういった構えをとりますから、 Val での無条件数字化は必要ないというか、むしろ
  やってはいけません。

 ・ TextBox1 や Cells(1,1) でもいいのですが、プロパティを明示したほうが、コードが読みやすくなると思います。
  TextBox1.Text であったり、 Cells(1,1).Value であったり。
  ところで、Cells(1,1)、間違いじゃないですけど Range("A1") のほうがわかりやすくないですか?

 ★何よりも、コードは、きちんとインデントをつけて記述しましょう。

( β) 2017/02/13(月) 22:25


 全く異なる観点でコメントします。

 通常、ユーザーフォームで入力し、それをシートのセルに転記するといったことを行う場合、
 TextBox1 の値を A1 に書き込むだけではなく、他の TextBox等の値を他のセルにも書きこむことが
 多いでしょうね。(もし、TextBox1 の値だけを A1 に書きこむ処理なら、ユーザーフォームを使わず
 操作者が 直接 A1 に値を入れればいいわけですから)

 その中には、TextBox間での関連チェックや、あるいは必須チェック等も必要なケースが多いですね。

 ご存じのとおり、ユーザーフォーム上では、マウスで直接 TextBoxを選択することができます。
 そうすると、本来入力しなければいけないTextBoxであっても、そもそも、そのTextBoxにフォーカスがいかず
 転記が抜けてしまう場合があります。

 ですから、一般的には(あくまで一般的には)、各TextBox入力では、チェックせず、最後に 更新ボタン等が押されたときに
 各TextBoxの数字チェックや必須チェック、あるいは関連チェックを行います。

 こういったあたりも検討してみてください。

( β) 2017/02/13(月) 22:34


βさま
回答、ありがとうございます。
ご指摘いただいた件、本当にその通りです。
このコードは質問用にわかりやすくと思い、短くその部分だけ書いたものですが、インデントつけずにベタ打ちしてしまったり、for文で Cells(i,1) を使用して回しているので、そのまま記載してしまったり、見ていただくのに配慮が足りず、お恥ずかしい限りです、申し訳ありません。
プロパティ表示のした方が見やすくなるというご指摘、なるほどと思いました。ありがとうございます。

また、下回答の方ですが、最後は「登録」ボタンで他の項目も含め全チェックをいれ、エラーはメッセージではじき、フォーカスを戻し、正しい値を再入力しない限りセルへの書き込みは行わない処理をして、全入力項目のクリアもそこで行うようにしています。

今回は、他者が作ったとても横長の表があり、そこに入力する手間を省こうとして作成しているものです。
計算式はシートの行末に入っており、TextBoxに入力されるたびに合計値をLabelに呼び出し、随時、視確認しつつ入力を行う必要があり、このような質問になりました。

教えていただいたAfterUpdate を構文に組み込んだところ、うまく回ってくれました。
BeforeUpdateも勉強して、Exit系イベントを使えるようになってみたいと思います。

処理できるようになりました。ありがとうございました。

(猫毛100) 2017/02/13(月) 23:55


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.