• ベストアンサー

エクセルVBA テキストボックス 金額の入力

エクセルVBA ユーザフォームにて「商品登録」を作成しています。 単価を設定するテキストボックスについて2つ質問させてください。 1.単価が小数点以下の場合の処理 2.小数点なしの単価を小数点ありの単価に修正する方法 1.以下の方法で小数点ありとなしを判断しているのですが、 もっと簡単な方法があれば教えていただきたいです。 Set mytxt = Me.Controls("txt4") If mytxt.Text <> "" Then   tanka01 = mytxt.Text   tanka02 = Application.WorksheetFunction.RoundDown(tanka01, 0)   If tanka01 = tanka02 Then     mytxt.Text = Format(tanka01, "#,##0")   Else     mytxt.Text = Format(tanka01, "#,##0.0")   End If End If 2.上記方法で、単価をデータに設定後、変更を行うため、 TextBox内に単価を出力し変更できるようにしているのですが、 1度小数点なしで設定してしまうと、小数点以下が単価のTextBox内に 入力できなくなってしまいます。 小数点が再度入力できる方法は存在するでしょうか? 以上です。 色々と調べてみたのですが、見つからず、質問させていただきました。 よろしくお願いいたします。

noname#75421
noname#75421

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 両方を兼ね揃えているコードは、こんな風にしたら、と思うのですが、質問のコードを見ると、TextBox は、数多くあるようですね。そうすると、サブルーチンすればよいのですが、ちょっと難しくなりそうです。(修正案) 以下の場合は、Enter を入れると、変化します。 Private Sub Txt4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim buf As Variant If KeyCode <> 13 Then Exit Sub If IsNumeric(Txt4.Text) Then   buf = CDbl(Txt4.Text)   If Int(buf) = buf Then     Txt4.Text = Format(buf, "#,##0")   Else     Txt4.Text = Format(buf, "#,##0.0")   End If End If End Sub '---------------- '修正案 Private Sub Txt4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim buf As Variant If KeyCode <> 13 Then Exit Sub  SubTest Me.ActiveControl  'こうすれば、共通にできます。 End Sub 'サブルーチン Sub SubTest(arg As Object) If IsNumeric(arg.Text) Then   buf = CDbl(arg.Text)   If Int(buf) = buf Then     arg.Text = Format(buf, "#,##0")   Else     arg.Text = Format(buf, "#,##0.0")   End If End If End Sub

noname#75421
質問者

お礼

こんにちは。 回答ありがとうございます。 なるほど、「if int(X) = X」と行えば すっきりするんですね。 ありがとうございます。 勉強になります。 他にも変更・照会のフォームがたくさんあるので、 上記サブルーチンを参考にさせていただきます。 基本的な質問をしてもよいでしょうか? サブルーチンは「標準モジュール」に記入してもよいのでしょうか? すみません。やってみればわかりますよね。 努力してみます。 本当にありがとうございます。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 >今回の質問は以前に出されていたのでしょうか? 似たような質問は、時々みます。私は、Visual Basic 6 のテキストですが、Formの基本問題に出てくるようですね。 >クラスは苦手で。。。勉強します。 こういうことは、教わらないとできないですね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 UserFormが、複数ある場合や、コードが大きい場合は、「標準モジュール」になりますが、今回のレベルなら、そのまま、UserForm モジュールでよいと思います。 ただ、今回、ちょっと考えたのは、あまり数が多いと、クラスで設定したほうが良いかもしれない、と思いました。 なお、今回の質問は、テキストでやったことがあります。その時に、いっしょに出てくるのは、Val 関数とCDbl や CLng関数ですが、その違いは分かりますか?

noname#75421
質問者

お礼

本当にありがとうございます。 いくつかのフォームで使うため、「標準モジュール」に設定し、 うまくいきました。 クラスは苦手で。。。勉強します。 今回の質問は以前に出されていたのでしょうか? すみません。見たつもりだったのですが。。。 CDbl等については全然知りません。 今、インターネットでちらっと見てみました。 勉強いたします。 本当にありがとうございます。 これからもよろしくお願いします。 なんて、言ったらご迷惑ですよね。 ありがとうございます。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

mytxt.Text = Format(mytxt.Text, "#,##0.0") 上記のみでなにか不都合が起こるのでしょうか。

noname#75421
質問者

お礼

回答ありがとうございます。 私の説明不足だったのですが、 小数点のある場合と、ない場合とで 出力方法を変えようと思っていたのです。 説明不足ですみません。。。 回答ありがとうございます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

