プロが教える店舗&オフィスのセキュリティ対策術

エクセル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内に
入力できなくなってしまいます。
小数点が再度入力できる方法は存在するでしょうか?

以上です。
色々と調べてみたのですが、見つからず、質問させていただきました。
よろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

こんにちは。
回答ありがとうございます。

なるほど、「if int(X) = X」と行えば
すっきりするんですね。
ありがとうございます。
勉強になります。

他にも変更・照会のフォームがたくさんあるので、
上記サブルーチンを参考にさせていただきます。

基本的な質問をしてもよいでしょうか?
サブルーチンは「標準モジュール」に記入してもよいのでしょうか?
すみません。やってみればわかりますよね。
努力してみます。

本当にありがとうございます。

お礼日時:2009/01/19 14:15

こんにちは。



>今回の質問は以前に出されていたのでしょうか?

似たような質問は、時々みます。私は、Visual Basic 6 のテキストですが、Formの基本問題に出てくるようですね。

>クラスは苦手で。。。勉強します。
こういうことは、教わらないとできないですね。
    • good
    • 0

こんにちは。



UserFormが、複数ある場合や、コードが大きい場合は、「標準モジュール」になりますが、今回のレベルなら、そのまま、UserForm モジュールでよいと思います。

ただ、今回、ちょっと考えたのは、あまり数が多いと、クラスで設定したほうが良いかもしれない、と思いました。

なお、今回の質問は、テキストでやったことがあります。その時に、いっしょに出てくるのは、Val 関数とCDbl や CLng関数ですが、その違いは分かりますか?
    • good
    • 0
この回答へのお礼

本当にありがとうございます。
いくつかのフォームで使うため、「標準モジュール」に設定し、
うまくいきました。
クラスは苦手で。。。勉強します。

今回の質問は以前に出されていたのでしょうか?
すみません。見たつもりだったのですが。。。

CDbl等については全然知りません。
今、インターネットでちらっと見てみました。
勉強いたします。

本当にありがとうございます。
これからもよろしくお願いします。
なんて、言ったらご迷惑ですよね。

ありがとうございます。

お礼日時:2009/01/19 14:38

mytxt.Text = Format(mytxt.Text, "#,##0.0")


上記のみでなにか不都合が起こるのでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

私の説明不足だったのですが、
小数点のある場合と、ない場合とで
出力方法を変えようと思っていたのです。

説明不足ですみません。。。
回答ありがとうございます。

お礼日時:2009/01/19 14:08

小数点”.”がテキストに含まれているかどうかで、判断するというのとは違うのでしょうか?



まず、どのように入力したものをどのように表示したいとか、具体例をあげたほうが
わかりやすいかもです。

”含まれる”というのなら、
InStr関数 
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/f …
で返り値が0か1以上かで判断できるかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

わかりにくい質問ですみません。。。
入力 1000 → 出力 1,000
入力 1000.5 → 出力 1,000.5
としたかったです。
n-junさんのやり方で行ったところきちんと出力されました。
ありがとうございます。
ロジックもすっきりしました。

2.の小数点の入力については、
TextBoxのChangeで行っていたところを、
TextBoxのExitでformatしたら、小数点もきれいに
入力できました。

本当にありがとうございました!

お礼日時:2009/01/19 14:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!