Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2262 / 13646 ツリー ←次へ | 前へ→

【69069】range設定ミス? みその 11/5/14(土) 4:40 質問[未読]
【69070】Re:range設定ミス? かみちゃん 11/5/14(土) 7:27 発言[未読]
【69076】Re:range設定ミス? みその 11/5/14(土) 15:15 質問[未読]
【69072】Re:range設定ミス? ichinose 11/5/14(土) 9:59 発言[未読]
【69077】Re:range設定ミス? みその 11/5/14(土) 15:20 質問[未読]
【69079】Re:range設定ミス? ponpon 11/5/14(土) 16:38 発言[未読]
【69081】Re:range設定ミス? みその 11/5/14(土) 17:45 質問[未読]
【69082】Re:range設定ミス? かみちゃん 11/5/14(土) 17:58 発言[未読]
【69085】Re:range設定ミス? ponpon 11/5/14(土) 18:28 発言[未読]
【69090】Re:range設定ミス? みその 11/5/14(土) 20:04 お礼[未読]

【69069】range設定ミス?
質問  みその  - 11/5/14(土) 4:40 -

引用なし
パスワード
   windows7 エクセル2007使用です


複数のrangeに対して、条件を満たす場合に、
処理を実行するというコードを作成しました。

A列に入力漏れがある場合、関数を使ってX列に警告文を表示させています。
X列に警告文が表示されている場合は、
MsgBoxで、"入力してください"と表示させるためのマクロを組みました。

Sub 入力漏れチェック()

Dim i As Range

For Each i In Worksheets("A").Range("X8:X13")

  If i.Value <> "" Then

   MsgBox "番号を入力してください"
 
    Exit Sub

   Else
     処理1
 
  End If

 Next i
 
End Sub

上のコードでは、たとえば、X13に警告が表示されている場合、
ちゃんとMsgBoxが表示され、番号入力をすることができます。
そして、処理1は実行されません。

ところが、以下のように複数のレンジを指定すると、
MsgBoxの表示もなく、処理1が実行されてしまいます。

Dim i As Range

For Each i In Worksheets("A").Range("X8:X13", "X32:X37")

 If i.Value <> "" Then

   MsgBox "番号を入力してください"
 
    Exit Sub

   Else
     処理1
 
  End If

 Next i
 
End Sub

レンジの設定の仕方がおかしいのでしょうか・・・。

どうぞよろしくご教示お願いいたします。

【69070】Re:range設定ミス?
発言  かみちゃん  - 11/5/14(土) 7:27 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>上のコードでは、たとえば、X13に警告が表示されている場合、
>ちゃんとMsgBoxが表示され、番号入力をすることができます。
>そして、処理1は実行されません。
>
>ところが、以下のように複数のレンジを指定すると、
>MsgBoxの表示もなく、処理1が実行されてしまいます。

X8:X13、X32:X37は、何も表示されていないのに、
「処理1」が処理されるということは、
X14:X31に何か値が入っていませんか?

Range("X8:X13", "X32:X37")
では、X8:X37が処理されるので、
以下のようなコードにしてはいかがでしょうか?

For Each i In Worksheets("A").Range("X8:X13,X32:X37")

【69072】Re:range設定ミス?
発言  ichinose  - 11/5/14(土) 9:59 -

引用なし
パスワード
   おはようございます。


>上のコードでは、たとえば、X13に警告が表示されている場合、
>ちゃんとMsgBoxが表示され、番号入力をすることができます。
>そして、処理1は実行されません。
>
>ところが、以下のように複数のレンジを指定すると、
>MsgBoxの表示もなく、処理1が実行されてしまいます。


X8:X13やX32:X37にどんなデータが入っているのかも
記述してください。でないと、閲覧者と質問者の同期がとれませんので。


>
>Dim i As Range
>
For Each i In Worksheets("A").Range("X8:X13,X32:X37")
'本当は、これですか?
'Range("X8:X13,X32:X37")とRange("X8:X13", "X32:X37")ではセル範囲は違います
>
>  If i.Value <> "" Then
>
>   MsgBox "番号を入力してください"
> 
>    Exit Sub
>
>   Else
>     処理1
> 
>  End If
>
> Next i
> 
>End Sub

