こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBの問題です

VBの条件判断の応用問題
大学の情報の問題でヒントをもらいやってみたのですがうまくできません。自分でやったものをのせたのでどこがどのように間違えているか指摘してもらえるとありがたいです。

東京都水道局では23区内の水道料金(月額)を水道管の口径(以下で呼び径と記述)と月の水道使用料により、次の表に基づいて計算する。水道管の呼び径の番号と水道使用量を性数値で入力すると、次表と計算式に従い、次のページの仕様を満たす水道料金計算のプログラムを作れ。

申し訳ないのですが
表をのせられなかったのでこちらから参照してください
http://www.waterworks.metro.tokyo.jp/life/r_keisan.htm
水道料金一か月の表の一般用の部分です

計算式 (基本料金+従量料金)*1.05(1円未満の端数は切り捨て)

【プログラムの仕様】
1.呼び径は(1)13mm、(2)20mm、・・・(12)300mm以上の中から該当する番号を、水道使用量は㎥単位で整数値を、どちらもInputbox関数で取得する。呼び径番号取得ではInputboxに番号と呼び径の対応関係を表示せよ。この際、表示文字列を複数部分に分割して、行末を文字列連結演算子と継続指定「 & _ 」することにより複数行で記述する。

2.入力された水道管の呼び径を番号をもちいてSelectCase構文で基本料金を決定する。

3.従量料金のけいさんでは、まずどの呼び径の料金区分で計算するかをSelectCase構文またはIf文で決定して、各区分の料金表の単価を使用量の各増分に適用して、増分毎の料金を求めて積算する。例にも示した(2)の呼び径の場合は、使用量を複数の増分に分けて、1~5;、6~10、11~20、21~30、・・・、1001以上の各増分に異なる単価を適用する。

4.基本料金と従量料金の合計金額に消費税を加えたものが水道料金となる。この計算を行うと小数点以下の金額を切り捨てるため、Int関数の引数に計算式を書き入れ、その関数値を整数型変数に代入すればよい。
  数字に単位が付いてませんがm^3です


Sub ex51() '問題5
Dim x As Integer, y As Integer, z As Integer

x = InputBox("呼び径を丸番号の数字で選択してください。  " & _
"(1) 13mm (2) 20mm (3) 25mm      " & _
"(4) 30mm (5) 40mm (6) 50mm      " & _
"(7) 75mm (8) 100mm (9) 150mm     " & _
"(10) 200mm (11) 250mm (12) 300mm以上    ")
y = InputBox("今月の水道使用量を立法メートル単位で入力してください。")

Select Case x

Case ((1)) '13mm
基本料金 = 860

Case ((2)) '20mm
基本料金 = 1170

Case ((3)) '25mm
基本料金 = 1460

Case ((4)) '30mm
基本料金 = 3435

Case ((5)) '40mm
基本料金 = 6865

Case ((6)) '50mm
基本料金 = 20720

Case ((7)) '75mm
基本料金 = 45623

Case ((8)) '100mm
基本料金 = 94568

Case ((9)) '150mm
基本料金 = 159094

Case ((10)) '200mm
基本料金 = 349434

Case ((11)) '250mm
基本料金 = 480135

Case ((12)) '300mm以上
基本料金 = 816145
End Select

Select Case ((1)、(2)、(3))
If y = 1 < 5 Then
z = 0 * y
If y = 6 < 10 Then
z = 22 * y
If y = 11 < 20 Then
z = 128 * y
If y = 21 < 30 Then
z = 163 * y
If y = 31 < 50 Then
z = 202 * y
If y = 51 < 100 Then
z = 213 * y
If y = 101 < 200 Then
z = 298 * y
If y = 201 < 1000 Then
z = 372 * y
Else
z = 404 * 1000
End If

Select Case ((4)、(5))
If y = 1 < 100 Then
z = 213 * y
If y = 101 < 200 Then
z = 298 * y
If y = 201 < 1000 Then
z = 372 * y
Else
z = 404 * y

Select Case ((6)、(7))
If y = 1 < 1000 Then
z = 372 * y
Else
z = 404 * y

Select Case ((8)、(9)、(10)、(11)、(12))
z = 404 * y


MsgBox ”水道料金=”int((x+z)*1.05)

End Sub

