
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
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
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!などのエラーが出ます。
・・・というわけで、これらのエラーを防止するために、ユーザー入力を扱う場合は、最低限の入力値チェックをしておかないと、思わぬところでエラーが出る原因になります。(複雑になると、一見関係ないところでエラーになったり)
ユーザーがわざと入力を間違えるかどうかは別にしても、うっかりミスは必ずありますので、数値を入れるべきところに文字を入れたり、桁を間違えたりなどはよく起ると考えられます。
その度にエラーが出ていたのでは、「使えないマクロ」だということになってしまいます。
入力されるかも知れない値(文字も含め)に対して、その値を利用する前に、入力値が利用しても問題ない値であるかどうかをチェックするルーチンを設ける習慣をつけましょう。
そうですね、基本的なことを飛び越えてCCurや CLngで数値変換しようとしてエラーが出てきてしまいました。
アドバイスありがとうございました。
No.3
- 回答日時:
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
このQ&Aを見た人はこんなQ&Aも見ています
-
性格いい人が優勝
できるだけ性格いい人になって回答をお願いします。
-
フォームのテキストボックスが空白なら*"を入力する"
Excel(エクセル)
-
Excel ユーザーフォームで計算 空欄の場合のエラー処理
Visual Basic(VBA)
-
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
-
4
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
5
EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法
Excel(エクセル)
-
6
VBA リストボックスをダブルクリックしデータを修正したいのですが…。
Visual Basic(VBA)
-
7
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
8
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
9
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
10
VBAでInputBoxの再入力をさせるには?
Visual Basic(VBA)
-
11
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【バッチファイル】ホスト名を...
-
水に映った月明かりを表す言葉
-
TextBoxコントロールを引数とし...
-
複数のテキストファイルをエク...
-
参照設定は2.8と6.0 6.1とどち...
-
Excel・VBA フォーム入力で空...
-
ライブ時間について
-
① (10×3)+(20×2)×111.9=7...
-
Adobe Acrobat と Adobe Reader...
-
次の人達の骨格タイプわかる方...
-
latestの対義語
-
ジェフベックの腕輪
-
TWICEさんはライブ中ファンの携...
-
韓流好き妻の行動に怒り…私は狭...
-
寝取られジャンルが好きな人の...
-
減少率の計算方法
-
韓流女と別れたい
-
確率の問題です。 10人を4人、4...
-
K-POP好きですか?
-
BTSのメンバーってそれぞれ色々...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数のテキストファイルをエク...
-
【バッチファイル】ホスト名を...
-
参照設定は2.8と6.0 6.1とどち...
-
デスクチェア―のガスシリンダー...
-
VBAで○○:○○と表示させたいのに...
-
Adobe Acrobat と Adobe Reader...
-
latestの対義語
-
TextBoxコントロールを引数とし...
-
水に映った月明かりを表す言葉
-
全国の最新の金融機関コード・...
-
昔のテレビっておっぱいが出て...
-
確率の問題です。 10人を4人、4...
-
twiceのジヒョの1番エロいおっ...
-
twiceのメンバーの食べ方が汚く...
-
imac2012ってまだ使えますか?...
-
Excel・VBA フォーム入力で空...
-
韓流女と別れたい
-
バンタンのDOPEの最初って ラプ...
-
東京ドームのコンサート、一番...
-
Accessのレポートで重複データ...
おすすめ情報