• ベストアンサー

VBA If~Thenの記述

御教示お願い致します。 ダイアログで売上表に入力する時(数量*単価=金額 計算時)、金額欄の処理を下記のように処理をしたく、試行錯誤しましたが完成出来ません。 得意先マスターのQ列に入力してある、端数処理のコード(1~3)によって処理をしたい 1:円未満四捨五入 2:円未満切捨て 3:円未満切り上げ Private Sub tannka_Change() '金額計算 Dim trg As Range Set trg = Workbooks("マスター.xls").Worksheets("得意先マスター") _ .Range("Q:Q").Find(what:=hasuu.Text, _ LookIn:=xlValues, lookat:=xlWhole) If trg = 1 Then kinngaku.Text = Round(CDec(suu.Text) * CDec(tannka.Text)) Else End If End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 質問から読ませていただきましたが、#4/5さんのご指摘のように、それは、きちんとした説明がない限りは、サンプルコードとしては書けても、実務レベルの内容は難しいです。おまけに、どこかのテキストをみて、コントロール・オブジェクトの名称まで変えてしまっていますから、それを、#3さんのサンプルコードを書き換えて使うというには、それに技術が伴わないようです。 なお、あくまでも、コマンドボタンの使用を否定しているようにお見受けしています。したがって、私としては、KeyDown イベントを用いるしかないように思います。Change イベントでは、入力している最中にコードが働いてしまいます。 #3の補足のコードを参考にしてみました。 Private Sub tannka_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)   If KeyCode = 13 Then 'Enterキーによって実行     Dim r As Range     Dim i As Variant     Dim tanka As Currency, suji As Currency     Set r = Workbooks("マスター.xls").Worksheets("得意先マスター").Columns(4).Find( _       what:=tokukoudo.Text, _       LookIn:=xlValues, _       lookat:=xlWhole)       If r Is Nothing Then 'マスタが見つからないときの処理       MsgBox "得意先マスタに該当なし"       Exit Sub     Else       tanka = Val(tannka.Text)       suji = Val(suu.Text)     End If     i = Workbooks("マスター.xls").Worksheets("得意先マスター").Cells(r.Row, "Q").Value     Select Case i       Case Is = 1 'TextBox4が金額         kinngaku.Text = Format$(WorksheetFunction.Round(suji * tanka, 0), "#,##0")       Case Is = 2         kinngaku.Text = Format$(WorksheetFunction.RoundDown(suji * tanka, 0), "#,##0")       Case Is = 3         kinngaku.Text = Format$(WorksheetFunction.RoundUp(suji * tanka, 0), "#,##0")       Case Else         kinngaku.Text = "要検査"     End Select   End If End Sub

isekaoru
質問者

お礼

Wendy02様 要領の得ない質問に対し、問題点をご推察いただいての、御指導ありがとうございます。 思い通り出来ましたありがとうございました。 >それに技術が伴わないようです。 ●恥ずかしながら、ご指摘の通りです。 それ故に、要領を得ない質問内容となってしまいます。 >専門は、まったく違いますが、趣味だからこそ書けるものもあります。 ●私は、ボケ防止のため(68歳の無職)に勉強しております。 今回は自分で課題を作成して勉強しています。 最後は、まるなげしているような質問になってしまいますが、それまでには相当の時間を費やして試行錯誤しています。 >度重なるマナーの悪い方がいます ●問題があるようでしたら、御指摘お願い致します。 ★マクロの記録を利用し、本やヘルプを参照して勉強していますが、この課題も解決出来ないものが多々あります。 今後も、御指導いただく為に質問をさせていただきますので、「isekaoru」を見ましたら事情御賢察の上御指導宜しく御願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。 #6の回答者です。 >●私は、ボケ防止のため(68歳の無職)に勉強しております。 私の知り合いの人たちの年代と、そう変わらないです。 でも、掲示板には、年齢は関係がありません。相手の人たちが皆若い人たちだと思うと、そうでない人たちもいます。ここの常連さんでも、かなり年齢の上かと思わせる内容の人がいます。若い人もいれば、そうでない人もいます。日経の記事に、Excel-表計算の達人というのは、だいたいは50代以上で、そういう人たちが早期退職して、企業では、その抜けた穴の補充が利かないという話もあるぐらいです。 1980年の初めの頃からコンピュータを扱って、場合によれば、Basic からニーモニックを扱ってきた人たちと、1992年以降のWindows が最初の人では、知識も技術も差があって当然です。私の出会った人には、コンピュータを作るところから始めて、ほとんど、すべてのプログラミング言語を扱える人さえいます。私は、Windowsさえ扱うことになるなんて思っていなかったです。 Excelのマクロの勉強で、最初の半年ぐらいは、テキストどおり、他には手を出さないで段階的に一つずつ、レベルを上げていくのがよいです。出来るだけ基本どおりに進めたほうがよいです。いきなり、難しいことをやって、出来ない、分からないので掲示板で聞くというスタイルだと、なかなか上達できません。 例えば、ワークシート関数をVBAで用いるというのは、実務的には頻繁にあっても、トレーニングの段階では、理由はいくつかあるのですが、上級に入ります。イベント・ドリブン型マクロも、なかなか意味が理解しにくいです。テキストの選び方も大事だと思います。

