• ベストアンサー

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

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

umineko315
質問者

お礼

丁寧に教えていただいてありがとうございました。 なんとかエラーがなくなりました。 またいろいろと教えてくださいm(__)m

その他の回答 (4)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.4

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!などのエラーが出ます。 ・・・というわけで、これらのエラーを防止するために、ユーザー入力を扱う場合は、最低限の入力値チェックをしておかないと、思わぬところでエラーが出る原因になります。(複雑になると、一見関係ないところでエラーになったり) ユーザーがわざと入力を間違えるかどうかは別にしても、うっかりミスは必ずありますので、数値を入れるべきところに文字を入れたり、桁を間違えたりなどはよく起ると考えられます。 その度にエラーが出ていたのでは、「使えないマクロ」だということになってしまいます。 入力されるかも知れない値(文字も含め)に対して、その値を利用する前に、入力値が利用しても問題ない値であるかどうかをチェックするルーチンを設ける習慣をつけましょう。

umineko315
質問者

お礼

そうですね、基本的なことを飛び越えてCCurや CLngで数値変換しようとしてエラーが出てきてしまいました。 アドバイスありがとうございました。

  • kuma56
  • ベストアンサー率31% (1423/4527)
回答No.3

If txt商品名 <> "" Then SelectOffset(0, 0) = txt商品名.Value End If こうしてみたら↑どうなりますか? ちなみに私もVBA初心者です。 でも、Excel VBE ヘルプ の "If...Then...Else ステートメントの使い方" を参照してみて、こうしたらできないかと考えました。

umineko315
質問者

お礼

教えていただいたことを参考に、下のようにしてやったところうまくいきました。 丁寧に教えていただいてありがとうございました。 If txt価格 = "" Then .Offset(0, 1) = "" Else .Offset(0, 1) = CCur(txt価格.Value) End If

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

.Offset(0, 1) = CCur(txt価格.Value) .Offset(0, 2) = CLng(txt数量.Value) の箇所ではありませんか 数値で取り出したい時に空白がある txt価格.Value txt数量.Value のTEXTBOXのプロパティで Value に 0 開いた時の初期値を 0にしておく。 試してみてください。

umineko315
質問者

お礼

なるほど! 空白だからエラーになってしまうんですね。 勉強になります。ありがとうございましたm(__)m

  • kuma56
  • ベストアンサー率31% (1423/4527)
回答No.1

それぞれ IF で、tet○○ <> "" を指定したらどうなりますか?

umineko315
質問者

お礼

早速の回答ありがとうございます。 教えていただいたようにやってみたいのですが、具体的にどのようにIFで式を作ればいいですか? 1つ例を示していただくと大変助かります。 初心者で申し訳ないですが、よろしくお願いします。

関連するQ&A

専門家に質問してみよう