• ベストアンサー

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/4528)
回答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/4528)
回答No.1

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

umineko315
質問者

お礼

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

関連するQ&A

  • Excel フォームで入力・登録後、各項目の消去の仕方は?

    VBA初心者ですm(__)m Excelで商品一覧表を作成し、フォームを作りました。 登録ボタンを押すと、商品名等が各セルに入力されますが、 それと同時にフォーム内の各項目をすべて削除して、次の入力ではまたまっさらなフォームの状態から入力できるようにするには、どうしたらよいでしょうか? よろしくお願いします。

  • ユーザーフォームで入力するときに、値を残して訂正分だけ訂正して入力したいのですが、できません。

    マクロの初心者です。 参考書を見ながらマクロを書きましたが、ユーザーフォームからセルに書き込み後、Cmmandと、Txtに入力データを残しておいて、次は訂正部分だけを訂正して書き込みをしたいのですが、コードがわかりません。 まだマクロをほとんど理解していませんので、よろしくお願いします。 Option Explicit Public MyDlg As Boolean Sub 鳥獣入力() 'データ入力ダイアログを呼び出す MyDlg = True 'MyDlgにtrueを代入する '入力開始位置の取得 Sheets("様式1").Select Range("B9909").End(xlUp).Activate ActiveCell.Offset(1, 0).Activate 'MyDlgにFalseが代入されるまで繰り返しダイアログを表示する Do Until MyDlg = False Form鳥獣入力.Show Loop End Sub -------------------------------- Private Sub Cmd終了_Click() '「終了」ボタンクリック時の処理 'MyDlgにFalseを代入し、ダイアログを閉じる MyDlg = False Unload Form鳥獣入力 End Sub -------------------------------- Private Sub Cmd入力_Click() '入力クリック時の処理 'ダイアログのデータをワークシートに入力する ActiveCell.Value = Cmb登録種別.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Txt登録証.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb年月日.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb鳥獣名.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb雌雄の別.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Txt捕獲数.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmbメッシュ番号.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Value = Cmb市町村名.Value ActiveCell.Offset(0, 1).Activate ActiveCell.Offset(1, -8).Activate Unload Form鳥獣入力 End Sub -------------------------------- 入力、書き込みはできましたがユーザーフォームにデータを残すことができません。 よろしくお願いします。

  • 【Excel VBA】ユーザーフォームについて

    Excel2003を使用しています。 Sheet1のある範囲のデータをSheet2に(アクティブセルに)コピーするというマクロを作成しました。 データをコピーする際、範囲中のいくつかのセル(2~3箇所ですが)のデータを書き換えて、コピーするときもあるため、変更箇所がある場合は入力モード等の関係もあるので、ユーザーフォームを使って、書き換えるようにしました。 コピー元の範囲を変えただけの同じようなマクロが複数あるのですが、テキストボックスやコンボボックスに入力されたデータをシートへ転記する際のセルの位置が変わるだけなので、ひとつのユーザーフォームを使いまわしというと変ですが、そのようなことはできないのかなと思い、質問させていただきました。 -------------------------------------------------------------- Private Sub CommandButton1_Click()   Range("F371").Value = TextBox1.Text   Range("N371").Value = ComboBox1.Text   Unload Me End Sub 上記コードは、ユーザーフォームのコードの一部ですが、 Range("F371").Value = TextBox.1Text      ↓ Range("F397").Value = TextBox.1Text のように、転記先のセルだけ変わればいいので、そのために、同じユーザーフォームをいくつも作るのも…と思った次第です。使いまわしのようなことはできなければ、コピーして作成しようと思っています。 うまく文章に表すことができなくて申し訳ないのですが、よろしくお願いします。

  • エクセルのフォームに検索結果を表示する方法について

    エクセルのフォーム上に商品名を入力して、別シートに入っているデータを検索し、該当するデータを上記フォーム上に表示させたいと考えています。 【エクセルのフォームの概要】 (1)フォームはuserform1に作成してあります。商品名を入力→txtbox1 (2)「商品一覧表」というシートに商品一覧表が作成されていて、A1~J1000までデータが入っています。 (3)検索に引っかかるデータはその一覧表の左から2番目(商品名)の列です。 (4)該当するセルがある行の左から3番目のデータをフォームのtextbox2に表示させたいと考えています。 下記のように考えていますが、どうもうまくいきません。ご指導の程宜しくお願い致します。(つい最近マクロを始めたばかりなので、とんでもない構文なのかもしれませんが、自分ではどこがどうダメなのかわかりません。) Private Sub CommandButton1_Click() Dim RangeA As Range Set RangeA = Worksheets("商品一覧表").Range("A1:J1000") UserForm1.TextBox2.Text = Application.WorksheetFunction.VLookup(TextBox1.Value, RangeA, 3, False) End Sub

  • アクセスのフォームからレコード入力空欄回避のVBA

    アクセス初心者です。 帳票式フォームからテーブルへのレコード入力において、次のレコード入力ボタンで空欄を防止するためのVBAを作っていますが、うまく行きません。空欄があれば警告は出ますがそのままテーブルへ記録されてしまいます。 テーブルに記録されずに空欄が入力できるようにするにはどうすればよいのでしょうか? また、次を入力するときにフォームの製品名の内容だけ消えずに残したいのですが、そのプログラムについても教えていただきたいです。 なかなかうまく行かずに大変困っています。 どなたかVBAの達人の方、初心者にわかりやすくお教え下さい。 「入力内容を登録して次を入力」ボタンで作ったVBAは次の通りです。 つぎはぎなので、不要なプログラムもあるかもしれません。 Private Sub コマンド9次のレコードに_Click() On Error GoTo Err_コマンド9次のレコードに_Click DoCmd.GoToRecord , , acNext Exit_コマンド9次のレコードに_Click: Exit Sub Dim Rst As DAO.Recordset Set Rst = CurrentDb.OpenRecordset("T_指定材料表", dbOpenTable) With Rst .AddNew .Fields("製品名") = Me!製品名 .Fields("回路記号") = Me!回路記号 .Fields("部品名") = Me!部品名 .Fields("員数") = Me!員数 .Update If IsNull(Me!製品名) Then MsgBox ("製品名が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If If IsNull(Me!回路記号) Then MsgBox ("回路記号が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If If IsNull(Me!部品名) Then MsgBox ("部品名が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If If IsNull(Me!員数) Then MsgBox ("員数が空欄です。") Resume Exit_コマンド9次のレコードに_Click End If End With On Error Resume Next DoCmd.GoToRecord DataForm, "T_指定材料表", acNew Rst.Close Set Rst = Nothing Call ClearControls End Sub

  • 入力時エラーメッセージの出し方

    http://oshiete1.goo.ne.jp/qa3745129.htmlを参考に 下記の構文を作りましたが、エラーメッセージが出せなく困っています。 フォームで入力を行う際に、該当ボックスで車番一覧にデータの無いものに関してエラーメッセージを出したいと考えています。 修正箇所に関してご指摘いただければと思います。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim check As Long '重複の有無(=0:重複せず,>0:重複) With Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = TextBox1.Text .Offset(0, 1).Value = TextBox2.Text .Offset(0, 2).Value = TextBox3.Text .Offset(0, 4).Value = TextBox4.Text On Error Resume Next check = 0 check = WorksheetFunction.Match(CInt(TextBox2.Text), Range("車番一覧", Columns(1))) On Error GoTo 0 If check = 0 Then MsgBox "その車番は登録されていません!", vbExclamation, "入力エラー" TextBox2.SetFocus Exit Sub End If Exit Sub End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" If TextBox1.Text = "" Then TextBox1.SetFocus End If Range("A1").Sort Key1:=Range("A1"), order1:=xlAscending, Key2:=Range("A1"), order2:=xlAscending, Header:=xlGuess End Sub

  • ユーザーフォームからコメントを入力

    ユーザーフォームを作成し、フォームからシートのセルへコメント入力しようと考えております。 もともとシートにあるコメントの情報をユーザーフォームに表示させるまで至りましたが、ユーザーフォームからシートへ転記が出来ません。 ちなみにユーザーフォームからシートへの転記方法は、 ActiveCell.Offset(1,0)で一列ずつずらしながら転記しています。 自分で試した方法ですが、 コードを一部抜粋 ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Kingaku.value ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Seikyugaku.value ActiveCell.Comment = NyukinForm.SeikyugakuComment.value 上記コードだとまったく反映されません。 ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Kingaku.value ActiveCell.Offset(1,0) ActiveCell.value = NyukinForm.Seikyugaku.value ActiveCell.AddComment = NyukinForm.SeikyugakuComment.value この方法だとコメントの赤マークは出ますが、内容がまったく表示されません。 どなたかフォームから入力したコメントをうまくシートへ反映させる方法をご存知でないでしょうか? よろしくお願い致します。

  • テキストボックスが空欄の時は何もしない

    よろしくお願いします。 現状では当BB.Textが空欄の時は、ActiveCell.Offset(0, 37).Valueの データー(数値)が、空白となってしまいます。 当BB.Textが空欄の時は、ActiveCell.Offset(0, 37).Valueの データー(数値)を変えないで、空欄以外の時はそのデーター (数値)を変えるようにしたいのですが、ご教示お願いします。 Private Sub UserForm_Initialize() Me.AA.Text = ActiveCell.Offset(0, 35).Value  Me.BB.Text = ActiveCell.Offset(0, 37).Value Me.CC.Text = ActiveCell.Offset(0, 39).Value End Sub Private Sub CommandButton1_Click() tmp = Me.既工賃.Value If IsNumeric(tmp) Then y = CDbl(tmp) tmp = Me.当施工額.Value If IsNumeric(tmp) Then y = y + CDbl(tmp) Me.工賃合計.Value = Format$(y, "#,##0") ActiveCell.Offset(0, 35).Value = AA.Text ActiveCell.Offset(0, 37).Value = BB.Text ActiveCell.Offset(0, 39).Value = CC.Text End Sub

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

  • EXCEL VBAのユーザーフォーム上のテキストボックスの入力方法について

    すいません教えていただきたいことがあります。 EXCEL VBAのユーザーフォームについて、 コマンドボタンにタグを設定して、これにキーボードと同じ機能を持たせて テキストボックス内に入力することは可能でしょうか。 例えばコマンドボタンを「あ」~「ん」まで作り、それぞれのボタンに「あ」~「ん」までのタグを設定する。 Private Sub UserForm_Initialize() CommandButton1.Tag = "あ" CommandButton2.Tag = "い" ・・・・「ん」までボタンを作成する。 次に、 Private Sub CommandButton1_Click() TextBox1.Value = TextBox1.Value & CommandButton1.Tag End Sub Private Sub CommandButton2_Click() TextBox1.Value = TextBox1.Value & CommandButton3.Tag End Sub ・・・「ん」まで作成する。 この設定では、コマンドボタンのクリックで文字の追加はできますが、ボタンを押すと常に文字が一番後ろに追加されるため、 テキストボックスをクリックしても文章の途中に文字を挿入することが出来ません。 通常のキーボードの入力と同じようにテキストボックス内でクリックした箇所からコマンドボタンで入力を開始するような設定は可能でしょうか。 よろしくお願いします。

専門家に質問してみよう