isekaoru
質問者

お礼

Wendy02様 長文の御返事感謝申し上げます。

すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

たとえば、次のようなことですか。 意図されていることとは違うかもしれないが・・・。 ユーザーフォームにリストボックス1つ、テキストボックスを3つ、コマンドボタン(OKボタンとCANCELボタン)2つをつくります。 リストボックス名をhasuu、テキストボックス名をそれぞれsuu、tannka、kinngakuとします。 hasuuには処理条件、suu、tannka、kinngakuには、それぞれ数、単価、金額が入るのですが、数と単価をを入力し、処理条件を選ぶと金額に処理条件に応じて計算された金額が入ります。 処理条件のソースはQ1:Q3に入れておきます。 つぎのコードを貼り付けて実行(testを実行)してみてください。 UserFormのコードに貼り付け。 Private Sub cancel_Click() UserForm1.Hide End Sub Private Sub OK_Click() kgkeisan End Sub Private Sub UserForm_Initialize() hasuu.ColumnCount = 3 hasuu.RowSource = "Q1:Q3" kinngaku.Text = 0 suu.Text = 0 tannka.Text = 0 End Sub 以下、標準モジュール(module1)に貼り付け。 Sub test() UserForm1.Show End Sub Sub kgkeisan() With UserForm1 hli = .hasuu.ListIndex kintx = .suu.Text * .tannka.Text MsgBox kintx Select Case hli Case 0 kintx = Int(kintx + 0.5) Case 1 kintx = Int(kintx) Case 2 kintx = Int(kintx) + 1 Case Else MsgBox "計算できない" kintx = "--" End Select .kinngaku.Text = kintx End With End Sub

isekaoru
質問者

お礼

okormazd様 試行錯誤し遅くなりましたがありがとうございました。 これからも、宜しく御願いいたします。

すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

完成できないと思います。 まず、何をどうしたいのか明確ではありません。 書いてあるコードの前提がどうなのかわかりません。 コードが変だ。 hasuu.Text kinngaku.Text suu.Text tannka.Text これらは何なのでしょう。

すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

