みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

vba if構文 すべて答えが同じになってしまう

現在vbaの勉強中です。
問題集通りに下記コードを設定しました。
a1に20以下の数値、例えば「5」を入力するも、
「成人です」の結果になってしまいます。
20より小さい場合は未成年ですの表記になるはずですが・・・。

Sub mondai()
Sheets("Sheet3").Select
Dim nenrei As Long
nenrei = Range("a1").Value
If nenrei > 20 Then
 MsgBox "成人です"
Else
 MsgBox "未成年です"
End If
End Sub

投稿日時 - 2019-07-05 12:12:37

QNo.9632159

困ってます

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

>a1に20以下の数値、例えば「5」を入力するも
ここでいうa1は、Sheet3のa1のことですね?

Sub mondai()
 Sheets("Sheet3").Select
 Dim nenrei As Long
 nenrei = Range("a1").Value '◇注◇
 If nenrei > 20 Then
  MsgBox "成人です"
 Else
  MsgBox "未成年です"
 End If
End Sub

注の行の Range("a1").Value の記述です。
既に他の方々からコメントがあるように
一般的には、
Sheets("Sheet3").Range("a1").Value
このように、どのシートのa1なのかを明示します。

省略して、おっしゃるように書くことも可能ですが、
省略した場合、どのシートの"a1"と見なしてくれるのか?
が問題となります。

提示のコードをシートモジュールに配置すると
> Sheets("Sheet3").Select
この行の有無に関係なく配置したシートと見なします。
他方、標準モジュールに配置すると
Activeなシートとみなします。
https://excel-ubara.com/excelvba4/EXCEL251.html
この説明がわかりやすいと思います。

起きている事象から、
課題コードをSheet3以外の(例えばSheet1の)シートモジュールに
配置しているものと思います。

さらに言えば、VBAで複数のブックを扱えますので
どのブックのどのシートなのかを明示的に指定したほうが
誤解やバグをより生まないコードになります。

私だったら、コードの配置先を問わず、以下のように書きます。
(問題集では標準モジュールに配置することを想定しているものと思います。)
Sub mondaiX()
 Dim nenrei As Long
 With ThisWorkbook.Sheets("Sheet3")
  nenrei = .Range("a1").Value
 End With
 If nenrei > 20 Then
  MsgBox "成人です"
 Else
  MsgBox "未成年です"
 End If
End Sub

投稿日時 - 2019-07-06 12:46:07

お礼

Sheets("Sheet3").Range("a1").Valueで解決しました!
また、モジュールについての理解で状況が理解できました。
ありがとうございました♪

投稿日時 - 2019-07-07 15:46:23

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

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

回答(5)

ANo.4

実際にテストしてみましたが、コードは正しいようです。
Sheet3で動かしていないと思われます。

投稿日時 - 2019-07-05 21:43:00

お礼

Sheet3でコード作成ができていませんでした。
早々に回答いただきありがとうございました♪

投稿日時 - 2019-07-07 15:48:58

ANo.3

もしかして Sheet3以外のコードとしてSub monda()を記述していませんか?
例えばSheet1のマクロとしてコード記述すると
Sheets("Sheet3").Select

Sheets("Sheet3").Activate
を先に入れていても
nenrei = Range("a1").Value
では、Sheet1のA1セルを取り出してしまいます。

なので、どのシートに書いてもよいように
nenrei = Range("a1").Value
でなく
nenrei = Sheets("Sheet3").Range("a1").Value
って書いてしまうのが 手っ取り早いと思います。
(Withを使ってもよいでしょうけど)

投稿日時 - 2019-07-05 16:00:48

お礼

ご指摘の通り、Sheet1のマクロとしてコード記述しておりました。
Sheet3で記述しなおして実行したところ、解決しました!
ありがとうございました♪

投稿日時 - 2019-07-07 15:50:28

ANo.2

以下で確認して下さい。
Sub mondai()
  Dim nenrei As Long

  Sheets("Sheet3").Select
  nenrei = Range("a1").Value
  If nenrei > 20 Then
    MsgBox nenrei & " は、成人です"
  Else
    MsgBox nenrei & " は、未成年です"
  End If
End Sub

投稿日時 - 2019-07-05 13:09:58

お礼

コードの記述に誤りがありました。
今回頂いたコードで作成し、sheet1で実行されていることがわかりました。ありがとうございました。

投稿日時 - 2019-07-07 15:55:34

ANo.1

if nentei >= 20 Then
だけど、5を入力すれば未成年になりますよ!

入力をSheet3のA1に入れてますか?

投稿日時 - 2019-07-05 12:44:10

お礼

コードの記述がsheet1でした。ケアレスミスです。
回答いただきありがとうございました。

投稿日時 - 2019-07-07 15:56:27

あなたにオススメの質問