プロが教えるわが家の防犯対策術!

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/15 00:45

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!などのエラーが出ます。

・・・というわけで、これらのエラーを防止するために、ユーザー入力を扱う場合は、最低限の入力値チェックをしておかないと、思わぬところでエラーが出る原因になります。(複雑になると、一見関係ないところでエラーになったり)

ユーザーがわざと入力を間違えるかどうかは別にしても、うっかりミスは必ずありますので、数値を入れるべきところに文字を入れたり、桁を間違えたりなどはよく起ると考えられます。
その度にエラーが出ていたのでは、「使えないマクロ」だということになってしまいます。
入力されるかも知れない値(文字も含め)に対して、その値を利用する前に、入力値が利用しても問題ない値であるかどうかをチェックするルーチンを設ける習慣をつけましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/15 00:40

If txt商品名 <> "" Then


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

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

お礼日時:2008/10/15 00:37

.Offset(0, 1) = CCur(txt価格.Value)


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

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

お礼日時:2008/10/15 00:34

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/10 12:03

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

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