Excel VBA質問箱 IV

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

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


3390 / 13645 ツリー ←次へ | 前へ→

【62397】IF文でBLANKセルを選択し、その条件次第でそのセルに着色したいです T-K 09/7/16(木) 15:45 質問[未読]
【62398】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/16(木) 16:56 回答[未読]
【62401】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/17(金) 12:06 質問[未読]
【62402】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/17(金) 12:45 回答[未読]
【62403】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/17(金) 15:06 お礼[未読]
【62449】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/22(水) 17:28 質問[未読]
【62450】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/22(水) 17:46 発言[未読]
【62468】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/23(木) 9:35 お礼[未読]
【62484】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/24(金) 15:32 質問[未読]
【62488】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/24(金) 23:59 回答[未読]
【62508】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/27(月) 17:24 質問[未読]
【62509】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/27(月) 17:45 発言[未読]
【62512】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/27(月) 19:13 発言[未読]
【62520】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/28(火) 15:09 お礼[未読]
【62535】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/29(水) 10:55 質問[未読]
【62536】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/29(水) 11:31 発言[未読]
【62540】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/29(水) 13:00 質問[未読]
【62541】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/29(水) 13:21 発言[未読]
【62546】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/29(水) 16:00 質問[未読]
【62547】Re:IF文でBLANKセルを選択し、その条件次第... もも 09/7/29(水) 16:42 発言[未読]
【62549】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/29(水) 16:54 発言[未読]
【62550】私なにかぼけぼけな誤解してるのかなあ つん 09/7/29(水) 16:59 発言[未読]
【62552】Re:IF文でBLANKセルを選択し、その条件次第... もも 09/7/29(水) 17:54 発言[未読]
【62556】Re:IF文でBLANKセルを選択し、その条件次第... bykin 09/7/29(水) 22:33 発言[未読]
【62558】Re:IF文でBLANKセルを選択し、その条件次第... もも 09/7/30(木) 8:52 発言[未読]
【62559】Re:IF文でBLANKセルを選択し、その条件次第... つん 09/7/30(木) 9:53 発言[未読]
【62561】Re:IF文でBLANKセルを選択し、その条件次第... T-K 09/7/30(木) 17:24 お礼[未読]

【62397】IF文でBLANKセルを選択し、その条件次第...
質問  T-K  - 09/7/16(木) 15:45 -

引用なし
パスワード
   お世話になっております。
皆様のご助力を賜りたく、投稿させて頂きました。
仕様:
 特定のセル(及びセル範囲)選択し、
 そのセル(及びセル範囲)が空白(BLANK)なら、そこに着色したい。
 それをIF文で繰り返し処理し、IF文を抜けたい。

以上を元に作成してみたのですが、
「オブジェクト変数またはWithブロック変数が設定されていません」
というエラーが出ます。
どこが間違っているのでしょうか。
また、何故なのでしょうか。
なにぶん、初心者で恐縮ですが、ご教示よろしくお願い致します。

Public Sub errChek()
  Dim 発行番号 As Range
  '日付1はdate値ではなく任意書式可の為、integerとかにはしていません
  Dim 日付1 As Range
  Dim 発行者 As Range
  
    
  If 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks) Then
    Range("A4").Interior.ColorIndex = 3
  ElseIf 日付1 = Range("E4").SpecialCells(xlCellTypeBlanks) Then
    Range("E4").Interior.ColorIndex = 3
  ElseIf 発行者 = Range("E5:E7").SpecialCells(xlCellTypeBlanks) Then
    Range("E5:E7").Interior.ColorIndex = 3
  Else
    MsgBox "赤セルを入力して下さい"
  End If
End Sub

【62398】Re:IF文でBLANKセルを選択し、その条件次...
回答  つん  - 09/7/16(木) 16:56 -

引用なし
パスワード
   ▼T-K さん:
こんにちは^^


>  If 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks) Then

Rangeオブジェクトの変数に代入するときは、Setせんとあきません。

Set 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks)

If Not 発行番号 Is Nothing Then
  処理処理
End If

って形ですね。
でも、単一セルを指定すると、全セル対象になるみたいなので、これもアウトみたいですが^^;
単一セルの処理だったら単純に

If Range("a4").Value = "" Then

でいいように思います。


>  ElseIf 日付1 = Range("E4").SpecialCells(xlCellTypeBlanks) Then
>    Range("E4").Interior.ColorIndex = 3
>  ElseIf 発行者 = Range("E5:E7").SpecialCells(xlCellTypeBlanks) Then
>    Range("E5:E7").Interior.ColorIndex = 3
>  Else
>    MsgBox "赤セルを入力して下さい"
     ここで、メッセージいれたら、どこにも赤セルがない状態の時に
     メッセージが出るだけちゃうの?
>  End If
>End Sub

よくわからんのですけど、結局は、セルの「A4」と「E4:E7」の範囲の空白セルを赤く塗りつぶしたいんですよね?
やったら、

Sub test3()

  Dim r As Range

  Set r = Worksheets("Sheet1").Range("a4,e4:e7").SpecialCells(xlCellTypeBlanks)
  
  If Not r Is Nothing Then
    r.Interior.ColorIndex = 3
    MsgBox "赤セルを入力してちょ"
  End If
  
  Set r = Nothing

End Sub

で、どうですか?

【62401】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/17(金) 12:06 -

引用なし
パスワード
   ▼つん さん
