質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

24573閲覧

未入力箇所があったらメッセージボックスを表示させてマクロを実行させないようにしたい

saki_program

総合スコア31

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/05/08 10:19

型が一致しません とエラーメッセージがでます。

C2からC11の間で数値が入力されていなければ、メッセージボックスでエラーメッセージを出力させ、以降の処理を中断させたいと思っております。
しかし、こちらを実行すると型が一致しませんとエラーメッセージが出力し、原因が分かりません。

VBA

1Sub 合否判定() 2 3 4 If Range("C2:C11") = " " Then 5 MsgBox "未記入箇所があります!" 6 7 Exit Sub 8 End If 9 10 Dim i As Long 11 12 For i = 1 To 10 13 If Cells(1 + i, 3) >= 70 Then 14 Cells(1 + i, 4) = "合格" 15 Else 16 Cells(1 + i, 4) = "不合格" 17 End If 18 Next i 19 20End Sub 21

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

未入力のセルとは「なにも入力されていないセル」とします。

VBA

1If Range("C2:C11") = " " Then 2 MsgBox "未記入箇所があります!" 3 4 Exit Sub 5End If

VBA

1 Dim rng As Range 2 Dim rg As Range 3 Set rng = Range("C2:C11") 4 For Each rg In rng 5 If rg.Value = "" Then 6 MsgBox "未記入箇所があります!" 7 Exit Sub 8 End If 9 Next rg 10

に変えてください。

投稿2020/05/08 11:07

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saki_program

2020/05/08 13:46

For Eachを使われてますね。こちらは未学習でした。これから学習を深め、理解できるようにいたします。
guest

0

" "の型は文字列型でRange("C2:C11")の型は8204(バリアント型の配列)のため、=で比較することが出来ません。

各セルの値を順に比較するかFindメソッド等を使う必要があるかと思います。

投稿2020/05/08 10:31

meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saki_program

2020/05/08 13:47

Findメソッド・・・どう使うかはこれから学習して理解していきます。
guest

0

ベストアンサー

「型が一致しません」とエラーメッセージは、下記の行で発生します。

If Range("C2:C11") = " " Then

Range("C2:C11")の型は Range で、" "の型は Strings ですから一致しません。
型の違うものを = で比較することは出来ません。

未記入かどうかは、C2からC11までのセルを順に調べましょう。

修正すると、こんな感じでしょうか。

Sub 合否判定() Dim row As Long '行を示す変数 ' C2からC11のセルで、未記入("")がないかチェック。 ' あったら"セルが未記入です"とMagBoxで表示する For row = 2 To 11 If Cells(row, 3) = "" Then MsgBox "C" & row & "セルが未記入です" & vbCrLf & "処理を中断します" Exit Sub End If Next row ' C2からC11のセルの値が70以上ならD列のセルに"合格"、そうでないならD列のセルに"不合格" For row = 2 To 11 If Cells(row, 3) >= 70 Then Cells(row, 4) = "合格" Else Cells(row, 4) = "不合格" End If Next row End Sub

MsgBoxに表示するメッセージは、単に"未記入箇所があります!"ではなく、どのセルが未記入なのかを判るようにしました。また、中断する旨の説明も付けました。
丁寧な説明があると、使い勝手がぐんと上がりますからね。

変数 i だと、どういう意味を持つ値か判りませんが、変数 row だと、rowは、行、という意味ですから、行をしているのだなというのが判ります。
少し手間に感じるかもしれませんが、後でプログラムを見直す時に、意味のある変数名をつかっておくと理解しやすいですよ。

投稿2020/05/08 11:12

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saki_program

2020/05/08 13:43

まだまだ簡単なコードしか書けない私でも理解できました。丁寧な回答ありがとうございます。感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問