投稿日時 - 2007-11-27 12:58:11

QNo.3550857

すぐに回答ほしいです

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

前回の質問のurlも書いた方が良かったのでは?
http://oshiete1.goo.ne.jp/qa3538377.html

inputbox で「呼び径を丸番号の数字で選択してください。」と書いてありながら、case 文では "((1))" なんて無意味な構文になってます。
文字なら、case "(1)" とすべきで、数値なら case 1 です。

>Select Case ((1)、(2)、(3))

の部分は、使い方が間違っているのでVBEで構文チェックしていれば赤色でエラー表示になっているかと思います。

If x=1 or x=2 or x=3 then ・・・で判断する方が良いでしょう。

料金計算もHPとは計算方法が全く違っていますね。
使用量が25立方なら、
基本料金(5立方まで)
+ 5立方*(6~10立方の料金)
+10立方*(10~20立方の料金)
+ 5立方*(21~30立方の料金)
という計算式になりますが、IF文を組み合わせて使えば計算が出来ます。

If y > 5 Then
If y < 11 Then
z = (y - 5) * 22
Else
z = 5 * 22
If y < 21 Then
z = z + ((y - 10) * 128)
Else
z = z + (10 * 128)
If y < 31 Then
':
End If
End If
End If
End If

投稿日時 - 2007-11-27 13:46:30

補足

Sub ex51() '問題5
Dim x As Integer, y As Integer, z As Integer, 基本料金 As String

x = InputBox("呼び径を丸番号の数字で選択してください。  " & _
"(1) 13mm (2) 20mm (3) 25mm      " & _
"(4) 30mm (5) 40mm (6) 50mm      " & _
"(7) 75mm (8) 100mm (9) 150mm     " & _
"(10) 200mm (11) 250mm (12) 300mm以上    ")
y = InputBox("今月の水道使用量を立法メートル単位で入力してください。")

Select Case x

Case "(1)" '13mm
基本料金 = 860

Case "(2)" '20mm
基本料金 = 1170

Case "(3)" '25mm
基本料金 = 1460

Case "(4)" '30mm
基本料金 = 3435

Case "(5)" '40mm
基本料金 = 6865

Case "(6)" '50mm
基本料金 = 20720

Case "(7)" '75mm
基本料金 = 45623

Case "(8)" '100mm
基本料金 = 94568

Case "(9)" '150mm
基本料金 = 159094

Case "(10)" '200mm
基本料金 = 349434

Case "(11)" '250mm
基本料金 = 480135

Case "(12)" '300mm以上
基本料金 = 816145
End Select

If x = "(1)" Or x = "(2)" Or x = "(3)" Then
If y > 5 Then
If y < 11 Then
z = (y - 5) * 22
Else
z = 5 * 22

If y < 21 Then
z = z + ((y - 10) * 128)
Else
z = z + (10 * 128)

If y < 31 Then
z = z + ((y - 20) * 163)
Else
z = z + (20 * 163)

If y < 51 Then
z = z + ((y - 30) * 202)
Else
z = z + (30 * 202)

If y < 101 Then
z = z + ((y - 50) * 213)
Else
z = z + (50 * 213)

If y < 201 Then
z = z + ((y - 100) * 298)
Else
z = z + (100 * 298)

If y < 1001 Then
z = z + ((y - 200) * 372)
Else
z = z + (200 * 372)

If y > 1001 Then
z = z + ((y - 1000) * 404)
Else
z = z + (1000 * 404)
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If

If x = "(4)" Or x = "(5)" Then
If y > 1 Then
If y < 101 Then
z = (y - 5) * 213
Else
z = 5 * 213

If y < 201 Then
z = z + ((y - 100) * 298)
Else
z = z + (100 * 298)

If y < 1001 Then
z = z + ((y - 200) * 372)
Else
z = z + (200 * 372)

If y > 1001 Then
z = z + ((y - 1000) * 404)
Else
z = z + (1000 * 404)

End If
End If
End If
End If
End If
End If

If x = "(6)" Or x = "(7)" Then
If y > 1 Then
If y < 1001 Then
z = (y - 5) * 372
Else
z = 5 * 372

If y < 1001 Then
z = z + (y - 1000) * 404
Else
z = z + (1000 * 404)

End If
End If
End If
End If