こんにちは。
迅速なご回答ありがとうございます!
シンプルで美しいなあ、と感激しています!!
そこですみませんが、またお助けいただけますでしょうか。
逆引き大全とか購入して四苦八苦しておりますが。
【1】
セルの「A4」と「E4:E7」の範囲の空白セルを赤く塗りつぶしたいんですよね?
とありますが、実は、E4は単一セルで、E5:E7は「セルを結合した状態」です。
下記で試したのですが、E5:E7は色がついてしまいました。
「セルを結合した状態」で色付けするにはどうしたらよいのでしょうか。
Range("e5:e7").Mergeのように、if文に入る前に処理したほうが??
【2】
Else
>>    MsgBox "赤セルを入力して下さい"
>     ここで、メッセージいれたら、どこにも赤セルがない状態の時に
>     メッセージが出るだけちゃうの?
は、ご指摘の通りで、MsgBoxの代わりにユーザーフォームを挿入しようと
思っていました。
そこで、ユーザーフォームはどの位置に記述すればよいのでしょうか。
(もし、一例頂ければ、トライしてみます)
【3】
End Ifの後に、Set r = Nothingを記述するのは何故でしょうか。
【4】
これでも同じ結果が得られると言えるでしょうか。
Sub test3()

  Dim r As Range
    
  Set r = Worksheets("Sheet1").Range("a4,d4,d5:d7,e5:e7").SpecialCells(xlCellTypeBlanks)
 
  Do
    r.Interior.ColorIndex = 3
  Loop While r Is Nothing
  Set r = Nothing
  MsgBox "赤セルを入力してちょ"
  Cells.Interior.ColorIndex = 0
  
End Sub

お忙しい中申しわけありませんが、よろしくお願い致します。
▼つん さん:
>▼T-K さん:
>こんにちは^^
>
>
>>  If 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks) Then
>
>Rangeオブジェクトの変数に代入するときは、Setせんとあきません。
>
>Set 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks)
>
>If Not 発行番号 Is Nothing Then
>  処理処理
>End If
>
>って形ですね。
>でも、単一セルを指定すると、全セル対象になるみたいなので、これもアウトみたいですが^^;
>単一セルの処理だったら単純に
>
>If Range("a4").Value = "" Then
>
>でいいように思います。
>
>
>>  ElseIf 日付1 = Range("E4").SpecialCells(xlCellTypeBlanks) Then
>>    Range("E4").Interior.ColorIndex = 3
>>  ElseIf 発行者 = Range("E5:E7").SpecialCells(xlCellTypeBlanks) Then
>>    Range("E5:E7").Interior.ColorIndex = 3
>>  Else
>>    MsgBox "赤セルを入力して下さい"
>     ここで、メッセージいれたら、どこにも赤セルがない状態の時に
>     メッセージが出るだけちゃうの?
>>  End If
>>End Sub
>
>よくわからんのですけど、結局は、セルの「A4」と「E4:E7」の範囲の空白セルを赤く塗りつぶしたいんですよね?
>やったら、
>
>Sub test3()
>
>  Dim r As Range
>
>  Set r = Worksheets("Sheet1").Range("a4,e4:e7").SpecialCells(xlCellTypeBlanks)
>  
>  If Not r Is Nothing Then
>    r.Interior.ColorIndex = 3
>    MsgBox "赤セルを入力してちょ"
>  End If
>  
>  Set r = Nothing
>
>End Sub
>
>で、どうですか?

【62402】Re:IF文でBLANKセルを選択し、その条件次...
回答  つん  - 09/7/17(金) 12:45 -

引用なし
パスワード
   ▼T-K さん
こんにちは^^

>【1】
>セルの「A4」と「E4:E7」の範囲の空白セルを赤く塗りつぶしたいんですよね?
>とありますが、実は、E4は単一セルで、E5:E7は「セルを結合した状態」です。
>下記で試したのですが、E5:E7は色がついてしまいました。

あー結合なんかあ・・・
「結合」とマクロは相性が悪いので、なるべく結合しない方がいいらしいのですが、そうも言ってられないこともありますよね。

ちうことで、結合してる場合、左上のセルに値が入ってる形になるので
(ってことでいいんだろうか・・・・)

「E5:E7」で空白セルを見ていくと、E6,E7でヒットしてしまうので、色がついてしまいます。左上のセルだけ指定してやればいいと思います。


>End Ifの後に、Set r = Nothingを記述するのは何故でしょうか。
ht tp://www.moug.net/tech/exvba/0150027.htm
このへん読んでもらったらわかるかな?


>これでも同じ結果が得られると言えるでしょうか。
>Sub test3()
>
>  Dim r As Range
>    
>  Set r = Worksheets("Sheet1").Range("a4,d4,d5:d7,e5:e7").SpecialCells(xlCellTypeBlanks)
> 
>  Do
>    r.Interior.ColorIndex = 3
>  Loop While r Is Nothing
>  Set r = Nothing
>  MsgBox "赤セルを入力してちょ"
>  Cells.Interior.ColorIndex = 0
>  
>End Sub

えーっと、一応色はついたりしますが、なんでLoopしてるのかわかりません^^;

Set r = Worksheets・・・・
の下に、「r.Select」でもしてもらったらわかるけど、変数「r」に、処理対象のセル範囲が全部入ってます。
それで、一気に処理出来るので、Loopする必要はないかと・・・
(う・・・説明が難しい)

で、メッセージの直後に
Cells.Interior.ColorIndex = 0
が、入ってますが、すぐ色が消えてしまうけど、それはかまへんの?
あと、これ入れるなら、
r.Interior.ColorIndex = 0
で、OKです。
Cellsにすると、もし対象セル以外に、何か色づけされてたら、それも解除されちゃいます。


あ、あと、
Range("a4,d4,d5:d7,e5:e7")
のところで、D4とD5:D7って、連続してるセルだけど、分けてるのはなんで?

【62403】Re:IF文でBLANKセルを選択し、その条件次...
お礼  T-K  - 09/7/17(金) 15:06 -

引用なし
パスワード
   ▼つん さん
こんにちは。
また直ぐにご回答頂き感謝します。
ご説明により、すっきりしました。
(頓珍漢なこと言ってしまったこと含め。お恥ずかしい)
これで、やる気が俄然出てきました。
本当にありがとうございます。
また、壁にぶつかったらご教示頂ければ幸いです。

