• ベストアンサー

ループと条件文を使って・・・

ループと条件文を使ってプログラムを作るのですが、 一日の食費と、何日間生活したいか を入力して、実行すると『○○○円の予算がかかる』というのを友達が作ってくれました。 (友達と一緒に課題を制作することになっているので) 食費を「en」、日数を「hi」、実行した後表示されるラベルを「ans」とすると、 コードは Private Sub Command1_Click() If en.Text="" And hi.Text="" Then ans="数字を入力して下さい" Else       e=en.Text h=hi.Text If IsNumeric(e) And IsNumeric(h) Then For i=1 to h Kotae=kotae + e Next ans="あなたが"& e &"円の食事を"& h &"日間食べるには、"& kotae &"円の予算がかかる。" Else:ans="数字を入力して下さい。" End If End If End Sub となっていました。 私が理解していないのか、このコードでは腑に落ちません… 分かる方、わかりやすく説明していただけたらとても助かります。 また、こうした方がもっといいプログラムになる などアドバイスなどでも結構ですので、 よろしくお願い致します。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

>Else:ans="数字を入力して下さい。" ここでエラーになりませんか。昨日も同じ質問がOKWEBに載りました。 Else ans="数字を入力して下さい。" のようにすること。 > e=en.Text enはVBのコントロールを示すオブジェクトだと思いますが。LabelかTextBoxでしょうか。 でもen.Textと書けないし、ラベルのときは、TEXTプロパティはありましたっけ。Captionしかないのでは。 貼りつける台紙のForm1.Label1.Captionのようになるのでは。 私の場合はVBのコントロールの勉強がむしろ大変です。 この点も勉強しないと、ロジックは正しくても動きませんよ。

ERIeriERI
質問者

お礼

enはテキストボックスだと思います。 ansのところがラベルです。 昨日と同じ質問だったんですね・・・ ありがとうございました

その他の回答 (4)

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.5

あ、ansは、ラベルでしたね。 でしたら ans.caption="~~ と 記述しないとダメです。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.4

Private Sub Command1_Click() ans = "数字を入力して下さい" If en.Text = "" Or hi.Text = "" Then Exit Sub End If If IsNumeric(en.Text) And IsNumeric(hi.Text) Then ans = "あなたが" & en.Text & "円の食事を" & hi.Text & "日間食べるには、" & en.Text * hi.Text & "円の予算がかかる。" End If End Sub これで 上記のが できると思います。 ansは、グローバル変数であることを前提としています。

ERIeriERI
質問者

補足

ans.caption は見落としていました ありがとうございました! そして、作ってくださったプログラムなのですが、 やはり、掛け算にすれば済むんですよね(笑)・・・ ここは思い切って違うプログラムを考えた方が良さそうですね・・・・・・

  • craftsman
  • ベストアンサー率49% (166/336)