If x = "(8)" Or x = "(9)" Or x = "(10)" Or x = "(11)" Or x = "(12)" Then
If y < 1 Then
z = 5 * 404
Else
z = 5 * 404
End If
End If

msgbox "水道料金=" int((基本料金+z)*1.05)


End Sub

こんな風にしたんですが最後のほうの計算があやしいんですが
どんな感じで間違ってますかね?
あと最初のXのINPUTBOXと最後の計算式がうまくできないんですが
うまくできる方法ありますか?
回答よろしくおねがいします。
ちなみに最初の"(1)"のカッコは丸1がうまく表示できなくてこうなりました。

投稿日時 - 2007-11-28 11:58:48

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

>変えてみたのですがinputboxまでしか実行できません。

プログラミングの基本で何を学んだのでしょうか?
自己解決できないレベルの問題でも無いと思いますが?

プログラムからすると、変数 x は文字型(String)にするのが適切かと思いますけど・・・。

投稿日時 - 2007-12-01 15:57:22

お礼

しっかりと学べていないです。

違うところをstring型で宣言していました。

実行はすべてできるようになりましたが
計算がうまくできていないので修正します。
最初から最後まで回答してくださり感謝しています。

投稿日時 - 2007-12-05 10:33:43

ANo.6

> やってみたらできたのですが型が合わないとしてエラーとなりました。

オーバーフローじゃないですか?

投稿日時 - 2007-11-29 14:18:06

補足

どうなんでしょうか。
よくわかんないです

投稿日時 - 2007-12-04 12:08:07

ANo.5

>基本料金の宣言が間違っているのでしょうか?

宣言が Integer ですから、扱える値の範囲に制限があります。
32,767を超える可能性がある場合は、別な型にしておく方が良いでしょう。

ヘルプより~
整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、-32,768 ~ 32,767 の範囲の値をとります。

長整数型 (Long) の変数は、32 ビット (4 バイト) の変数です。-2,147,483,648 ~ 2,147,483,647 の範囲

投稿日時 - 2007-11-29 14:09:50

補足

変えてみたのですがinputboxまでしか実行できません。

デバックしてみたら
Case "(1)" '13mm
の部分が黄色くなりました。

どこかちがうんですかね?

投稿日時 - 2007-12-01 13:43:31

ANo.4

>でも最後がどう直せばいいのかヘルプを参照してもできないんです。

MsgBox "文字の連結" & "が必用です。"

で、解りますか?

投稿日時 - 2007-11-29 12:10:33

補足

回答ありがとうございます。
わかります。やってみたらできたのですが型が合わないとしてエラーとなりました。
基本料金の宣言が間違っているのでしょうか?

Sub ex51() '問題5
Dim x As Integer, y As Integer, z As Integer, 基本料金 As Integer



x = InputBox("呼び径を丸番号の数字で選択してください。  " & _
"(1) 13mm (2) 20mm (3) 25mm      " & _
"(4) 30mm (5) 40mm (6) 50mm      " & _
"(7) 75mm (8) 100mm (9) 150mm     " & _
"(10) 200mm (11) 250mm (12) 300mm以上    ")
y = InputBox("今月の水道使用量を立法メートル単位で入力してください。")

Select Case x

Case "(1)" '13mm
基本料金 = 860

Case "(2)" '20mm
基本料金 = 1170

Case "(3)" '25mm
基本料金 = 1460

Case "(4)" '30mm
基本料金 = 3435

Case "(5)" '40mm
基本料金 = 6865

Case "(6)" '50mm
基本料金 = 20720

Case "(7)" '75mm
基本料金 = 45623

Case "(8)" '100mm
基本料金 = 94568

Case "(9)" '150mm
基本料金 = 159094

Case "(10)" '200mm
基本料金 = 349434

Case "(11)" '250mm
基本料金 = 480135

Case "(12)" '300mm以上
基本料金 = 816145
End Select

If x = "(1)" Or x = "(2)" Or x = "(3)" Then
If y > 5 Then
If y < 11 Then
z = (y - 5) * 22
Else
z = 5 * 22

If y < 21 Then
z = z + ((y - 10) * 128)
Else
z = z + (10 * 128)

If y < 31 Then
z = z + ((y - 20) * 163)
Else
z = z + (10 * 163)