P.S
D4とD5:D7って、連続してるセルだけど、分けてるのは
→D4は日付、D5:D7はセル結合して、署名してもらうためでした。
D5の行を広げればよかったのですが、文書のレイアウト上できなくて。

▼つん さん:
>▼T-K さん
>こんにちは^^
>
>>【1】
>>セルの「A4」と「E4:E7」の範囲の空白セルを赤く塗りつぶしたいんですよね?
>>とありますが、実は、E4は単一セルで、E5:E7は「セルを結合した状態」です。
>>下記で試したのですが、E5:E7は色がついてしまいました。
>
>あー結合なんかあ・・・
>「結合」とマクロは相性が悪いので、なるべく結合しない方がいいらしいのですが、そうも言ってられないこともありますよね。
>
>ちうことで、結合してる場合、左上のセルに値が入ってる形になるので
>(ってことでいいんだろうか・・・・)
>
>「E5:E7」で空白セルを見ていくと、E6,E7でヒットしてしまうので、色がついてしまいます。左上のセルだけ指定してやればいいと思います。
>
>
>>End Ifの後に、Set r = Nothingを記述するのは何故でしょうか。
>ht tp://www.moug.net/tech/exvba/0150027.htm
>このへん読んでもらったらわかるかな?
>
>
>>これでも同じ結果が得られると言えるでしょうか。
>>Sub test3()
>>
>>  Dim r As Range
>>    
>>  Set r = Worksheets("Sheet1").Range("a4,d4,d5:d7,e5:e7").SpecialCells(xlCellTypeBlanks)
>> 
>>  Do
>>    r.Interior.ColorIndex = 3
>>  Loop While r Is Nothing
>>  Set r = Nothing
>>  MsgBox "赤セルを入力してちょ"
>>  Cells.Interior.ColorIndex = 0
>>  
>>End Sub
>
>えーっと、一応色はついたりしますが、なんでLoopしてるのかわかりません^^;
>
>Set r = Worksheets・・・・
>の下に、「r.Select」でもしてもらったらわかるけど、変数「r」に、処理対象のセル範囲が全部入ってます。
>それで、一気に処理出来るので、Loopする必要はないかと・・・
>(う・・・説明が難しい)
>
>で、メッセージの直後に
>Cells.Interior.ColorIndex = 0
>が、入ってますが、すぐ色が消えてしまうけど、それはかまへんの?
>あと、これ入れるなら、
>r.Interior.ColorIndex = 0
>で、OKです。
>Cellsにすると、もし対象セル以外に、何か色づけされてたら、それも解除されちゃいます。
>
>
>あ、あと、
>Range("a4,d4,d5:d7,e5:e7")
>のところで、D4とD5:D7って、連続してるセルだけど、分けてるのはなんで?

【62449】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/22(水) 17:28 -

引用なし
パスワード
   ▼つん さん
こんにちは。
下記、頂きましたSub test3()を元にうまくいきました!
ありがとうございます!
・・・が、また要求がきてしまいまして。
エラーが出たあと(r.Interior.ColorIndex = 3)、一度終了し、
再度マクロ実行した時、このままだとセルは赤いままですよね。当然。
次にマクロ実行時、もしセルがブランクでなくても赤セルのまま。

クリア(色は白)にしてからIF文に入るにはどうしたらよいでしょうか。
IF文の前に、r.Interior.ColorIndex = 0 とか入れてみたのですが。
助けて頂けますでしょうか。何度もすみません。

Sub test3()

  Dim r As Range

  Set r = Worksheets("Sheet1").Range("a4,e4:e7").SpecialCells(xlCellTypeBlanks)
  
  If Not r Is Nothing Then
    r.Interior.ColorIndex = 3
    MsgBox "赤セルを入力してちょ"
  End If
  
  Set r = Nothing

End Sub

▼つん さん:
>▼T-K さん:
>こんにちは^^
>
>
>>  If 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks) Then
>
>Rangeオブジェクトの変数に代入するときは、Setせんとあきません。
>
>Set 発行番号 = Range("A4").SpecialCells(xlCellTypeBlanks)
>
>If Not 発行番号 Is Nothing Then
>  処理処理
>End If
>
>って形ですね。
>でも、単一セルを指定すると、全セル対象になるみたいなので、これもアウトみたいですが^^;
>単一セルの処理だったら単純に
>
>If Range("a4").Value = "" Then
>
>でいいように思います。
>
>
>>  ElseIf 日付1 = Range("E4").SpecialCells(xlCellTypeBlanks) Then
>>    Range("E4").Interior.ColorIndex = 3
>>  ElseIf 発行者 = Range("E5:E7").SpecialCells(xlCellTypeBlanks) Then
>>    Range("E5:E7").Interior.ColorIndex = 3
>>  Else
>>    MsgBox "赤セルを入力して下さい"
>     ここで、メッセージいれたら、どこにも赤セルがない状態の時に
>     メッセージが出るだけちゃうの?
>>  End If
>>End Sub
>
>よくわからんのですけど、結局は、セルの「A4」と「E4:E7」の範囲の空白セルを赤く塗りつぶしたいんですよね?
>やったら、
>
>Sub test3()
>
>  Dim r As Range
>
>  Set r = Worksheets("Sheet1").Range("a4,e4:e7").SpecialCells(xlCellTypeBlanks)
>  
>  If Not r Is Nothing Then
>    r.Interior.ColorIndex = 3
>    MsgBox "赤セルを入力してちょ"
>  End If
>  
>  Set r = Nothing
>
>End Sub
>
>で、どうですか?

【62450】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/22(水) 17:46 -

引用なし
パスワード
   ▼T-K さん:

