アプリ版:「スタンプのみでお礼する」機能のリリースについて

何度もすみません。。

https://oshiete.goo.ne.jp/qa/13099267.html
で大変お世話になった者です。

回答くださった皆様のおかげで、無事小計を出すことが出来ました。
自分なりに調べ、次なる課題にチャレンジしているのですが早くも壁にぶつかり恐縮です。。

Textbox金額1~6まであり、1~3が仕入金額、4~6が売上金額となっています。
その仕入と売上の利益と利益率をラベルに表示したいです。

label利益1に TextBox4ーTextBox1
label利益2に TextBox5ーTextBox2
label利益3に TextBox6ーTextBox3

label利益率1に label利益1/TextBox4,"#.0%"
label利益率2に label利益2/TextBox5,"#.0%"
label利益率3に label利益3/TextBox6,"#.0%"

何度もお手数をおかけして申し訳ございません。。
どうぞよろしくお願いいたします。

A 回答 (5件)

あー。


Textbox の IME モードを設定しといた方がいいかもですね。
#4に追加で。

Private Sub UserForm_Initialize()
  TextBox1.IMEMode = fmIMEModeDisable
  TextBox2.IMEMode = fmIMEModeDisable
  TextBox3.IMEMode = fmIMEModeDisable
  TextBox4.IMEMode = fmIMEModeDisable
  TextBox5.IMEMode = fmIMEModeDisable
  TextBox6.IMEMode = fmIMEModeDisable
End Sub
    • good
    • 0

こんばんは。



前回ご質問の件含めてのサンプル。

1. 数字以外は入力できない(コピペも不可)様にしてます。
2. \マーク付きで数字をフォーマットしてます。

入力コントロールが6個程度、かつVBAビギナー(もう少し上かも)向けなのでベタで書きました。これ以上入力コントロールが増える様ならクラスモジュールを使ってイベントの共通化を行います。中級ぐらいのスキルが必要。

'↓ 以下 Userform1 にコピペ
'
Private Sub TextBox1_Change()
  Call FormatNum(TextBox1)
  Call calc
End Sub
Private Sub TextBox2_Change()
  Call FormatNum(TextBox2)
  Call calc
End Sub
Private Sub TextBox3_Change()
  Call FormatNum(TextBox3)
  Call calc
End Sub
Private Sub TextBox4_Change()
  Call FormatNum(TextBox4)
  Call calc
End Sub
Private Sub TextBox5_Change()
  Call FormatNum(TextBox5)
  Call calc
End Sub
Private Sub TextBox6_Change()
  Call FormatNum(TextBox6)
  Call calc
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Call KeyInputNumOnly(KeyCode)
End Sub
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Call KeyInputNumOnly(KeyCode)
End Sub
Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Call KeyInputNumOnly(KeyCode)
End Sub
Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Call KeyInputNumOnly(KeyCode)
End Sub
Private Sub TextBox5_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Call KeyInputNumOnly(KeyCode)
End Sub
Private Sub TextBox6_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Call KeyInputNumOnly(KeyCode)
End Sub

Private Sub calc()

  '利益額の計算 売上-仕入
  label利益1.Caption = Format$(NZ(TextBox4.Value) - NZ(TextBox1.Value), "\\#,##0")
  label利益2.Caption = Format$(NZ(TextBox5.Value) - NZ(TextBox2.Value), "\\#,##0")
  label利益3.Caption = Format$(NZ(TextBox6.Value) - NZ(TextBox3.Value), "\\#,##0")

  On Error Resume Next '簡易的 0除算の例外処理
  label利益率1.Caption = Format$(NZ(label利益1.Caption) / NZ(TextBox4.Value), "#.0%")
  label利益率2.Caption = Format$(NZ(label利益2.Caption) / NZ(TextBox5.Value), "#.0%")
  label利益率3.Caption = Format$(NZ(label利益3.Caption) / NZ(TextBox6.Value), "#.0%")

End Sub

Private Function NZ(arg As Variant) As Double
  NZ = 0
  On Error Resume Next
  NZ = CDbl(arg)
End Function

Private Sub FormatNum(ByVal ctrl As MSForms.TextBox)
  ctrl.Text = Format$(ctrl.Text, "\\#,##0")
End Sub

Private Sub KeyInputNumOnly(ByVal KeyCode As MSForms.ReturnInteger)

  '数字キーと制御キー以外は入力無効化する(Keycode=0にする)
  Select Case KeyCode
    Case vbKey0 To vbKey9, vbKeyNumpad0 To vbKeyNumpad9
    Case vbKeyLeft, vbKeyRight
    Case vbKeyBack, vbKeyDelete
    Case vbKeyReturn, vbKeySeparator, vbKeyTab
    Case Else: KeyCode = 0
  End Select

End Sub
    • good
    • 0

こんにちは。



Access の NZ みたいな関数を書いてみては?

function NZ(arg as variant) as double
  NZ = 0
  on error resume next
  NZ = cdbl(arg)
end function

それで、まとめて計算。
スマホで書くの辛いので同じような内容は省略してます。適当に直して下さい。

sub calc()
  label利益1.caption = format(NZ(TextBox4.value)-NZ(TextBox1.value), "#,##0")
  label利益2.caption = 省略
  label利益3.caption = 省略
  label利益率1.caption = ""
  label利益率2.caption = ""
  label利益率3.caption = ""
  on error resume next
  '0除算の例外処理は必要かな
  label利益率1.caption = format(NZ(label利益1.caption)/NZ(TextBox4.value), "#.0%")
  label利益率2.caption = 省略
  label利益率3,caption = 省略
end sub

あとは、Textbox1から6の afterupdateイベントで calc を呼び出します。

Private Sub TextBox1_AfterUpdate()
  Call calc
End Sub

動作確認してません。
    • good
    • 0

label利益1とlabel利益率1についてです。


利益2,3と利益率2,3は同じようにして作成してください。

Private Sub TextBox1_AfterUpdate()
Call set_rieki1
End Sub

Private Sub TextBox4_AfterUpdate()
Call set_rieki1
End Sub

Private Sub set_rieki1()
Dim shiire As Long: shiire = 0
Dim uriage As Long: uriage = 0
If IsNumeric(TextBox1.Value) And IsNumeric(TextBox4.Value) Then
shiire = CLng(TextBox1.Value)
uriage = CLng(TextBox4.Value)
If uriage <> 0 Then
Label利益1.Caption = uriage - shiire
Label利益率1 = Format(((uriage - shiire) / uriage), "#.0%")
End If
End If
End Sub
    • good
    • 0
この回答へのお礼

今回もご丁寧にご回答いただきありがとうございました。
コロナ陽性になりお礼が遅くなり申し訳ありません。。
まだちょっと試すことが出来てないので、試してまたご連絡いたします。

お礼日時:2022/08/28 08:58

リンク先は見てませんが先の質問/回答のやり取りでは、別に計算用の変数を準備し計算後に表示形式を変えてたと思いましたけど。


ようはその変数を増やしてそれぞれに代入し計算させれば宜しいのでは?

もし受け取った回答が理解できない内容であれば、その時にキチンと説明を受けておけば今回の応用は可能と思われます。
小出しにされるのって回答者は手間にしかならないですしね。

ただテキストボックスに値がない場合の回避ルートは必要でしょうけど、基本のIf文などで対応できるかも知れないですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
また、コロナ陽性になってしまい、お礼が遅くなりすみませんでした。。

おっしゃる通り、自身できちんと理解しながらやらねばと痛感しております。
そんな私にヒントや考え方を示してくださり本当にありがとうございました。

お礼日時:2022/08/28 07:51

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A