回答No.2

 ポイントは、For to ~ Next文で、kotaeにh回、eを足しているのですね。  しかし・・・単にこの計算をするだけなら、For to ~ Nextを使わずに、単純にkotae=e*hのかけ算だけで良いと思います。  これは、For to ~ Next文の使い方を説明するサンプルじゃないんですか?  つまり、実際に結果を求める為に書いたコードでは無い訳で。  例の取り方が悪いとも言えますね。(^^;  ま、解説本の記事等にはありがちですが。

ERIeriERI
質問者

補足

そうなんです!! それを友達に言ったんですが、あまりわかってもらえてないようで・・・ ちなみに授業では、1000円以下の数字を入力し、実行したら 硬貨の最小枚数が出る などということをやりました。 この食費の計算ではなくて、何かいいプログラムを考えだせればいいんですけど・・ なかなか難しいです。 ありがとうございました

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

プログラムの解説ですが、 まず enと hiの 両方に何も入ってなかったら、 数字を入力して下さい が、表示されます。 両方に何か入ってたら、 次に、enと hiの中身が両方とも 数字だったら計算にいきます。 Kotaeに enを hi回分、足して結果を表示します。 どちらかが数字でなかったら 数字を入力して下さい を表示しています。 このプログラムの問題点は、 Kotaeを初期化していない点だと思います。 VBのことだから、初期化しなくても動くとは 思いますが、念のために初期化 しておいたらいいですね。あとへんすうの宣言とかもしておいたほうがいいでしょう。 Kotae=0 For i=1 to h Kotae=kotae + e Next としたらいいでしょう。 ま、プログラムは いろいろ作り方があるので これでもいいかもしれませんが、 私だったら、もっとチェックの仕方をスマートにしたいと思います。

ERIeriERI
質問者

補足

ありがとうございます。 スマートにした形をもしよろしければ、教えていただけないでしょうか? 授業で習った範囲内で、そちらが使えそうならば、参考にしたいと思います。

関連するQ&A

  • エクセルのInputBoxについて教えてください。

    エクセル2010です。 InputBoxについて教えてください。  負数以外の数値を受け取りたいのです。 以下のようにやってみました。 Sub test001() Dim ans As Double ans = Application.InputBox("数値を入力", Type:=1) If ans = False Then MsgBox "キャンセル" Exit Sub ElseIf ans < 0 Then MsgBox "負数は不可。" Call test Else MsgBox ans & "を受け取りました。" End If End Sub 一応、これで動くのですが、問題は数値0を入力された場合です。 0はFalseと認識されるようで、キャンセルとなってしまいます。0は0という数値で受け取りたいのです。 試行錯誤の結果、Type:=1をやめ、変数ansをVariantにして If ans = “False” Then と、Falseをダブルクォーテーションでくくると、0を数値としてくれるようです。でも理屈がわかりません。変数ansにキャンセルボタンで帰ってくるのはBooleanのFalseであり、Stringの”False”ではないと思うのですが。 Sub test002() Dim ans ans = Application.InputBox("数値を入力") If ans = "False" Then MsgBox "キャンセル" & TypeName(ans) Exit Sub ElseIf ans = "" Then MsgBox "未入力" & TypeName(ans) Call test002 ElseIf Not IsNumeric(ans) Then MsgBox "数値ではありません。" & TypeName(ans) Call test002 ElseIf ans < 0 Then MsgBox "負数は不可。" & TypeName(ans) Call test002 Else MsgBox ans & "を受け取りました。" & TypeName(ans) End If End Sub あと、もうひとつ質問は、数値以外の入力があった場合、再度入力させるためいちいちCall test002 を入れてますが、このやり方でただしいのでしょうか?

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

  • エクセルVBA Inputboxについて教えてください。

    InputBoxの使い方について教えてください。 テストで下記のように書いてみました。 Sub input_test2() ans = InputBox("質問!適当に数字を入れてね") MsgBox Application.WorksheetFunction.IsNumber(ans), vbInformation, "入力判定" If Application.WorksheetFunction.IsNumber(ans) Then If ans = 0 Then MsgBox "入力されたのは、 0", vbInformation, "回答" If ans = 1 Then MsgBox "入力されたのは、 1", vbInformation, "回答" If ans = 2 Then MsgBox "入力されたのは、 2", vbInformation, "回答" If ans = 3 Then MsgBox "入力されたのは、 3", vbInformation, "回答" If ans >= 4 Then MsgBox "入力されたのは、 4以上", vbInformation, "回答" Else MsgBox "入力は数字でしてください!", vbExclamation, "お願い" End If End Sub 1.入力が数値ならTRUEがかえると思ったのですが、何を入れてもFALSEしかかえりません。どこがまずいのでしょうか? 2.表示されるInputBoxのサイズが随分横に長いのですが、サイズを変える方法はあるのでしょうか? 3.MsgBoxの"入力判定"や”回答”ようにInputBoxにも最上行に日本語を表示させる方法はないでしょうか? 以上、よろしくお願いいたします。

  • エクセルのVBAで条件付でフォントを変更したいのですが

    たとえばD19のセルには他のセルに入力された文字数が表示されるようLEN(C19)といったような関数が入力されています。D19の値が20より大きければE19のフォントは20にそれ以外なら11にしたいとします。 ちなみにE19も関数が入力さています。 下記でよいのかなと思ったのですが・・・ 直接数値を入力する場合はちゃんと動くのですがD19が数式になるとうまく行きません。どなたか教えてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$D$19" Then If Target.Value > 20 Then Range("E19").Font.Size = 20 Else Range("E19").Font.Size = 11 End If End If End Sub

  • エクセルVBAでセルが数値か数式かの判断方法

    エクセル2000です。 Sub Suuchi() If IsNumeric(Range("A1")) = True Then MsgBox "数値で~す♪" Else MsgBox "数値じゃないよ!" End If End Sub とやってみたんですが、数式も数値となってしまいます。 数値、数式、文字の判断はどうやればいいんでしょうか?

  • ループを違う条件で抜けるようにしたい

    ファイルを読み込み、OPEN "*.*"(*=ワイルドカード)という文字列の*.*のみをリッチテキストボックスに出力するプログラムです。今のままだと、OPEN "ABC"+"Z.txt" などのように" "が同じ行(違う行にある" "は無視してよい)に2個以上あっても、最初の" "(この場合は"ABC"に"."が無いので、ABCは出力しなくて良いが、Z.txtは出力したい)で条件を抜けてしまいます。VBの初心者で、どうループを変えたらよいのかわからないので、どなたか教えてください。 Private Sub FileRead(FL As String) Dim Fileno As Integer 'ファイル番号 Dim strdat As String '行データ Dim pot1 As Integer '『OPEN』の位置 Dim pDB1 As Integer '1つ目の["] Dim pDB2 As Integer '2つ目の["] Dim dt As String Fileno = FreeFile Open FL For Input As #Fileno 'フォルダをセットする While Not EOF(Fileno) Line Input #Fileno, strdat '行データを読み込む pot1 = InStr(UCase(strdat), "OPEN") While (pot1 > 0) pDB1 = InStr(pot1 + 1, strdat, Chr(&H22)) If (pDB1 > 0) Then pDB2 = InStr(pDB1 + 1, strdat, Chr(&H22)) If (pDB2 > 0) Then dt = Mid(strdat, pDB1 + 1, pDB2 - pDB1 - 1) If (InStr(dt, ".")) Then '["]の間に[.]があるか RichTextBox1.Text = RichTextBox1.Text & dt & vbCrLf End If pot1 = pDB2 '2つ目の["] Else pot1 = pDB1 '1つ目の["] End If End If pot1 = InStr(pot1 + 1, strdat, Chr(&H22)) Wend Wend Close Fileno End Sub

  • エクセルの1シート内にある複数の散布図のx軸とy軸の最大目盛、最少目盛

    エクセルの1シート内にある複数の散布図のx軸とy軸の最大目盛、最少目盛、目盛間隔を揃えるにはどのようにしたら良いか教えてください。いくつかwebsiteで調べて下記のようにしてみましたが、x軸の目盛を変更するところで、失敗してしまいます。 よろしくお願いします。 Sub XY軸() Dim Ymin Ymin = InputBox("Y軸の最少?") If IsNumeric(Ymin) Then Range("C2").Value = Ymin Else MsgBox "入力NG!" End If Dim Ymax Ymax = InputBox("Y軸の最大?") If IsNumeric(Ymax) Then Range("C3").Value = Ymax Else MsgBox "入力NG!" End If Dim Y Y = InputBox("目盛間隔?") If IsNumeric(Y) Then Range("C4").Value = Y Else MsgBox "入力NG!" End If Dim xmin xmin = InputBox("X軸の最少?") If IsNumeric(xmin) Then Range("D2").Value = xmin Else MsgBox "入力NG!" End If Dim Xmax Xmax = InputBox("X軸の最大?") If IsNumeric(Xmax) Then Range("D3").Value = Xmax Else MsgBox "入力NG!" End If Dim X X = InputBox("Xの目盛間隔?") If IsNumeric(X) Then Range("D4").Value = X Else MsgBox "入力NG!" End If Dim co As ChartObject For Each co In ActiveSheet.ChartObjects With co.Chart With .Axes(xlValue) .MinimumScale = Range("C2").Value '最小値 .MaximumScale = Range("C3").Value '最大値 .MajorUnit = Range("C4") '目盛間隔 End With With .Axes(xlCategory) .MinimumScale = Range("D2").Value '最小値 .MaximumScale = Range("D3").Value '最大値 .MajorUnit = Range("D4") '目盛間隔 End With End With Next End Sub

  • VB6.0での条件文にある#の意味

    先人のVB6.0プログラムを解読する作業中に以下の2行目の#の意味がわかりませんでした。 (0以下であればというif文の中に 1以下であればというif文?) 御教示いただければ幸いです。 if kakudo < 0 then if kakudo <= 1# then kai = 180 + kakudo else kai = 180 end if else kai = 0 end if

  • VBA Offsetで選択セルを移動させる

    よろしくお願いします。 H8から一行づつ下げてH10まで来たらH15まで飛ばして また一行づつ下げていく。 H20まで来たらH27まで飛ばしてまた一行づつ下げていく。 このようにしたいのですが、構文が解りません。 Private Sub CommandButton1_Click() If ActiveSheet.Range("H8").Activate Then ActiveCell.offset(1, 0).Activate Else ActiveCell.offset(1, 0).Activate End If If ActiveSheet.Range("H10").Activate Then ActiveCell.offset(5, 0).Activate Else ActiveCell.offset(1, 0).Activate End If If ActiveSheet.Range("H20").Activate Then ActiveCell.offset(7, 0).Activate Else ActiveCell.offset(1, 0).Activate End If End Sub

  • マクロにおける条件文の作成の件

    以下の様に条件付きの計算式を作成しました。CommandButton3を押しても 計算しなかったり、TextBox3.Value > TextBox1 ではないときでもエラー メッセージが出ます。どこに欠点があるのか教えて下さい。 Private Sub CommandButton3_Click() Dim row As Integer If TextBox1.Value = Empty Then MsgBox ("Aが空欄です") Exit Sub End If If TextBox2.Value = Empty Then MsgBox ("Bが空欄です") Exit Sub End If If TextBox3.Value = Empty Then MsgBox ("Cが空欄です") Exit Sub End If If TextBox4.Value = Empty Then MsgBox ("Dが空欄です") Exit Sub End If If TextBox3.Value > TextBox1.Value Then MsgBox ("Cの値をAの値より小さくしましょう!") Exit Sub End If If TextBox4.Value > TextBox2.Value Then MsgBox ("Dの値をBの値より小さくしましょう!") Exit Sub End If TextBox5 = Round(TextBox1 * TextBox2 - (TextBox1 - TextBox3) * (TextBox2 - TextBox4) / 2, 0) End Sub

専門家に質問してみよう