• ベストアンサー

iと言う変数の値が1から10の間にないならば

「iと言う変数の値が1から10の間にないならば」、としたいのですが どのようなコードを書けばいいのでしょうか? Sub test1() Dim i As Integer i = 11 If 1 < i < 10 Then MsgBox i & "は1から10の間にはありません" End If End Sub だと、メッセージが表示されてしまいます。

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

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.7

アナログ思考の習慣が災いしています。 i=1 iは1より大きい 1<i FALSE iは10より小さい i<10 TRUE i=5 iは1より大きい 1<i TRUE iは10より小さい i<10 TRUE i=15 iは1より大きい 1<i TRUE iは10より小さい i<10 FALSE あなたの論理式 1<i<10 iの値が1、5,15のすべての時 FALSE i=5 1<i<10→(1<i)<10→(TRUE)<10→FALSE 1つの数式に複数の論理演算子含まれると左から順に評価され、1つめの評価がTRUEでもFALSEでも次段の数値との比較ではFALSEになります。 今回の質問では「1<i」と「i<10」を夫々評価して、双方を「and」で評価すれば目的に合うでしょう。 但し、メッセージボックスの表示内容が逆転しているように思われます。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

その他の回答 (6)

  • hiodraiu
  • ベストアンサー率15% (448/2821)
回答No.6

一番最初の回答で既に正解は出てるので、別の視点でアドバイスです。 言語仕様書となるとチョット専門書になっちゃいますが、入門書で少し勉強すると、この程度の初歩的な疑問はすぐに解決できると思います。だって、質問して回答を得るまでに多少時間がかかりますよね。これって知ってれば無駄な時間を無くすことが出来ますよね。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

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

私共は小学校・中学校などの、学校で算数や数学の教育を受けてきています。 そこで現れる、式での表現法と、コンピュターの言語での表現は(似ていても厳密には)異なる場合が多いです。 そういう考え方の大変換を質問者が行ってください。 1つ1つ確認のべんきょうが必要です。 ーー いちいちOKWAVEで質問していたらきりがないので、とりあえずVB(A)の解説書で勉強すべきです。 ーー 本題に入って、2数の間の判定は (1)2つの比較を重ねる方法 (2)AND演算子を使う方法 (3)SQLという言語などBetweenという表現がつあえるものあり を(小生は)今まで経験しました。 まずは(1)ではIF文を使って Sub test01() Dim a As Integer a = 7 'この数をいろいろ変えて実行してください If a < 10 Then If a > 1 Then MsgBox "1より大で10より小です" End If End If End Sub (2)は Sub test02() Dim a As Integer a = 6 If a < 10 And a > 1 Then MsgBox "1より大で10より小です" End If End Sub ーー 再々使うなら、私製の関数化する方法もあります。 Function betw(x, a, b) If x < b And x > a Then 'MsgBox "1より大で10より小です" 'テスト用 betw = True End If End Function Sub test03() If betw(119, 1, 10) = True Then MsgBox "1より大で10より小です" Else MsgBox "1より大で10より小でありません" End If End Sub 実際の例で、以上、以下、未満、超えるの場合に(演算子という)コードの点検を念入りにしてください。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

  • bardfish
  • ベストアンサー率28% (5029/17765)
回答No.4