>得意先マスターのQ列に入力してある、端数処理のコード(1~3)によって処理をしたい >Set trg = Workbooks("マスター.xls").Worksheets("得意先マスター") _ >.Range("Q:Q").Find(what:=hasuu.Text, LookIn:=xlValues, lookat:=xlWhole) 実際の画面を見ないとわかりませんが、ちょっと変ですね。得意先マスターをFindメソッドで検索するなら、 「what:=hasuu.Text」で検索するのは正しいですか? .Range("A:A").Find(what:=Kokyaku.Text, なら何となくわかりますが… 全く的外れかもしれませんが、TextBoxで入力された顧客名で「得意先マスター」シートのA列を検索し、Q列のコード(1~3)で処理を変えるマクロサンプルを書きます。意図と合っていなかったら読み飛ばしてください Private Sub CommandButton1_Click() Dim r As Range Dim tanka, suryo As Single   Set r = Sheets("Sheet1").Columns(1).Find(what:=TextBox1.Text, LookIn:=xlValues, lookat:=xlWhole)   If r Is Nothing Then 'マスタが見つからないときの処理     MsgBox "得意先マスタに該当なし"   Else  'マスタが見つかったとき     If IsNumeric(TextBox2.Text) Then 'TextBox2が単価       tanka = CDbl(TextBox2.Text) '数字と見なせるとき数値に変換     End If     If IsNumeric(TextBox3.Text) Then 'TextBox3が数量       suryo = CDbl(TextBox3.Text)     End If     Select Case Sheets("Sheet1").Cells(r.Row, "Q").Value     Case Is = 1  'TextBox4が金額       TextBox4.Text = Str(WorksheetFunction.Round(tanka * suryo, 0))     Case Is = 2       TextBox4.Text = Str(WorksheetFunction.RoundDown(tanka * suryo, 0))     Case Is = 3       TextBox4.Text = Str(WorksheetFunction.RoundUp(tanka * suryo, 0))     Case Else       TextBox4.Text = "マスタ区分不正"     End Select   End If End Sub

isekaoru
質問者

補足

zap35様 他の方からは変だとご指摘の質問に対し、大変お手数のかかる御丁寧な御指導本当にありがとうございました。 心より御礼申し上げます。 記述いただきましたマクロサンプルもあまり理解できないまま下記のように置換えさせていただきました。 第一法 (1)では思い通り出来ました。 第二法 数量*単価=金額 計算時に即金額を表示したいので、(1)の部分を(2)に変えました。 その結果 修飾子が不正のメッセージが表示され If IsNumeric(suu.Text) Then の suu が青くぬられています。 其の他に、型があわないと表示された場合がありました。 ●数量・単価は小数点以下2桁ほど使用します。 ★御願い 御指導いただきたいとは思いますが、勉強を始めたばかりの、68歳の老人です。 約8時間かかってこの程度です。 これ以上付き合うのは無理だと思われましたら、質問の締め切りも御座いますので、ご遠慮なく打ち切る旨だけ、御連絡お願い致します。 (1)Private Sub CommandButton4_Click()    (2)Private Sub tannka_Change() '金額計算 Dim r As Range Dim tanka, suu As Single Set r = Workbooks("マスター.xls").Worksheets("得意先マスター") _ .Columns(4).Find(what:=tokukoudo.Text, LookIn:=xlValues, lookat:=xlWhole) If r Is Nothing Then 'マスタが見つからないときの処理 MsgBox "得意先マスタに該当なし" Else 'マスタが見つかったとき If IsNumeric(tannka.Text) Then 'TextBox2が単価 tanka = CDbl(tannka.Text) '数字と見なせるとき数値に変換 End If If IsNumeric(suu.Text) Then 'TextBox3が数量 suu = CDbl(suu.Text) End If Select Case Workbooks("マスター.xls").Worksheets("得意先マスター").Cells(r.Row, "Q").Value Case Is = 1 'TextBox4が金額 kinngaku.Text = Str(WorksheetFunction.Round(suu * tannka, 0)) Case Is = 2 kinngaku.Text = Str(WorksheetFunction.RoundDown(suu * tannka, 0)) Case Is = 3 kinngaku.Text = Str(WorksheetFunction.RoundUp(suu * tannka, 0)) Case Else kinngaku.Text = "マスタ区分不正" End Select End If 'End Sub

すると、全ての回答が全文表示されます。
回答No.2

VBで四捨五入する方法を書き忘れました。

参考URL:
http://snyc.s28.xrea.com/contents/002.htm
isekaoru
質問者

お礼

grghbdjujf様 二度にわたり御指導ありがとうございました。 お気に入りに追加しました。

すると、全ての回答が全文表示されます。
回答No.1

まず、VBのRound関数は四捨五入ではありません。 四捨五入については参考URLをご参照ください。 WorksheetFunctionというクラスを使うとエクセルのワークシート関数がVBで使えるようになります。 四捨五入 WorksheetFunction.Round 切り上げ関数 WorksheetFunction.RoundUp 切り捨て関数 WorksheetFunction.RoundDown

すると、全ての回答が全文表示されます。

関連するQ&A