【69076】Re:range設定ミス?
質問  みその  - 11/5/14(土) 15:15 -

引用なし
パスワード
   ▼かみちゃん さん:

早速ありがとうございます。

> Range("X8:X13", "X32:X37")
>  では、X8:X37が処理されるので、
>  以下のようなコードにしてはいかがでしょうか?
> 
>  For Each i In Worksheets("A").Range("X8:X13,X32:X37")


For Each i In Worksheets("A").Range("X8:X13,X32:X37")
としても、やはり結果は同じで、
MsgBoxは表示されず、処理1が実行されてしまいます。

>X8:X13、X32:X37は、何も表示されていないのに、
>「処理1」が処理されるということは、
>X14:X31に何か値が入っていませんか?

X14:X31にはデータはありません。
でも、たとえX14:X31データがあったとしても、
For Each i In Worksheets("A").Range("X8:X13,X32:X37")
If i.Value <> "" Then

とするなら、X8:X13,X32:X37Mに何かデータがあれば、
sgBoxは表示され、処理1が実行されないと思うのですが、
私が考え違いでしょうか。。。
"X8:X13,X32:X37"には、if関数を使って、A列が未入力の場合、
”番号を入力してください”という警告文字を表示させています。

指定しているレンジ以外のX列にはデータがありませんので、
For Each i In Worksheets("A").Range("X8:X37")
としてみましたが、やはり、
MsgBoxは表示されず、処理1は実行されてしまいます。

一区切りのレンジならうまくいくのに、複数を指定すると
とうまくいかないのです。

【69077】Re:range設定ミス?
質問  みその  - 11/5/14(土) 15:20 -

引用なし
パスワード
   ▼ichinose さん:


早速ありがとうございます。

>X8:X13やX32:X37にどんなデータが入っているのかも
>記述してください。でないと、閲覧者と質問者の同期がとれませんので。
>

"X8:X13,X32:X37"には、if関数を使って、A列が未入力の場合、
”番号を入力してください”という警告文字を表示させています。

>For Each i In Worksheets("A").Range("X8:X13,X32:X37")
>'本当は、これですか?
>'Range("X8:X13,X32:X37")とRange("X8:X13", "X32:X37")ではセル範囲は違います

For Each i In Worksheets("A").Range("X8:X13,X32:X37")
としても、やはり結果は同じで、
MsgBoxは表示されず、処理1が実行されてしまいます。
指定しているレンジ以外のX列にはデータがありませんので、
For Each i In Worksheets("A").Range("X8:X37")
としてみましたが、やはり、
MsgBoxは表示されず、処理1は実行されてしまいます。

一区切りのレンジならうまくいくのに、複数を指定すると
とうまくいきません。

引き続き、よろしくお願いいたします。

【69079】Re:range設定ミス?
発言  ponpon  - 11/5/14(土) 16:38 -

引用なし
パスワード
   時間があったので、やってみました。


Sub 入力漏れチェック()

Dim i As Range

'Worksheets("A").Range("A8:A13", "A32:A37").Select
Worksheets("A").Range("A8:A13,A32:A37").Select

'For Each i In Worksheets("A").Range("A8:A13", "A32:A37")
For Each i In Worksheets("A").Range("A8:A13,A32:A37")
  If i.Value <> "" Then
   MsgBox "番号を入力してください"
    Exit Sub
   Else
     MsgBox "A"
  End If
 Next i
End Sub

どちらの場合もうまくいきましたよ。

For Each の場合順番にセルを見ていくので
データがない場合、処理1が実行され、データがあった場合に
初めて
MsgBox "番号を入力してください"が実行され
Exit Sub
となりますが、それでよいのですよね??

【69081】Re:range設定ミス?
質問  みその  - 11/5/14(土) 17:45 -

引用なし
パスワード
   ▼ponpon さん:

検証していただいてありがとうございました。

私もいただいたコードで実際にやってみました。

ponpon さんのおかげで気づきました。
一つずつセルを見て行って、一つがOKなら
まずその段階で処理1を実行していくのですね・・。
私が行き詰っていた点も、まさにここにありました。