>クリア(色は白)にしてからIF文に入るにはどうしたらよいでしょうか。
>IF文の前に、r.Interior.ColorIndex = 0 とか入れてみたのですが。
>助けて頂けますでしょうか。何度もすみません。
>
>Sub test3()
>
>  Dim r As Range

   このあたりに、「Worksheets("Sheet1").Range("a4,e4:e7")」の
   範囲全体をクリアする処理を入れたらいかがでしょう?
>
>  Set r = Worksheets("Sheet1").Range("a4,e4:e7").SpecialCells(xlCellTypeBlanks)
>  
>  If Not r Is Nothing Then
>    r.Interior.ColorIndex = 3
>    MsgBox "赤セルを入力してちょ"
>  End If
>  
>  Set r = Nothing
>
>End Sub

【62468】Re:IF文でBLANKセルを選択し、その条件次...
お礼  T-K  - 09/7/23(木) 9:35 -

引用なし
パスワード
   ▼つん さん
おはようございます。
以下、ご教示により、処理挿入でうまくいきました!
いつも本当にありがとうございます。
私もいつか、つんさんのように美しいVBAが組めるように精進せねば。
また不明な点出てきたら、ご指導、よろしくお願い致します。
ありがとうございます。

Sub test3()

 Dim r As Range

   このあたりに、「Worksheets("Sheet1").Range("a4,e4:e7")」の
   範囲全体をクリアする処理を入れたらいかがでしょう?

  Set r = Worksheets("Sheet1").Range("a4,e4:e7").SpecialCells(xlCellTypeBlanks)

【62484】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/24(金) 15:32 -

引用なし
パスワード
   ▼つん さん
こんにちは。いつもありがとうございます。
これまでのご指導でPublic Sub CommandButton3_Click()を作ってみました。
デバッグしたのですが、セル値が全て入った状態でエラーが出てしまいました。
このプロシージャは、
1.Worksheets("Sheet1").Range("AB3,AC3")の色を白にする
2.rがブランクセルであることを確定
3.そうでない場合はセル色を変える
4.メッセージを表示して、if文から抜け出す
と解釈してます。
で、エラーが出た原因は、以下を走らせた時に既に指定セルに値が入っていた為、
2.の条件を満たさずエラーが上がったと考えています。

Public Sub CommandButton3_Click()
 Dim r As Range
    
'チェック前に一度、クリア(白色)する
 Worksheets("Sheet1").Range("AB3,AC3").Interior.ColorIndex = 0

 Set r = Worksheets("Sheet1").Range("AB3,AC3")
  .SpecialCells(xlCellTypeBlanks)  
  
 If Not r Is Nothing Then
    
    r.Interior.ColorIndex = 3
          
  End If
    MsgBox ("赤いセルを入力して下さい")
    
  Set r = Nothing
  
End Sub

そこで、Public Sub CommandButton3_Click()を次のようにしてみたいのです。
どうしたらよいでしょうか。
1.Worksheets("Sheet1").Range("AB3,AC3")の色を白にする
2.指定セルに値(数値や文字)が既に入っていれば無視
3.指定セルに値が入っていなければ、そのセルを着色する
4.メッセージ表示

Set r = Worksheets("Sheet1").Range("AB3,AC3")
  .SpecialCells(xlCellTypeComments)
にして、
if r IS Nothing Then ・・・かな?とやってみましたが、
うまくいきません。

【62488】Re:IF文でBLANKセルを選択し、その条件次...
回答  つん  - 09/7/24(金) 23:59 -

引用なし
パスワード
   ▼T-K さん:
こんばんは〜

>Public Sub CommandButton3_Click()
> Dim r As Range
>    
>'チェック前に一度、クリア(白色)する
> Worksheets("Sheet1").Range("AB3,AC3").Interior.ColorIndex = 0
>
> Set r = Worksheets("Sheet1").Range("AB3,AC3")
>  .SpecialCells(xlCellTypeBlanks) 
   ↑ここでエラーが出るんじゃないですか?
   「該当セルがありません」とかなんとか・・・

 On Error Resume Next
 Set r = Worksheets("Sheet1").Range("A3:C3").SpecialCells(xlCellTypeBlanks)
 On Error GoTo 0

などしたらいいかな? 

で、↓で、rにちゃんと、ブランクセルが入ってるかどうか確かめて〜
  
> If Not r Is Nothing Then
>    
>    r.Interior.ColorIndex = 3
>          
>  End If
>    MsgBox ("赤いセルを入力して下さい")
    で、ここで、なんで、メッセージボックスがIf文の外に出てるんですか?
    これだと、当該セル(ブランクセル)がなくても、メッセージが出ますが・・
>    
>  Set r = Nothing
>  
>End Sub


On Error Resume Next・・・このへんの意味も、コピペして使うだけじゃなくて、ネットで検索しまくるなりして、理解してね。

「SpecialCells(xlCellTypeComments)」だと、「コメントのあるセル」ですわ^^;

【62508】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/27(月) 17:24 -

引用なし
パスワード
   ▼つん さん:
こんにちは。この週末、ずっとあれこれ悩んでました。
ご提案いただいたmougにもアクセスしたりして。

Set r = Worksheets("Sheet1").Range("AB3,AC3")
  .SpecialCells(xlCellTypeBlanks) 
   ↑ここでエラーが出るんじゃないですか?
   「該当セルがありません」とかなんとか・・・
は、ご指摘通りです。rはブランクセルなのだから。

よって、とにかくプロシージャを実行した時、
rはブランクセルとしてオブジェクト定義するのではなく、
r=任意の数値(か文字列)とすれば、プロシージャ実行時、
セルに何か入っているので、それを飛ばし、
次のプロシージャが実行できるのでは?と考えた次第です。

Sub test()
Dim r As Range

Set r = Range(任意の数値(か文字列)).←ここをどう定義するかが分かりません。