If y < 51 Then
z = z + ((y - 30) * 202)
Else
z = z + (20 * 202)

If y < 101 Then
z = z + ((y - 50) * 213)
Else
z = z + (50 * 213)

If y < 201 Then
z = z + ((y - 100) * 298)
Else
z = z + (100 * 298)

If y < 1001 Then
z = z + ((y - 200) * 372)
Else
z = z + (800 * 372)

If y > 1001 Then
z = z + ((y - 1000) * 404)
Else
z = z + (y * 404)
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If

If x = "(4)" Or x = "(5)" Then
If y > 1 Then
If y < 101 Then
z = (y - 5) * 213
Else
z = 100 * 213

If y < 201 Then
z = z + ((y - 100) * 298)
Else
z = z + (100 * 298)

If y < 1001 Then
z = z + ((y - 200) * 372)
Else
z = z + (800 * 372)

If y > 1001 Then
z = z + ((y - 1000) * 404)
Else
z = z + (y * 404)

End If
End If
End If
End If
End If
End If

If x = "(6)" Or x = "(7)" Then
If y > 1 Then
If y < 1001 Then
z = (y - 5) * 372
Else
z = 1000 * 372

If y < 1001 Then
z = z + (y - 1000) * 404
Else
z = z + (y * 404)

End If
End If
End If
End If

If x = "(8)" Or x = "(9)" Or x = "(10)" Or x = "(11)" Or x = "(12)" Then
z = y * 404
End If

MsgBox "水道料金=" & Int((基本料金 + z) * 1.05)
End Sub

投稿日時 - 2007-11-29 13:07:44

ANo.3

>ちなみに最初の"(1)"のカッコは丸1がうまく表示できなくてこうなりました。

単純な入力の場合には、わざわざ全角入力を強要しない方が良いでしょう。
使う立場からすると任意の数値を入れるだけの方が操作も早いですからね。

>どんな感じで間違ってますかね?

誤りの一例です。
「z = z + (20 * 163)」
となっていますが、20 * 163 の部分で何の計算をしているのか理解できれば、正しく修正できます。
・・・単価が163円で計算できるのは何立方でしょうか?

>msgbox "水道料金=" int((基本料金+z)*1.05)

もVBEではエラー表示になっていますね。
この程度なら簡単に直せるでしょう。


あと、
If x = "(1)" Or ・・・ Then
EndIf
If x = "(4)" Or ・・・ Then
EndIf



と複数のIF文に分けていますが、
If x = "(1)" Or ・・・ Then
'処理
ElseIf x = "(4)" Or ・・・ Then
'処理
ElseIf x = ・・・ Then
'処理

Else
'処理
EndIf

のようにした方が良いと思います。

投稿日時 - 2007-11-28 14:30:15

補足

回答ありがとうございます。
従量料金の方は理解できたとおもいます。
でも最後がどう直せばいいのかヘルプを参照しても
できないんです。
全文が間違っているのですかね?

msgbox"水道料金=" Int((基本料金+z)*1.05)

投稿日時 - 2007-11-29 11:32:30

ANo.1

このコードで実行してみましたか?
ほとんどエラーで実行できないと思いますよ

if文は
if 条件 then
  実行文
end if
が基本です

相反する条件なら
if 条件 then
  実行文1
else
  実行文2
end if
といった構文です

単一文のみに関わるIf文なら
if 条件 then 実行文
となります

『if y=1 < 100 then』 がどのような評価を期待したものでしょう
yが1以上100未満の場合に真になることを期待したのであればこの書き方では期待通りの実行は望めません
y>=1 and y < 100 といった条件になります

また選択の select caseには 必ず何処までが選択処理なのかを示す end selectが必要です
select caseや caseの引数に ()は今回のケースでは必要ありません
select caseの引数には一般的に変数を割り当てます
caseの引数には定数を設定するのが一般的です

問題文全てを載せるより もっと的を絞った質問をしましょう
VB6付属のヘルプ MSDNなどを活用してエラーになる原因を特定しデバッグしましょうね

投稿日時 - 2007-11-27 13:23:40

お礼

回答ありがとうございます。
少しずつ理解できてきています。
完成までよろしくおねがいします。

投稿日時 - 2007-11-29 11:59:12

あなたにオススメの質問