「If 1 < i < 10 Then」 この書き方だと条件判定が2つ含まれています。 IF文では条件判定式は基本的には一つだけ。 だから2つ以上の条件を含ませたい場合はANDやORと併用して記述します。 「i>=1 AND i<=10」という書き方だとiが1から10の間、となりますよね。 これにNOTをあわせる記述もあります。 「NOT (i>=1 AND i<=10)」 この書き方だと「iの値が1から10の間、じゃない」という意味になります。 別の記述方法だと IF i>=1 Then IF i<=10 Then ELSE MsgBox i & "は1から10の間にはありません" End IF Else MsgBox i & "は1から10の間にはありません" End If という書き方も出来ます。 ※あってるよね?(^^; プログラミングでは、同じ結果でもコードはいくつか違う記述も出来るということです。 コンパイラやインタープリタによっては、記述方法で実行速度が変わることもあったりします。 繰り返しの中で使われるIF文の条件判定式を工夫するだけで処理時間が短縮することもあったりします。 特に数万とか数十万の繰り返しではその差は無視できなかったりもします。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

  • honoka69
  • ベストアンサー率50% (6/12)
回答No.3

この言語が何かわからず回答させてもらいますので、まちがってるかもしれませんが考え方だけわかってもらえればと思います。(おそらくVisualBasicですかね・・・) If 1 < i < 10 Then ここの部分が問題だと思います。 この書き方を日本語になおせば 「もし1よりiは大きくて10より小さいならば」という意味になると思います。 「iと言う変数の値が1から10の間にないならば」 を言い換えると 「iは1よりちいさいかつ10より大きい」になります。 この2つは全く同じ意味です。 なのでこの部分を変えてあげて 「もし1より小さいかつ10より大きければ」になおしてあげれば期待の動きが得られると思います。 具体的な書き方は If i <1 AndAlso 10 < i Then AndAlsoはかつという意味です。 「かつ」というのは A と B の両方の条件を満たしているとう意味です。 両方の条件をみたしていたらif文が真になるということです。 今回でいえば i <1 が Aにあたります。 10 < i  がBにあたります。 ちなみに今回の話とは関係ないですが、今後でてくると思うので「または」についても書いておきます。 A OrElse B これでAまたはBという意味なります。 Aの条件を満たしているかまたはBの条件のどちらか一方の条件を満たしていればif文は真になります。 ※もしVisualBasicでなければAndAlsoやOrElseの部分の書き方が変わると思います。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

If i < 1 Or i > 10 Then MsgBox i & "は1から10の間にはありません" End If または If i >= 1 And i <= 10 Then  Else MsgBox i & "は1から10の間にはありません" End If ですね。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

If i < 1 or i > 10 Then MsgBox i & "は1から10の間にはありません" End If iが1~10の間(1と10を含む)なら、 If i >= 1 and i <= 10 Then End If です。

ADQCPKET
質問者

お礼

ご回答ありがとうございました。

関連するQ&A

  • 「1から5の間なら」とするには?

    「1から5の間なら」とするには? エクセルvbaです。 Sub test1() Dim i As Integer i = 1 If i = 1 Or i = 2 Or i = 3 Or i = 4 Or i = 5 Then MsgBox "1-5までのどれかです" End If End Sub は、最大でも5なので手入力でできますが、 これが1から100までならor演算子で繋ぐのは大変なので Sub test2() Dim i As Integer i = 1 If i = [1-5] Then MsgBox "1-5までのどれかです" End If End Sub みたいなことをやりたいのですが、うまくいきません。 デバッグしてもエラーにもなりません。 自分でコードを書いといて聞くのもおかしいですがtest2の意味と、表題の方法を教えてください。 よろしくお願いします。

  • 変数iもjも同じく値を保持できるからどちらを使って

    このサンプルコードは、 変数iもjも同じく値を保持できるから、test1を使ってもtest2を使っても一緒なのでしょうか? Option Explicit Dim i As Integer Sub test1() Static j As Integer j = j + 1 Debug.Print j End Sub Sub test2() i = i + 1 Debug.Print i End Sub ご回答よろしくお願いします。

  • [と”の意味を教えてください。

    http://okwave.jp/qa/q5945112.html を参考に、 Sub test1() Dim i As Integer i = 2 If i Like "[1-3]" Then MsgBox i & "です" End If End Sub Sub test2() Dim i As Integer i = 2 If i Like "[1-5]" Then MsgBox i & "です" End If End Sub Sub test3() Dim i As Integer i = 2 If i Like "[1-10]" Then MsgBox i & "です" End If End Sub を作ったのですが、 test3はうまく行きません。 意味としては、 iが "[1-10]"の中の数字の間のどれかであれば、 MsgBox i & "です" を表示させたいです。 でも上記のマクロを実行させた結果、 "[1-10]"の中で計算が行われてるのではないかと思います。 だから、test3は、1-10=-9 という事になり、msgboxが反応しないのではないかと思っています。 でもそうすると、test2だって "[1-5]"は、-4になって、i=2とは違う値なのに なぜMsgBoxが反応してしまうのかわかりません。 でもそもそも[と”の意味が分からないのでそこから教えていただけませんか? “の意味、は二つで挟んで文字列にすると思っています。

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • VBA:カウンターの i の値が開放されなくて困っています。

    以下のコードを実行する度に、カウンター i の値がリセット(開放)されずに積算されて困っています。なぜか教えて下さい。宜しくお願い致します。 以下のコードは、簡単に言えばcsvファイルをカウンター i で数えています。したがって、少なくともCSVファイルを一つ作成して実行して下さい。 Option Explicit Dim FiName As String, FoName As String Dim EachFiName As String Dim i As Integer Sub Test() MsgBox i '二回目にこのコードを実行するとiが積算されます。 FiName = Application.GetOpenFilename If FiName = "False" Then Exit Sub Else If Right(FiName, 3) <> "csv" Then MsgBox "Chose a CSV file." Exit Sub End If End If FoName = Left(FiName, InStrRev(FiName, "\", -1, vbTextCompare)) EachFiName = Dir(FoName & "*.csv") Do While EachFiName <> "" i = i + 1 EachFiName = Dir() Loop End Sub

  • なぜiは変数の値が保持されるのに、wは保持されない

    なぜiは変数の値が保持されるのに、wは保持されないのでしょうか? Sub test() Dim w As Worksheet Dim i As Long i = 1 For Each w In Worksheets i = i + 1 Next MsgBox i MsgBox w.Name End Sub -------------------------------------- を行うと、 MsgBox i は表示されるのに、 MsgBox w.Name は、 「オブジェクト変数または With ブロック変数が設定されていません。」になります。 wはオブジェクト変数だから、 For Each ステートメントを抜けると値が破棄されてしまうのでしょうか? でもvbaのヘルプの 「For Each...Next ステートメントの使い方」 を見ても 「ステートメントを抜けるとオブジェクト変数なら値が破棄されます」 と記載されていません。

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • 変数の中身がアルファベットだけなのか取得するには

    変数がアルファベットだけか取得するには? Sub test() Dim mystr As String mystr = "abc" If ??? Then MsgBox "アルファベットだけです" End If End Sub のように、変数の中身がアルファベットだけなのか取得するにはどうすればいいでしょうか? ひらがな、カタカナ、漢字、記号を含んでいるかどうかを評価したいです。

  • 変数に入った値を追加したい

    Access97を使用しています。SQLで変数に入った値を追加したいのです。 Dim strSQL, NO3, NO2 As String Dim i As Integer Dim db As DATABASE Dim SN As Variant If (C_Flag = 0) Then SN = 0 Else SN = 1 End If strSQL = "INSERT INTO 連続印刷 (Nフラグ" strSQL = strSQL & ") VALUES (" strSQL = strSQL & "', 'SN'" strSQL = strSQL & ")" Set db = CurrentDb() db.Execute strSQL Set db = Nothing End Sub 上記のようにすると、"SN"のデータが入ります。 'SN'をSNのようにすると、パラメータが少なすぎますと出てきます。 どうすれば、上記 0や1の値を取得することができるのでしょうか?

専門家に質問してみよう