If r Is Nothig Then
 r.Interior.ColorIndex = 3
 MsgBox ("赤色のセルを入力して下さい")
Else
 r.Interior.ColorIndex = 0
 
End If

End Sub

間違っていますでしょうか?

On Error Resume Nextステートメントも、On Error GoTo 0も調べました。
(出典:Excel VBA 逆引き大全600の極意 秀和システム 他)
そこでエラー無視によるプログラム非正常動作を覚悟でやってみよう、
と思います。
(できればそのリスクは回避したいので、上のプロシージャを考えました)

また、SpecialCells(xlCellTypeComments)のCommentsとは、
セルに挿入される「コメント挿入」でしょうか?
恥ずかしいのですが分かりません。

【62509】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/27(月) 17:45 -

引用なし
パスワード
   ▼T-K さん
こんにちは

>ご提案いただいたmougにもアクセスしたりして。
???私、モーグ提案した覚えないでっせ。

>r=任意の数値(か文字列)とすれば、プロシージャ実行時、
>セルに何か入っているので、それを飛ばし、
>次のプロシージャが実行できるのでは?と考えた次第です。


Dim r As Range

と、宣言した時点で、「r」に入れらるのはセルそのものだけです。

Range(任意の数値(か文字列))
こういう形はありえません。
「Range」についても、基本的なことをもうちっと調べられた方がいいように主今する。

>On Error Resume Nextステートメントも、On Error GoTo 0も調べました。
>(出典:Excel VBA 逆引き大全600の極意 秀和システム 他)
>そこでエラー無視によるプログラム非正常動作を覚悟でやってみよう、
>と思います。
>(できればそのリスクは回避したいので、上のプロシージャを考えました)


On Error Resume Nexをどうしても使いたくなかったら、
対象セル範囲もそう多くないようですし、

Sub test()

  Dim r As Range
  Dim blnFlag As Boolean
  
  blnFlag = False
  
  For Each r In Worksheets("Sheet1").Range("a1:c3")
    If r.Value = "" Then
      r.Interior.ColorIndex = 3
      ’一回一回メッセ^時ボックス出すのもうざいので、
      ’↓で、判定用の変数使って、最後にメッセージ出す♪
      blnFlag = True
    End If
  Next r
  
  If blnFlag = True Then
    MsgBox "空白セルがありまっせ・・云々"
  End If
  

End Sub

一つ一つセルをチェックして処理するやり方もありかも。


>また、SpecialCells(xlCellTypeComments)のCommentsとは、
>セルに挿入される「コメント挿入」でしょうか?
>恥ずかしいのですが分かりません。

SpecialCellsで検索かけたら、説明してるサイトとか簡単に見つかりそうですよ^^

【62512】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/27(月) 19:13 -

引用なし
パスワード
   あ、そうだ。
ワークシート関数の、「COUNTBLANK」使えばいいのかな。

最初に、

Sub test()

  MsgBox Application.WorksheetFunction.CountBlank(Worksheets("Sheet1").Range("a1:a3"))
  

End Sub

という形で使えるので、対象範囲に空白セルがあるかないか、調べてから、

 Set r = Worksheets("Sheet1").Range("A3:C3").SpecialCells(xlCellTypeBlanks)

をしてやればOKかと思います。

【62520】Re:IF文でBLANKセルを選択し、その条件次...
お礼  T-K  - 09/7/28(火) 15:09 -

引用なし
パスワード
   ▼つん さん:
>▼T-K さん
>こんにちは
>
>>ご提案いただいたmougにもアクセスしたりして。
>???私、モーグ提案した覚えないでっせ。
>
>>r=任意の数値(か文字列)とすれば、プロシージャ実行時、
>>セルに何か入っているので、それを飛ばし、
>>次のプロシージャが実行できるのでは?と考えた次第です。
>
>
>Dim r As Range
>
>と、宣言した時点で、「r」に入れらるのはセルそのものだけです。
>
>Range(任意の数値(か文字列))
>こういう形はありえません。
>「Range」についても、基本的なことをもうちっと調べられた方がいいように主今する。
>
>>On Error Resume Nextステートメントも、On Error GoTo 0も調べました。
>>(出典:Excel VBA 逆引き大全600の極意 秀和システム 他)
>>そこでエラー無視によるプログラム非正常動作を覚悟でやってみよう、
>>と思います。
>>(できればそのリスクは回避したいので、上のプロシージャを考えました)
>
>
>On Error Resume Nexをどうしても使いたくなかったら、
>対象セル範囲もそう多くないようですし、
>
>Sub test()
>
>  Dim r As Range
>  Dim blnFlag As Boolean
>  
>  blnFlag = False
>  
>  For Each r In Worksheets("Sheet1").Range("a1:c3")
>    If r.Value = "" Then
>      r.Interior.ColorIndex = 3
>      ’一回一回メッセ^時ボックス出すのもうざいので、
>      ’↓で、判定用の変数使って、最後にメッセージ出す♪
>      blnFlag = True
>    End If
>  Next r
>  
>  If blnFlag = True Then
>    MsgBox "空白セルがありまっせ・・云々"
>  End If
>  
>
>End Sub
>
>一つ一つセルをチェックして処理するやり方もありかも。
>
>
>>また、SpecialCells(xlCellTypeComments)のCommentsとは、
>>セルに挿入される「コメント挿入」でしょうか?
>>恥ずかしいのですが分かりません。
>
>SpecialCellsで検索かけたら、説明してるサイトとか簡単に見つかりそうですよ^^

【62535】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/29(水) 10:55 -

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

こんにちは。いつもありがとうございます。
早速、下記試してみたのですが・・・
「↓で、rにちゃんと、ブランクセルが入ってるかどうか確かめて」
の次のIF文のところでデバッグすると、
「実行エラー'424' オブジェクトが必要です」と出ます。

