dポイントプレゼントキャンペーン実施中!

支払金額TextBoxAがあり、
控除金額用TextBox1~10に金額を入力してその控除合計をTextBoxSumに反映させ、
TextBoxBにはA-Sumの金額が返って来ます。

TextBoxBがマイナスの値になる場合もあり、
それはきちんとマイナスの値が返ってきますが、

TextBox1~10にマイナスの”-”を入力すると添付画像のように
”実行時エラー 13 型が一致しません”と表示され、


Public Function CCurEx(ByVal strText As String) As Currency
strText = Trim(strText)
If Len(strText) = 0 Then
CCurEx = 0
Else
CCurEx = CCur(strText)
End If
End Function

コード内のCCurEx = CCur(strText)の部分が黄色く反転します。

このエラーが出ないようにするにはどのようにすれば修正出来ますでしょうか?
よろしくお願いいたします。

「【エクセル】TextBoxにマイナスの値」の質問画像

質問者からの補足コメント

  • こんばんは、いつもありがとうございます。

    ご提案の通りに書き直してみました。
    マイナスを入力してもエラーは出なくなりましたが、
    添付画像の青枠(TextBoxB)と赤枠(TextBoxSum)のところに数値が返って来なくなりました。
    恐れ入りますが、その対処方法もご教授いただけませんでしょうか?
    よろしくお願いいたします。

    「【エクセル】TextBoxにマイナスの値」の補足画像1
    No.3の回答に寄せられた補足コメントです。 補足日時:2017/01/13 22:52
  • このように書いてます。

    Private Sub TextBoxSum_Change()
    TextBoxSum.Value = Format(TextBoxSum.Value, "#,###") 
    TextBox1 = Format(TextBox1, "#,###") 
    ’(省略、以下10まで)
    End If

    Private Sub TextBoxB_AfterUpdate()
    If TextBoxB.Value = "" Then Exit Sub
    Me.TextBoxB.Value = CCurEx(Me.TextBoxA.Value) - (CCurEx(Me.TextBox1.Value) + ’(中略) + CCurEx(Me.TextBox10.Value))
    TextBoxA.Value = Format(TextBoxA, "#,###")
    End Sub

    No.4の回答に寄せられた補足コメントです。 補足日時:2017/01/14 00:05
  • ①②のご指摘仰るとおりです
    Me.TextKingakuSum.Value = CCurEx(Me.TextKingaku1.Value) + (中略) + CCurEx(Me.TextKingaku10.Value)
    Me.TextSoukin.Value = CCurEx(Me.TextYachin2.Value) - (CCurEx(Me.TextKingaku1.Value)+ (中略) + CCurEx(Me.TextKingaku10.Value))
    Me.TextKingakuSum.Value = Format(TextKingakuSum, "#,###")
    Me.TextSoukin.Value = Format(TextSoukin, "#,###")
    (中略) 部には2~9が入り、
    Box1がKingaku1、Yachin2がA、SoukinがBに該当します

    No.5の回答に寄せられた補足コメントです。 補足日時:2017/01/16 10:15

A 回答 (7件)

No5です。


すみません。全体像が把握できない為、想像になります。
入力された金額をカンマ","を付けて編集しているため、それでエラーになっているように見えます。
以下のようにかえてみてはいかがでしょうか。
---------------------------------------------------------
Public Function CCurEx(ByVal strtext As String) As Currency
strtext = Trim(strtext)
If IsNumeric(strtext) = True Then
CCurEx = CCur(strtext)
Else
CCurEx = 0
End If
End Function
    • good
    • 0
この回答へのお礼

こんにちは。
ありがとうございました。
上記に書き換えることで”-”も入力出来るようになりました。
数字の表示をカンマ付きで表示することにこだわりがありました。
助かりました。

お礼日時:2017/01/16 13:01

#1の回答者ですが、IMEMode プロパティの方は試されなかったのですね。


最近、私の書いている内容が良く分からないという理由から、ここではボツされることが多くなってきました。ただ、今、VBAは、変わる可能性もあるのではないかと思いますから、なるべく、それなりの変化には敏感になりながら、VBAの勉強するのがよいのではないかと思います。

本題に入りますが、そもそもの原因が分からないので、そういう方法を取ったのですが、入力値の数値を検査するだけなら、IsNumeric という関数もあるし、Val関数もありますが、どうも私の出る幕ではなさそうな気がしてきます。符号を正規のものにするなら、Replace関数などもありますが、元に何を入れたか分からない状態では、難しいです。Replace メソッド側には、曖昧変換があるはずですが、それを利用するのもややこしいです。単に、入力する側で統一させればよいだけなのですから。もしも、正規表現でヒットするなら、符号は適当に判定させて、その次の値をそのまま数値を取り出せばよいと思います。

