• ベストアンサー

エクセル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内に 入力できなくなってしまいます。 小数点が再度入力できる方法は存在するでしょうか? 以上です。 色々と調べてみたのですが、見つからず、質問させていただきました。 よろしくお願いいたします。

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

  • ベストアンサー
  • 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

専門家に質問してみよう