これは
「r=ブランクセルというエラーが発生したら、それを無視し、
On Error GoTo 0で次の処理を実行する」
でよいのですよね。

このOn Error GoTo 0と f文の間に「実行エラー'424' 」が出るなら、
r=ブランクセルをセットするはず?なのですが・・・
そこで、r.SpecialCells (xlCellTypeBlanks)と
オブジェクトrとそのプロパティSpecialCells (xlCellTypeBlanks)を
つけてみたましたがうまくいかず。
Rangeについての記述も合ってると思うんですが。
何がいけないのでしょう?

Public Sub CommandButton3_Click()
 Dim r As Range
    
'チェック前に一度、指定セル箇所(飛び飛びのセル)をクリアする
 Worksheets("Sheet1").Range("AB3,AC3").Interior.ColorIndex = 0

On Error Resume Next
Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0

「↓で、rにちゃんと、ブランクセルが入ってるかどうか確かめて」
  
 If Not r Is Nothing Then
    
    r.Interior.ColorIndex = 3
    MsgBox ("赤いセルを入力して下さい")      
  End If
        
  Set r = Nothing
  
End Sub

【62536】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/29(水) 11:31 -

引用なし
パスワード
   ▼T-K さん
おはようございます。

えーっと・・・

こちらで、下記のコードを試してみたら、特に問題なく動きましたが。
(簡単に用意したデータではわからん、なにか他の要因があるんかな?)

下記のコードを何も触らず実行したらエラーが出るのですか?

>このOn Error GoTo 0と f文の間に「実行エラー'424' 」が出るなら、
>r=ブランクセルをセットするはず?なのですが・・・
>そこで、r.SpecialCells (xlCellTypeBlanks)と
>オブジェクトrとそのプロパティSpecialCells (xlCellTypeBlanks)を
>つけてみたましたがうまくいかず。
>Rangeについての記述も合ってると思うんですが。
>何がいけないのでしょう?

言うてはる意味がイマイチわからんのですが・・・
どこにどういうコードを付け加えたんですか?

「On Error GoTo 0」と 「f文の間」に、また
Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
入れたら、そりゃまたそこでエラーが出るのは当たり前やと思いますが・・


あ、ところで、
「WorksheetFunction.CountBlank」使ったら・・・って提案しました。
けど、今試してみたら、選択範囲が複数やったらダメみたいですね^^;
そういえば、ちょっと前にも同じことにぶち当たったような・・・・学習能力なさすぎorz

【62540】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/29(水) 13:00 -

引用なし
パスワード
   ▼つん さん:
こんにちは。T-Kです。

On Error GoTo 0はエラーが発生した処理を中止して次の処理を実行する。
ですから、次のif文を実行するはず、と考えました。
そしてデバッグしたら、実行エラー:オブジェクトが必要です、と出て・・。
ならばと以下の「r.SpecialCells (xlCellTypeBlanks)」が、
追加したオブジェクトです。
ともあれ、私の実現したいことは次のステップなのです。
1.指定のセルを一旦、クリア(色を白にするだけ)
2.指定セルに何も入力されていなかったら、そのセルを赤くする
3.再度、1からスタートした時、指定セルに値が入っていたら、
  セルを赤くしない

Public Sub CommandButton3_Click()
 Dim r As Range
    
'チェック前に一度、指定セル箇所(飛び飛びのセル)をクリアする
 Worksheets("Sheet1").Range("AB3,AC3").Interior.ColorIndex = 0

On Error Resume Next
Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0

「r.SpecialCells (xlCellTypeBlanks)」
  
 If Not r Is Nothing Then
    
    r.Interior.ColorIndex = 3
    MsgBox ("赤いセルを入力して下さい")      
  End If
        
  Set r = Nothing
  
End Sub

>「WorksheetFunction.CountBlank」使ったら・・・って提案しました。
>けど、今試してみたら、選択範囲が複数やったらダメみたいですね^^;
→そうなんです。
それで、On Error Resume Nextを採用しようとしました。
でも、実は他の業務で活きてくるのが分かって、得しました。
教えていただいてありがとうございます。

【62541】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/29(水) 13:21 -

引用なし
パスワード
   どもども

>
>On Error GoTo 0はエラーが発生した処理を中止して次の処理を実行する。

中止して・・・というか、無視して?
というか、
「On Error Resume Next」が、エラーが発生した場合もその次から処理を続行する・・・という命令です。

'==============================================
ヘルプより
On Error Resume Next
実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続します。オブジェクトを操作する場合は、On Error GoTo ステートメントではなく、このステートメントを使ってください。

On Error GoTo 0
現在のプロシージャに含まれる使用可能なエラー処理ルーチンを無効にします。
'==============================================


>ですから、次のif文を実行するはず、と考えました。

うんうん。

>そしてデバッグしたら、実行エラー:オブジェクトが必要です、と出て・・。

デバッグしたら・・の意味がいまいちわからんのですが・・・
(デバッグって「バグ」を取り除くって意味やで?)

次の

If Not r Is Nothing Then

で、エラーが出るのですが?
どう考えても、エラーが出そうな気はしないのですが・・・

↑の、条件文の意味わかってはります?
「Not r Is Nothing」・・・「r」が「Nothing」じゃない。
つまり、「r」に値が入ってるってことです。

もし、空白セルがなく、
On Errorでサンドイッチした
Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
で、入るべき該当セルがなくて、エラーが発生した場合、
「r」には何も入ってないまま、If文に突入するわけです。

その場合、「Not r Is Nothing」じゃないわけだから、
If文が通らなくて、そのまま、何事もなく終了♪

・・・に、なるはずなんやけど?


>On Error Resume Next
>Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
>On Error GoTo 0
>

 ここで、こんなんいれたら、「r」に何のセルも入ってないから
 「オブジェクトが必要です」って怒られるのは当然でっす! 