それはともかく、一応、こちらの全体的な考えだけを提示しておきます。

>青枠(TextBoxB)と赤枠(TextBoxSum)のところに数値が返って来なくなりました。
「マイナス(-)」が正しい符号で入力されていないから、解決をしていないのではないでしょうか。一番濃厚なのは、全角のマイナスです。それは入力している当人しか分かりませんが、だから、TextBox で、入力制限でIME を起動させずに、入力を半角英数のみにさせようと考えたのですが、そういう考え方は、なぜダメなのか、私には、良く分かりませんね。

Replace関数を使うことは可能ですが、その前にすることがあります。

それと、小数点を扱うことはあるのでしょうか。
整数だけなら、CCur は不要ですが、一応残しました。こちらは、見ることはないのかもしれませんが、残しておきます。

>Me.TextBoxB.Value = CCurEx(Me.TextBoxA.Value) - (CCurEx(Me.TextBox1.Value) + ’(中略) + CCurEx(Me.TextBox10.Value))

例えば、TextBox10 まで入れたら、起動するという方法もあると思いますね。
Private Sub TextBox10_AfterUpdate()
Dim i As Long, Total As Long
For i = 1 To 10
If Me.Controls("TextBox" & i).Value <> "" Then
  Total = Total + CCur(Me.Controls("TextBox" & i).Value)
End If
Next i
 If TextBoxA.Value <> "" Then
  TextBoxB.Text = Format$(CCur(TextBoxA.Value) - Total, "#,##0")
 End If
End Sub
    • good
    • 0

補足ありがとうございました。


補足をみると、
①TextBoxSum_Change()とありますが、
TextBoxSumに金額を直接入力することはないように思われます。

同様に、②TextBoxB_AfterUpdate()とありますが、
TextBoxBに金額を直接入力することはないように思われます。
金額を直接入力するのは、
TextBoxAとTextBox1~TextBox10なので、それらに入力されたとき、上記の①②のプロシージャ
を呼び出しているようにこちらからはみえます。(想像ですが)

確認のために、TextBoxAとTextBox1に金額を入力した時に動作するプロシージャ(TextBoxA_Change()等)があれば
それを提示していただけませんでしょうか。
若しくは、他に①②を呼び出している箇所があればそれを提示していただけませんでしょうか。
この回答への補足あり
    • good
    • 0

>マイナスを入力してもエラーは出なくなりましたが、


>添付画像の青枠(TextBoxB)と赤枠(TextBoxSum)のところに数値が返って来なくなりました。
>恐れ入りますが、その対処方法もご教授いただけませんでしょうか?

添付画像の青枠(TextBoxB)と赤枠(TextBoxSum)のところに数値を設定している箇所のソースを提示していただけませんでしょうか。こちらからは、その箇所が見えないので、現状では、何とも申し上げられません。
又、CCurExを呼び出している箇所も、ご提示ください。
この回答への補足あり
    • good
    • 0

以下のようにに変えてください。


strtextが数値に変換できない場合は0を設定します。(当然ですが全角の文字はエラーです)
-------------------------------------------
Public Function CCurEx(ByVal strText As String) As Currency
Dim regExp As Object '正規表現オブジェクト
Set regExp = CreateObject("VBScript.RegExp")
regExp.Pattern = "^(\+|\-)?\d+\.?\d*$"
strText = Trim(strText)
If regExp.Test(strText) = True Then
CCurEx = CCur(strText)
Else
CCurEx = 0
End If
End Function
この回答への補足あり
    • good
    • 0

>このエラーが出ないようにするにはどのようにすれば修正出来ますでしょうか?



"-"だけでは数値変換出来ませんからねぇ。

>If Len(strText) = 0 Then

の判定にもうちょい足して"-"の時はElse側に流れないようにする…ってところでしょう。
真面目にやると結構大変ですけど。
'-'以外の文字が入っていたら?
とか。

「VBA 例外処理」とかで見つかる方法で、エラー対処する。
という方法もありますが。
    • good
    • 0

こんにちは。



>エラーが出ないようにするには
TextBox に全角などの文字が入らないようにすることでしょうね。
Replace関数や想定しうる文字を正規表現で置換してもよいけれども、
TextBox そのものを英数しか入らないようにしたほうが楽でしょう。

まだ、アルファベットが入りますが、このようにすれば、多少は防げるはずです。手動でプロパティを変更したら、以下コードは不要です。

Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 10
 Me.Controls("TextBox" & i).IMEMode = fmIMEModeOff
Next i
End Sub
    • good
    • 0

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