小数点”.”がテキストに含まれているかどうかで、判断するというのとは違うのでしょうか? まず、どのように入力したものをどのように表示したいとか、具体例をあげたほうが わかりやすいかもです。 ”含まれる”というのなら、 InStr関数  http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/function/vba_string.html#instr で返り値が0か1以上かで判断できるかと。

noname#75421
質問者

お礼

回答ありがとうございます。 わかりにくい質問ですみません。。。 入力 1000 → 出力 1,000 入力 1000.5 → 出力 1,000.5 としたかったです。 n-junさんのやり方で行ったところきちんと出力されました。 ありがとうございます。 ロジックもすっきりしました。 2.の小数点の入力については、 TextBoxのChangeで行っていたところを、 TextBoxのExitでformatしたら、小数点もきれいに 入力できました。 本当にありがとうございました!

関連するQ&A

  • エクセルVBAでユーザーフォームのテキストボックス

    ユーザーフォーム上にテキストボックスを8個設置しました。 そこに数値が入力された場合は自動的にカンマ区切りが表示されるように以下のコードを書きました。 これで希望の動きはしてくれるのですが、このやりかたは正しいでしょうか? また、テキストボックスは8個あるので、それぞれに下記のように8通りコードをかかなければいけないのでしょうか?ご教示ください。 Private Sub TextBox1_Change()   If IsNumeric(TextBox1.Value) Then Application.EnableEvents=False     TextBox1.Text = Format(TextBox1.Value, "#,##0") Application.EnableEvents=True   End If End Sub 途中(2~7)略 Private Sub TextBox8_Change()   If IsNumeric(TextBox8.Value) Then Application.EnableEvents=False     TextBox8.Text = Format(TextBox8.Value, "#,##0") Application.EnableEvents=True   End If End Sub

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • エクセル2003のVBAで、ユーザーフォームにあるテキストボックスに入力制限をつけたいのですが

    エクセル2003のVBAで、ユーザーフォーム上にあるテキストボックスに入力制限をつけようとしています。 エクセルのセル13列目にdeg値 0 0.5 1 1.5 2 ・ ・ ・ があります。 ここにない値を入力するとエラーメッセージを表示させます。 下記のコードで、小数点を入力した瞬間(例えば「1.」)にエラーメッセージが表示されてしまいます。 どう修正したらよいか、どなたか分かりませんでしょうか? よろしくお願いいたします。 Private Sub TextBox21_Change() For i = 7 To 1446 If TextBox21.Value = ThisWorkbook.Sheets(\"default\").Cells(i, 13).Value Then Exit For Next i If i = 1447 Then MsgBox \"deg値と一致しません。補正値を入れなおしてください。\" TextBox21.Text = \"\" End If End Sub

  • VBAで数値入力について

    Excel VBAで、UserFormにTextBoxを配置しています。 TextBoxに入力された数値は、半角数値で正数で小数点以下の桁数は1までと制限したいです。 現在は下記のプログラムにしているのですが、「1.2.3」と入力されるとエラーが表示されずに通ってしまいます。。。 どのようにしたらよいのでしょうか。 For i = To Len(TextBox1.Text) If Not Mid(TextBox1.Text, i, 1) Like "[0-9 And .]" Then Message"半角数値ではありません" Exit Sub End If Next i If Val(Text1.Text) = 0 Or TextBox1.Text = "" Then Message"数値を入力してください" Exit Sub End If

  • ユーザーフォーム上にある「テキストボックス」に小数が入力できない

    以前にユーザーフォーム上のテキストボックスにセル値反映する方法を下記(サンプル1)のようにお教えいただいたのですが、下記のようにマクロを組むとテキストボックスに小数が入力できなくなってしまいます。 どのようにしたら、テキストボックスに小数が入力できるようになるのでしょうか? お教えください。 事例)「1.234」とテキストボックスに打ち込むと「1」    「0.856」とテキストボックスに打ち込むと「0」と    なってしまいます。 (サンプル1) 'A1のデータを反映するとした場合 'OptionButton1のコード Private Sub OptionButton1_Click() TextBox1 = Sheets("Sheet1").Range("a1") End Sub 'B1に反映するとして 'OptionButton2のコード Private Sub OptionButton2_Click() TextBox1 = "" End Sub 'TextBox1のコード Private Sub TextBox1_Change() If OptionButton2 = True Then Sheets("Sheet1").Range("B1") = TextBox1.Value End If End Sub

  • excelのテキストボックスで、うまく動作しない

    a列に行間隔不等で1~100の数字を記入してあります。 このセル番地を検索する為、テキストボックスで、以下の記述を試しましたが、うまくいきません。 1、lostfocusに設定すると、 テキストボックス入力後、エンターキーを押してもフォーカスが移動しない。 2、changeに設定すると、 2桁数字を入力できない。(1数字だけでフォーカスが移動してしまう) 設定の不備な点、 あるいは、規定の検索メニュウ使用以外で、 最適の方法を教えてください。 Private Sub TextBox1_Change() Dim dx dx = Application.WorksheetFunction.Asc(TextBox1.Value) With ActiveSheet.Range("a:a") Set c = .Find(dx, LookIn:=xlValues) If Not c Is Nothing Then c.Activate Else MsgBox "該当なし" End If End With TextBox1.Value = "" End Sub

  • Excel VBA テキストボックスを検索

    テキストボックス3に数値を入力し ExcelのA列にあるか検索をかける。 ある場合は、B列の同じ行に 「みーつけた!」と入力。 その設定で組んでみたのですが、 テキストボックス3にデータを6桁入力しようとすると 6桁目にオーバーフローエラーが出ます。 このプログラムの何処がおかしいのでしょうか? Private Sub TextBox3_Change() Dim Number As Integer If TextBox3.Value <> "" Then '空じゃない場合 Number = TextBox3.Value Call 検索(Number) MsgBox TextBox3.Value End If End Sub Sub 検索(ByVal Number As Variant) Dim FoundCell As Range Set FoundCell = Range("A:A").Cells.Find(What:=Number, lookat:=xlPart) If FoundCell Is Nothing Then Else FoundCell.Activate Range("O" & ActiveCell.Row).Value = "みーつけた!" End If End Sub

  • Excel VBA テキストボックスに当日の日付

    Excel 2013において、VBAで入力フォームを作成中の初心者です。 入力フォームの中に日付の項目があり、テキストボックスに手入力しています。 そのテキストボックスに当日の日付を自動で表示させたく、ネットで調べ試しましたが、うまくいきません。 やりたいこととしては、テキストボックスに今日の日付を自動的に和暦で表示させ、その日付を変更する場合には、「2016-12-03」などと入力後、和暦に自動的に変換して表示させたいのです。 手入力において、「2016-12-03」と入力後、自動的に和暦に変換するコードはネットで見つけることができ、うまくいったのですが、当日の日付を自動的に表示させる方法がわからずにおります。 日付を手入力後、和暦で表示させるコードは以下のようにしてあります。 Private Sub textbox1_AfterUpdate() With Me.textbox1 If IsDate(.Value) Then .Value = Format(.Value, "ggge年m月d日") End If End With End Sub どなたか、教えていただけると助かります。 よろしくお願いいたします。

  • エクセルVBA テキストボックスへのセットフォーカスについて

    エクセルVBAでユーザーフォーム内に配置されたテキストボックス への数値の入力時に、指定範囲内になければメッセージボックスで 規格外であることを警告し、その規格外が入力されたテキストボックス を強制的に空欄にし、次のテキストボックスにフォーカスを移動させずに、入力間違いのテキストボックスにフォーカスを戻したいのですが どうすればよいのでしょうか? 自分で考えた構文です。 Private Sub TextBox1_AfterUpdate() Dim A As Single A = TextBox1.Text If A < 1.99 Or A > 3.00 Then MsgBox "規格外!!"     TextBox1.Text = "" TextBox1.SetFoucus End If Exit Sub End Sub これですと、次のテキストボックスにフォーカスが移動してしまいます。 次のテキストボックスにフォーカスを移動させずに、規格内の値が 入力されるまでフォーカスを移動させない方法を教えて下さい。 お願い致します。

  • エクセル VBA ID入力について

    TextBox2に数字をIDを入力して 名前をComboBox1.Text に表示させるようにしました。 しかし、数字入力すると認識される物もあるのですが 表示されない=数字の値は同じ数字 なぜなのでしょうか? Private Sub TextBox2_Change() Dim vRet As Variant vRet = Application.VLookup(TextBox2.Text, _ Sheets("マスタ").Range("A:B"), _ 2, _ False) If VarType(vRet) <> vbError Then ComboBox1.Text = vRet Else ComboBox1.Text = "<< 該当なし >>" End If End Sub Private Sub UserForm_Initialize() With TextBox2 .SetFocus .Text = "ID入力"  .SelLength = Len(.Text) End With 教えて下さい!Sheet2の数字の書式が問題なのでしょうか?

専門家に質問してみよう