>「r.SpecialCells (xlCellTypeBlanks)」
>  
> If Not r Is Nothing Then

【62546】Re:IF文でBLANKセルを選択し、その条件次...
質問  T-K  - 09/7/29(水) 16:00 -

引用なし
パスワード
   ▼つん さん:
こんにちは。T-Kです。
恥ずかしながら、こういう理解でよろしいでしょうか。
あとそれに対する処理をご教示頂ければ幸いです。

1.
On Errorでサンドイッチした
Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
に入るべき該当セルがなくて、エラーが発生する。

2.
「r」には何も入ってないまま、If文に突入。

3.
If Not r Is Nothing Thenは、Nothingをrに入れてIsで比較。
r←NothingならTrueでif文以下の処理を実行。
がNotゆえTrueとFalseが反転。rはNothingでないならTrueとしてIf文以下を実行。
ここで、rはRange型かつブランクセルプロパティとして既にSetしているから、
rはNothingではない→rは値が入っている、として処理を実行する。

4.
ということは、On Errorでエラー(rはブランクセルだ)を無視(突破?)し、
If Not文に入る前に「rには値が入っているぞ」と
Set(宣言?)しなければならないことに・・・。
しかし、rはブランクセルとしてSetしているし・・・。

5.質問
On ErrorとIf Not間には、rはどうオブジェクト指定すればよいのでしょうか。
それともIf Not→If文に変更???
本当にすみません。つん さん、ご助力をお願いします!

【62547】Re:IF文でBLANKセルを選択し、その条件次...
発言  もも  - 09/7/29(水) 16:42 -

引用なし
パスワード
   ▼T-K さん:
こんにちは

▼つん さん:
横入すみません。

私はOn Error Resume Nextを使うのが余り好きではないという
個人的な趣味の為にNothingになる可能性のある範囲を取得する場合は
以下のように拡大範囲で取得後Intersectで一致判定をしています。
良いコードかどうかはわかりませんが、参考になれば・・・


With Worksheets("Sheet1")

 'シート全体のブランクセルをrにセット
 Set r = .Cells.SpecialCells(xlCellTypeBlanks)

 '上でセットしたrと目的範囲の一致した範囲をrにセット
 Set r = Application.Intersect(r, .Range("AB3:AC3"))

End With

【62549】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/29(水) 16:54 -

引用なし
パスワード
   ▼もも さん
こんにちは^^

>私はOn Error Resume Nextを使うのが余り好きではないという
>個人的な趣味の為にNothingになる可能性のある範囲を取得する場合は
>以下のように拡大範囲で取得後Intersectで一致判定をしています。
>良いコードかどうかはわかりませんが、参考になれば・・・
>
>
>With Worksheets("Sheet1")
>
> 'シート全体のブランクセルをrにセット
> Set r = .Cells.SpecialCells(xlCellTypeBlanks)
>
> '上でセットしたrと目的範囲の一致した範囲をrにセット
> Set r = Application.Intersect(r, .Range("AB3:AC3"))
>
>End With

ああ、そういうやり方、考え方もあるんですね。
私は安易に、On Error Resume Nextは使っちゃうんですけど、
確かに、予測されることとはいえ、エラーを無視してすすんじゃえ!って考えも、ちょっと乱暴なのかなあ・・という気もしてました。
勉強になります。ありがとうございます^^

【62550】私なにかぼけぼけな誤解してるのかなあ
発言  つん  - 09/7/29(水) 16:59 -

引用なし
パスワード
   ▼T-K さん:

>1.
>On Errorでサンドイッチした
>Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
>に入るべき該当セルがなくて、エラーが発生する。
>
>2.
>「r」には何も入ってないまま、If文に突入。

ここまでOKやと思います。めいび〜


>3.
>If Not r Is Nothing Thenは、Nothingをrに入れてIsで比較。

なんで、「Nothingをrに入れて」になるんですか?
空白セルがないこと前提なんで、入れるまでもなく、
r Is Nothing 状態です。
第一、「If Not r Is Nothing Then」で、変数rの状態を判断してるんやから、その中でrの状態いじったらあかんやんか。
というか、いじれませんけど^^;

If Not r Is Nothing Then でわかりづらかったら、
If Not (r Is Nothing) Then
にしたほうがわかりやすいかな?

>r←NothingならTrueでif文以下の処理を実行。
>がNotゆえTrueとFalseが反転。rはNothingでないならTrueとしてIf文以下を実行。
>ここで、rはRange型かつブランクセルプロパティとして既にSetしているから、
>rはNothingではない→rは値が入っている、として処理を実行する。

言うてはる意味わかんないんですが、
単純に、

空白セルがなかった→ r に代入されるセルがなくて、値が入らない(Nothing)
まま→ If Not (r Is Nothing) Then で通らずに処理されない。

と考えたらいいんじゃないでしょうか?

>
>4.
>ということは、On Errorでエラー(rはブランクセルだ)を無視(突破?)し、
>If Not文に入る前に「rには値が入っているぞ」と
>Set(宣言?)しなければならないことに・・・。

なんで?
そもそも
If Not r Is Nothing Then
は、「rには値が入っているかどうか?」を判定しているんだから、
その前に、「Set(宣言?)」しちゃ、意味ないやんか。

>5.質問
>On ErrorとIf Not間には、rはどうオブジェクト指定すればよいのでしょうか。

必要ないです。
でも、そこでそちらで何故かエラーが出るから、そう考えられたんでしょねえ・・・なんでかなあ?

えーっとですね。

新規のブックの標準モジュールに

Sub test()

 Dim r As Range
  