実は、やりたいことは、少し違っていまして、
すべてのセルに入力漏れがなくなって初めて、
処理1を実行させたいのです。
逆にいうと、1つでも、入力漏れがあれば、
処理1は実行したくないのです。

今まで、どこかに入力漏れがあるのに、
なぜ処理1が実行されてしまうんだろう・・・と思っていたのは、
順にセルを見て行って、条件を満たすセルがあった時点で、
処理1が実行されてしまっていたんですね・・。

どのセルにもデータが存在しない(警告文が表示されない)ときに初めて
処理1を実行させたい場合は・・どのようなコードになるのでしょうか。

if("A8:A13" "A32:A37")のうち
一つでもデータが存在する場合は
番号入力しなさいというMsgBoxを表示させたいのです。

全部のセルのデータ消えて初めて、処理1を実行する。
そういうことがしたいのですが・・・

一つずつ見て行って、実行してしまうFor next i の構文を使うことが
根本的に間違いなのでしょうか。。。

どうかアドバイスお願いいたします。


>時間があったので、やってみました。
>
>
>Sub 入力漏れチェック()
>
>Dim i As Range
>
>'Worksheets("A").Range("A8:A13", "A32:A37").Select
>Worksheets("A").Range("A8:A13,A32:A37").Select
>
>'For Each i In Worksheets("A").Range("A8:A13", "A32:A37")
>For Each i In Worksheets("A").Range("A8:A13,A32:A37")
>  If i.Value <> "" Then
>   MsgBox "番号を入力してください"
>    Exit Sub
>   Else
>     MsgBox "A"
>  End If
> Next i
>End Sub
>
>どちらの場合もうまくいきましたよ。
>
>For Each の場合順番にセルを見ていくので
>データがない場合、処理1が実行され、データがあった場合に
>初めて
>MsgBox "番号を入力してください"が実行され
>Exit Sub
>となりますが、それでよいのですよね??

【69082】Re:range設定ミス?
発言  かみちゃん  - 11/5/14(土) 17:58 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>すべてのセルに入力漏れがなくなって初めて、
>処理1を実行させたいのです。
>逆にいうと、1つでも、入力漏れがあれば、
>処理1は実行したくないのです。

それは初めて聞いたように思います。
ひとつでも値が入っていれば、そこで、Exit Sub します。

  For Each i In Worksheets("A").Range("A8:A13,A32:A37")
    If i.Value <> "" Then
      MsgBox "番号を入力してください"
      Exit Sub
    End If
  Next i

  MsgBox "処理1を実行します。"

End Sub

【69085】Re:range設定ミス?
発言  ponpon  - 11/5/14(土) 18:28 -

引用なし
パスワード
   ▼みその さん:

>実は、やりたいことは、少し違っていまして、
>すべてのセルに入力漏れがなくなって初めて、
>処理1を実行させたいのです。
>逆にいうと、1つでも、入力漏れがあれば、
>処理1は実行したくないのです。

そうだと思いました。私も昔はよくそんなミスをしていました。
すでにかみちゃんさんから回答がありますが、
みそのさんの考えにしたがって


Sub 入力漏れチェック()

Dim i As Range
Dim m As Boolean

  m = False
  For Each i In Worksheets("A").Range("A8:A13,A32:A37")
   If i.Value <> "" Then
    m = True
    Exit For
   End If
  Next i
’ここまでで""いがいがあるかチェックしています。
    
  If m Then  ’""以外があれば
    MsgBox "番号を入力してください  "
    Exit Sub
  Else
    MsgBox "A"  '処理1
  End If
 
End Sub

【69090】Re:range設定ミス?
お礼  みその  - 11/5/14(土) 20:04 -

引用なし
パスワード
   ありがとうございました。

ponpon さんのコードを当てはめることで、
無事、解決することができました。

ponpon さんのご想像のとおりでした。
かみちゃんさんにもご指摘いただきましたが、
やりたいことを正確に書くこともできず、
ponpon さんのサンプルコードを試してみて初めて、
自分のやりたかったことを明確にすることができました。
まだまだ勉強不足を痛感しました。

皆様に、感謝の気持ちでいっぱいです。
本当にありがとうございました。

2262 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free