プロが教える店舗&オフィスのセキュリティ対策術

下記のプログラムをあげます。

Private Sub cmdatai_Click()
'変数
Dim n As Long '代入された値
'入力用のダイアログボックス表示(初期値)
n = InputBox("整数を入れてください")
n = Val(n)

'IF式 値が入ってされていない時
If n = "" Then
MsgBox "値が入力されていません"
If (n Mod 2) = 1 Then '奇数のとき
MsgBox "奇数です"
ElseIf (n Mod 2) = 0 Then '偶数のとき
MsgBox "偶数です"
Else
MsgBox "0です"
End If
End If

End Sub

見直したのですが、プログラムが何をダイアログボックスに入れてもプログラムが動きません。
どこがおかしいのでしょうか?
ちょいミスだとは思うのですが、どうしてもわかりません。
よろしくお願いいたします。

質問者からの補足コメント

  • たびたびすみません。

    ダイアログボックスに全角数字を入れると全部「0です」ともどってきてしまいます。
    全角数字を数字と認識させない方法ありますか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/04/12 19:54

A 回答 (4件)

#3補足コメントへの返信です。



> ダイアログボックスに全角数字を入れると全部「0です」ともどってきてしまいます。

全部?2例めのInputBox メソッドでは、そうはならない筈ですけれど。
InputBox メソッドをお奨めする理由は
InputBox()関数は一見トッツキはいいけれど、
そういった諸々の、手間数が多くなるってこともあってなのですけれどね、、、。

全部、ではなくて、InputBox()関数については、ですね。
話をInputBox()関数に限ってお話します。

> 全角数字を数字と認識させない方法ありますか?

VBAにはそのような機能は特には用意されていません。
強いてやるなら、
StrConv()関数で文字列を半角に変換したものと、元々の文字列を
比較して同じであるかどうか判別することなら出来ますが、、、。
寧ろ、全角数字を数字として認識させる方を選ぶ場合が多いと思うので、
その方法を挙げておきます。

1)
関数を重ねることを嫌う向きも多いでしょうが、正確さを求めるなら
以下のように、文字列を一旦半角にしてからVal関数。

' ' ///

Private Sub cmdatai_Click() ' InputBox()関数
Dim n As Variant '(セルに)代入された値 (の受け皿となる変数)
   ' ' 入力用インプットボックスを表示
   n = InputBox("整数を入れてください")

  If IsNumeric(n) Then
    n = Val(StrConv(n, vbNarrow))
    If n = 0 Then
      MsgBox "0です"
    ElseIf n Mod 2 = 1 Then
      MsgBox "奇数です"
    Else
      MsgBox "偶数です"
    End If
  Else
    MsgBox "整数を入力してください"
  End If

End Sub

' ' ///

2)
「数字を半角で入力するように」ということを実践出来ない相手に、
「必ず整数を入力せよ」と徹底できるとは思えませんが、
整数が入力されるなら、以下のように型変換関数を使った
強引なやり方もあります。

' ' ///

Private Sub cmdatai_Click() ' InputBox()関数
Dim n As Variant '(セルに)代入された値 (の受け皿となる変数)
   ' ' 入力用インプットボックスを表示
   n = InputBox("整数を入れてください")

  If IsNumeric(n) Then
    n = CInt(n)
    If n = 0 Then
      MsgBox "0です"
    ElseIf n Mod 2 = 1 Then
      MsgBox "奇数です"
    Else
      MsgBox "偶数です"
    End If
  Else
    MsgBox "整数を入力してください"
  End If

End Sub

' ' ///

一応、注意点として、
CInt()関数は、小数点以下を、偶数丸めで返します。
  msgbox cint("59.5")
  msgbox cint("60.5")
どちらも、60 になってしまうので、整数に丸めるにしても
四捨五入でないことは、この例でお解りかと思います。
テストの点数ということですと、私の経験上、
問題作成者の配点ミスによって急きょ0.5点単位の採点になったことが幾度かありました。
そうでなくても、誤った入力なら誤った入力であることがハッキリするように、
整数かどうかのチェックをした方が無難だと思って#3では2例めを掲げています。
「整数かどうかのチェック」はしないけど「全角数字入力には反応する」というのは、
私の感覚では釣り合いが取れていない印象は受けます。
そういう意味で、InputBox メソッドが使えるExcel環境で、
敢えてInputBox()関数を好んで選ぶ(多数派ですが)場合は、
性善なる入力に期待している、という意味合いが強いことだけは知っておいてください。

#3補足コメントへの返信は、以上です。
    • good
    • 0
この回答へのお礼

ありがとうございます!
うまく動きました!

お礼日時:2015/04/13 06:07

こんにちは。



' ' ///

Private Sub cmdatai_Click() ' InputBox()関数
Dim n As Variant '(セルに)代入された値 (の受け皿となる変数)
  ' ' 入力用インプットボックスを表示
  n = InputBox("整数を入れてください")

  If IsNumeric(n) Then
    n = Val(n)
    If n = 0 Then
      MsgBox "0です"
    ElseIf n Mod 2 = 1 Then
      MsgBox "奇数です"
    Else
      MsgBox "偶数です"
    End If
  Else
    MsgBox "整数を入力してください"
  End If

End Sub

' ' ///

とか、

' ' ///

Private Sub cmdatai_Click() ' InputBox メソッド 整数強制版
Dim n As Variant '(セルに)代入された値 (の受け皿となる変数)

  Do
    ' ' 入力用インプットボックス(数値入力専用)を表示
    n = Application.InputBox(Prompt:="整数を入れてください", Type:=1)
    If VarType(n) = vbDouble Then
      If Int(n) = n Then
        Exit Do
      Else
        MsgBox "整数を入力してください"
      End If
    End If
  Loop

  n = CLng(n)
  If n = 0 Then
    MsgBox "0です"
  ElseIf n Mod 2 = 1 Then
    MsgBox "奇数です"
  Else
    MsgBox "偶数です"
  End If

End Sub

' ' ///

とか。
この回答への補足あり
    • good
    • 1
この回答へのお礼

ありがとうございます!
まだ、DO-LOOP式を習ってないので、一個目で理解しました。

「IsNumeric 関数は、引数 expression が数値として認識できる場合は真 (True) を返します。それ以外は偽 (False) を返します。桁区切り文字や全角の数字も数値として認識されます。」

この関数がわかればあとは全部わかりました。感服いたしました。ありがとうございました。

お礼日時:2015/04/09 06:10

ごめん、variantにすると、


文字列とかをval判定すると0になっちゃうから、結果が偶数になっちゃう。
もう一つ変数を作ってエラー処理した方が良いかもしれない。
    • good
    • 0
この回答へのお礼

ありがとうございます!
IsNumeric 関数で処理しました。

お礼日時:2015/04/09 06:12

最初の if文のend ifの場所が最後になっているから。


あと、nはvariantにしたほうが良いと思う。

ブレークポイントとかデバッグとか検索してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます!
最初のifの場所、変えてやってみます。

お礼日時:2015/04/09 06:17

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