'チェック前に一度、指定セル箇所(飛び飛びのセル)をクリアする
 Worksheets("Sheet1").Range("AB3,AC3").Interior.ColorIndex = 0
 
  On Error Resume Next
  Set r = Worksheets("Sheet1").Range("AB3,AC3").SpecialCells(xlCellTypeBlanks)
  On Error GoTo 0
  
 If Not (r Is Nothing) Then
  
    r.Interior.ColorIndex = 3
    MsgBox ("赤いセルを入力して下さい")
  End If
    
  Set r = Nothing

End Sub

で、一度試してみてください。


すみません。
私も、他の回答者さまほど達人ではなく、
どこか落とし穴を見落としてるのかもしれません・・・
でも、他の人もこの質問を見てくれてると思うから、あんまりほげほげなことしてたら、指摘してくれると思うねんけど・・・

【62552】Re:IF文でBLANKセルを選択し、その条件次...
発言  もも  - 09/7/29(水) 17:54 -

引用なし
パスワード
   ▼T-K さん:

とりあえず、
>「実行エラー'424' オブジェクトが必要です」と出ます。
が出る可能性の1つとして

> Dim r As Range

がちゃんと宣言されているかどうか?
というのも関係しますのでチェックしてください。

特にOn Error Resume Nextでエラー回避している場合は
宣言されずにVariant型などの場合、そもそもオブジェクト変数に
なっていませんからr Is Nothing の判定時にオブジェクト変数として
比較できませんからエラーとなります。

【62556】Re:IF文でBLANKセルを選択し、その条件次...
発言  bykin  - 09/7/29(水) 22:33 -

引用なし
パスワード
   こんばんわ。

えらい長いスレッドやねー・・・つんはん、ご苦労さんです。
全部読んだわけやないけど、ご質問の内容や話題があちこち飛んでて
ごちゃごちゃになってる感じやね。

要するに

>ともあれ、私の実現したいことは次のステップなのです。
>1.指定のセルを一旦、クリア(色を白にするだけ)
>2.指定セルに何も入力されていなかったら、そのセルを赤くする
>3.再度、1からスタートした時、指定セルに値が入っていたら、
>  セルを赤くしない

・・・ってことですわな?
3.については1.で全部クリアしてるんやから考える必要ないと思うよ。

Sub test()
  On Error Resume Next
  With ActiveSheet.Range("A1:D6")
    .Interior.ColorIndex = xlColorIndexNone
    .SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 3
  End With
End Sub

これくらいで十分なんとちゃいまっか?
セル範囲は適宜変更しておくれやす。

▼ももはん

>With Worksheets("Sheet1")
> 'シート全体のブランクセルをrにセット
> Set r = .Cells.SpecialCells(xlCellTypeBlanks)

ここでエラーが出る可能性がありまっせ。
使用済みセル範囲の全セルにデータが入ってる場合です。
例えばA1:C3の範囲の全セルにデータが入力されてて、
他のセルは使ったことが無いときとか・・・

結局エラーが出る可能性があるんやから、素直に On Error Resume Next を
使えばええと思うけどなー

あとはつんはんにお任せします(^^;;
よろしゅーに。
ほな。

【62558】Re:IF文でBLANKセルを選択し、その条件次...
発言  もも  - 09/7/30(木) 8:52 -

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

おはようございます。

>▼ももはん
>
>>With Worksheets("Sheet1")
>> 'シート全体のブランクセルをrにセット
>> Set r = .Cells.SpecialCells(xlCellTypeBlanks)
>
>ここでエラーが出る可能性がありまっせ。
>使用済みセル範囲の全セルにデータが入ってる場合です。
>例えばA1:C3の範囲の全セルにデータが入力されてて、
>他のセルは使ったことが無いときとか・・・
>
>結局エラーが出る可能性があるんやから、素直に On Error Resume Next を
>使えばええと思うけどなー

御指摘ありがとうございます。
確かにシート全セルに入力済みではエラーという条件を明示しませんでした。
ただ、そこは最初に仕様として解る事かな〜?という認識で使っています。
On Error Resume Next でエラーハンドルでの処理など
必要な場合はもちろん使いますので頑なに使わない訳ではないです。
・空きセルがどこかに1つでもある。
・空きか入力済みかはユーザーの入力次第
という条件のもとでは、1つの案として使えるかな?程度という考えです。
On Error Resume Next を否定する訳ではなくて
そこの処理で悩むのなら・・・くらいです。

色々なコードや考えがあってVBA楽しんでいます。
ありがとうございました^^

【62559】Re:IF文でBLANKセルを選択し、その条件次...
発言  つん  - 09/7/30(木) 9:53 -

引用なし
パスワード
   ▼bykin さん
おはよーございます^^

わー師匠!、来てくれはっておおきに〜(T_T)←うれし泣きw

>Sub test()
>  On Error Resume Next
>  With ActiveSheet.Range("A1:D6")
>    .Interior.ColorIndex = xlColorIndexNone
>    .SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 3
>  End With
>End Sub

>
>これくらいで十分なんとちゃいまっか?
>セル範囲は適宜変更しておくれやす。

おおお!これはシンプルだ!
T−Kさんも、これで解決出来たらいいですねw


>あとはつんはんにお任せします(^^;;
>よろしゅーに。
>ほな。

時々見にきて〜〜〜〜〜〜〜

【62561】Re:IF文でBLANKセルを選択し、その条件次...
お礼  T-K  - 09/7/30(木) 17:24 -

引用なし
パスワード
   ▼つん さん
▼もも さん
▼bykin さん

こんにちは。
解決しましたあ!!!!
皆さんに見当違いな質問したり(特に、つん さん。本当にすみません)、
参考書、ネットetcで調べ・勉強して正直わけわかんなくなってました。
こんなにシンプルとは。
Withステートメントも理解できたかと(完全ではないかもしれませんが)・・・。
また別の壁に当たるかもしれませんが、その時はまたご相談させて下さい。
今度は誰かの役に立てるよう、精進します!
ありがとうございました。

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