- ベストアンサー
Excel・VBA フォーム入力で空欄によるエラーをなくすには?
Excelで商品一覧表を作成し、フォームで入力できるようにしたいです。 登録ボタンを押すと、最終行に商品名等が各セルに入力されますが、 フォーム内の項目で、空欄箇所があるとエラーになってしまいます。 フォームで空欄箇所は空欄で処理できるようにしたいのですが、どのようにすればよいでしょうか? VBA初心者です。よろしくお願いします。 Private Sub commandbutton登録_Click() Worksheets("商品一覧表").Activate Range("A65536").End(xlUp).Offset(1, 0). SelectOffset(0, 0) = txt商品名.Value .Offset(0, 1) = CCur(txt価格.Value) .Offset(0, 2) = CLng(txt数量.Value) .Offset(0, 3) = txt詳細.Value .Offset(0, 4) = txt備考.Value
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 #4さんと、完全に被ってしまうけれども、一応、Excel 2007 になっても、基本的な部分は、ほとんど変わっていないですね。2007 で、目立つのは、Sort メソッドぐらいかな?一旦、テーブルを作るようですね。 それはともかく、 ご質問者さんのコードを見ると、注文とかでお客さんに渡すということをしないなら、Excelの場合は、Access のように、オブジェクト名は、あまり加工しないほうがよいですね。(今回はしょうがないのですが) >フォーム内の項目で、空欄箇所があるとエラーになってしまいます。 私には、それ以前のエラーの原因の要素が見えてくるのですが。 >SelectOffset(0, 0) = txt商品名.Value SelectOffset は、Range オブジェクトでしょうが、ややこしくなるだけです。 空欄がどうこうとかいう前に、 .Offset(0, 1) = CCur(txt価格.Value) .Offset(0, 2) = CLng(txt数量.Value) いきなり、CCur や CLng 関数に突っ込んでしまうから、エラーを起こすことになると思うのですが。生の入力値に、CCur から、セルに出しても単に、書式が変わるだけです。それに、CCur 辺りは、書式の \ で処理したほうがよいです。 それに、これらは、空白値や文字列を受け付けないばずです。もし、Clng とか入れるなら、一旦、buf に取って、それを、セルに入れたほうがよいです。 buf = txt価格.Value If IsNumeric(buf) Then buf = CLng(buf) .Offset(0, 1).Value = buf End If なお、CLng 自体は、書式では変更できません。ワークシート関数の、Round(値、0)と同じこどです。 Range("A65536").End(xlUp).Offset(1, 0). 末尾の点もそうだけれども、 Worksheets("商品一覧表").Activate があったとしても、 としても、With ステートメントが抜けていたら、何も出来ないと思います。 簡単に書けば、以下のようになると思うのです。(txt備考までは入れていません。) Private Sub CommandButton1_Click() If txt商品名.Value <> "" And _ txt価格.Value <> "" And _ txt数量.Value <> "" And _ txt詳細.Value <> "" Then With Worksheets("商品一覧表") .Activate With .Range("A65536").End(xlUp).Offset(1, 0) .Offset(0, 0).Value = txt商品名.Value buf = txt価格.Value If IsNumeric(buf) Then buf = CLng(buf) .Offset(0, 1).Value = buf End If .Offset(0, 2).Value = txt数量.Value .Offset(0, 3).Value = txt詳細.Value .Offset(0, 4).Value = txt備考.Value End With End With Else MsgBox "必要な箇所に入力されていません。", 48 End If End Sub
その他の回答 (4)
- fujillin
- ベストアンサー率61% (1594/2576)
VBAの構文が新しくなったのでしょうか? (2000までの構文しか知らないので・・・新しくなっていたら失礼) >Range("A65536").End(xlUp).Offset(1, 0). 「.」で終わる構文ってありましたっけ? Withの新しい指定方法でしょうか? >SelectOffset(0, 0) = txt商品名.Value 「SelectOffset」というプロパティってありましたっけ? Selection.Offset()と同じ? でも、セルが意図的にセレクトされている様子もないですが? >.Offset(0, 1) = CCur(txt価格.Value) With文が設定されていないけれど・・・(上の構文がそうであればOKです) さて、フォームからの入力は基本的にテキストになります。 それを CCurや CLngで数値変換するつもりだと思いますが、入力が正しい限りは、セルの書式を設定しておけば、わざわざ変換しなくてもそのままセルに代入してもエクセル側で判断してくれます。 こうすることによって、空欄入力はそのまま処理が可能になります。 しかし、数値が欲しいところに「あいう」などの文字を入力されても困りますよね? ご質問のコードでも、もちろんエラーになりますし、↑の解決法でも、エクセル側の計算式でそのセルを参照していると#VALUE!などのエラーが出ます。 ・・・というわけで、これらのエラーを防止するために、ユーザー入力を扱う場合は、最低限の入力値チェックをしておかないと、思わぬところでエラーが出る原因になります。(複雑になると、一見関係ないところでエラーになったり) ユーザーがわざと入力を間違えるかどうかは別にしても、うっかりミスは必ずありますので、数値を入れるべきところに文字を入れたり、桁を間違えたりなどはよく起ると考えられます。 その度にエラーが出ていたのでは、「使えないマクロ」だということになってしまいます。 入力されるかも知れない値(文字も含め)に対して、その値を利用する前に、入力値が利用しても問題ない値であるかどうかをチェックするルーチンを設ける習慣をつけましょう。
お礼
そうですね、基本的なことを飛び越えてCCurや CLngで数値変換しようとしてエラーが出てきてしまいました。 アドバイスありがとうございました。
- kuma56
- ベストアンサー率31% (1423/4527)
If txt商品名 <> "" Then SelectOffset(0, 0) = txt商品名.Value End If こうしてみたら↑どうなりますか? ちなみに私もVBA初心者です。 でも、Excel VBE ヘルプ の "If...Then...Else ステートメントの使い方" を参照してみて、こうしたらできないかと考えました。
お礼
教えていただいたことを参考に、下のようにしてやったところうまくいきました。 丁寧に教えていただいてありがとうございました。 If txt価格 = "" Then .Offset(0, 1) = "" Else .Offset(0, 1) = CCur(txt価格.Value) End If
- hallo-2007
- ベストアンサー率41% (888/2115)
.Offset(0, 1) = CCur(txt価格.Value) .Offset(0, 2) = CLng(txt数量.Value) の箇所ではありませんか 数値で取り出したい時に空白がある txt価格.Value txt数量.Value のTEXTBOXのプロパティで Value に 0 開いた時の初期値を 0にしておく。 試してみてください。
お礼
なるほど! 空白だからエラーになってしまうんですね。 勉強になります。ありがとうございましたm(__)m
- kuma56
- ベストアンサー率31% (1423/4527)
それぞれ IF で、tet○○ <> "" を指定したらどうなりますか?
お礼
早速の回答ありがとうございます。 教えていただいたようにやってみたいのですが、具体的にどのようにIFで式を作ればいいですか? 1つ例を示していただくと大変助かります。 初心者で申し訳ないですが、よろしくお願いします。
お礼
丁寧に教えていただいてありがとうございました。 なんとかエラーがなくなりました。 またいろいろと教えてくださいm(__)m