- ベストアンサー
エクセル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内に 入力できなくなってしまいます。 小数点が再度入力できる方法は存在するでしょうか? 以上です。 色々と調べてみたのですが、見つからず、質問させていただきました。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 両方を兼ね揃えているコードは、こんな風にしたら、と思うのですが、質問のコードを見ると、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
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >今回の質問は以前に出されていたのでしょうか? 似たような質問は、時々みます。私は、Visual Basic 6 のテキストですが、Formの基本問題に出てくるようですね。 >クラスは苦手で。。。勉強します。 こういうことは、教わらないとできないですね。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 UserFormが、複数ある場合や、コードが大きい場合は、「標準モジュール」になりますが、今回のレベルなら、そのまま、UserForm モジュールでよいと思います。 ただ、今回、ちょっと考えたのは、あまり数が多いと、クラスで設定したほうが良いかもしれない、と思いました。 なお、今回の質問は、テキストでやったことがあります。その時に、いっしょに出てくるのは、Val 関数とCDbl や CLng関数ですが、その違いは分かりますか?
お礼
本当にありがとうございます。 いくつかのフォームで使うため、「標準モジュール」に設定し、 うまくいきました。 クラスは苦手で。。。勉強します。 今回の質問は以前に出されていたのでしょうか? すみません。見たつもりだったのですが。。。 CDbl等については全然知りません。 今、インターネットでちらっと見てみました。 勉強いたします。 本当にありがとうございます。 これからもよろしくお願いします。 なんて、言ったらご迷惑ですよね。 ありがとうございます。
- o_chi_chi
- ベストアンサー率45% (131/287)
mytxt.Text = Format(mytxt.Text, "#,##0.0") 上記のみでなにか不都合が起こるのでしょうか。
お礼
回答ありがとうございます。 私の説明不足だったのですが、 小数点のある場合と、ない場合とで 出力方法を変えようと思っていたのです。 説明不足ですみません。。。 回答ありがとうございます。
- n-jun
- ベストアンサー率33% (959/2873)
小数点”.”がテキストに含まれているかどうかで、判断するというのとは違うのでしょうか? まず、どのように入力したものをどのように表示したいとか、具体例をあげたほうが わかりやすいかもです。 ”含まれる”というのなら、 InStr関数 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/function/vba_string.html#instr で返り値が0か1以上かで判断できるかと。
お礼
回答ありがとうございます。 わかりにくい質問ですみません。。。 入力 1000 → 出力 1,000 入力 1000.5 → 出力 1,000.5 としたかったです。 n-junさんのやり方で行ったところきちんと出力されました。 ありがとうございます。 ロジックもすっきりしました。 2.の小数点の入力については、 TextBoxのChangeで行っていたところを、 TextBoxのExitでformatしたら、小数点もきれいに 入力できました。 本当にありがとうございました!
お礼
こんにちは。 回答ありがとうございます。 なるほど、「if int(X) = X」と行えば すっきりするんですね。 ありがとうございます。 勉強になります。 他にも変更・照会のフォームがたくさんあるので、 上記サブルーチンを参考にさせていただきます。 基本的な質問をしてもよいでしょうか? サブルーチンは「標準モジュール」に記入してもよいのでしょうか? すみません。やってみればわかりますよね。 努力してみます。 本当にありがとうございます。