Gizport
1 回答
0
Share (facebook)
47
view
全般

空白セルを探すマクロの書き方を教えて下さい。 マクロ初心者です。 今...

空白セルを探すマクロの書き方を教えて下さい。 マクロ初心者です。
今仕事で使用する計算書をマクロを使いエクセルで作成しています。
しかし、現在つまづいて前に進めません。
どなたか教えて下さいませ。
宜しくお願いします。

sheet1に表があります。
その表の入力箇所を全て記入しないと
次の工程に進めないようにしたいです。

・表の幅はA列からF列までです。
・表の行数は可変でA列とB列とD列が入力必須項目です。
・入力開始行は6です。
・C列は全て空白のまま次の工程に移ります。
・E列及びF列には必ず文字の入力があります。
・completionは次の工程です。

そこで実行ボタンを作り、以下のようなマクロを書いてみました。

Sub test()
Dim a As Range
Dim abchk As Range
Set a = Range("A6")
Set abchk = Range("f46").End(xlUp).Offset(0, -4)
For Each a In abchk
If Range(a, abchk) <> "" Then
call completion
Else
MsgBox "必須項目に対し、空白のセルがあります" & vbNewLine & "全て入力して下さい"
End If
Next
End Sub

しかし空白セルが表の一番下ならElseで返ってくるんですが、
表の途中だとcompletionを実行してしまいます。
例えば表が20行目まであった場合、A20が空白ならElseで返ってくるんですが、
A10が空白の場合completionを実行してしまいます。
どこを直したらよろしいでしょうか?

また、この範囲にD列も加えたいのですが、
どの様に記述すればスマートでしょうか?

下手な説明で申し訳ありませんが
何卒宜しくお願いします。
Yahoo!知恵袋 4113日前
コメントする
お気に入り
1
質問者が選んだベストソリューション
こんな感じで如何でしょうか。

その前にコードを見て気付いた点をいろいろ・・・

> Set a = Range("A6")
なのに
> For Each a In abchk
a をループ ↑ のElementで使っていて変ですよ。
Set a は意味無し。 a は範囲 abchk に反映されていないかと・・・
> Set abchk = Range("f46").End(xlUp).Offset(0, -4)
abchkは、単体セルです。
よって
> For Each a In abchk
でループする意味がありません。
> If Range(a, abchk) <> "" Then
aとabchkは、同じものです。
もし、違うときは、配列になりますので、<> "" 等 値の比較は、出来ません。
あと、入力1セルずつ何回もCall completionをCallするんですか?
全体が入力OKでCall するのと違いますか?

なお、いちいち全範囲をループでチェックしないで Findメソッドで、
直接探すようにした方が、効率的と思います。

Sub Test2()
Dim Rw As Long
Dim Rng As Range
Dim abchk As Range
Rw = Cells(Rows.Count, 6).End(xlUp).Row
Set abchk = Range("A6:B" & Rw & ",D6:D" & Rw)
For Each Rng In abchk
    If Rng.Value <> "" Then
        Call completion
    Else
        Rng.Activate
        MsgBox Rng.Address(False, False) & _
            " 必須項目に対し、空白のセルがあります" & _
            vbNewLine & "全て入力して下さい", vbExclamation
        ' Exit Sub '         <--- 1回のMsgで終わるとき有効にします。
    End If
Next
Set abchk = Nothing
End Sub

'-----

全体が入力OKのときだけcompletionをCall するとき

Sub test3()
Dim Rw As Long
Dim Rng As Range
Dim abchk As Range
Dim Flg As Boolean
Rw = Cells(Rows.Count, 6).End(xlUp).Row
Set abchk = Range("A6:B" & Rw & ",D6:D" & Rw)
For Each Rng In abchk
    If Rng.Value = "" Then
        Flg = True
        Rng.Activate
        MsgBox Rng.Address(False, False) & _
            " 必須項目に対し、空白のセルがあります" & _
            vbNewLine & "全て入力して下さい", vbExclamation
        ' Exit Sub '         <--- 1回のMsgで終わるとき有効にします。
    End If
Next
If Flg = False Then Call completion
Set abchk = Nothing
End Sub
Yahoo!知恵袋 4112日前
シェア
 
コメントする
 

参考になったと評価
  このQ&Aは参考になりましたか?

Share (facebook)
その他の解決方法を知っていますか?
回答する
全般
67
Views
質問者が納得下の図のようなことでしょうか? ・A列~D列は貴殿の画像のとおりで、一部データを変えています。 ・E列とF列に、合計数値の表示された品目と合計を集約しています。 ①D2セルには貴殿の=IF(SUMIF($A$2:$A$10,C2,$B$2:$B$10)=0,"",(SUMIF($A$2:$A$10,C2,$B$2:$B$10)))の数式が入っています。 ②E2セルには=IF(COUNT(D$2:D$7)<ROW(E1),"",INDEX(C:C,SMALL(I...
3562日前view67
全般
49
Views
質問者が納得B1セルの値が時刻のシリアル値になっているためにそのように表示されてしまいます。そのためB1セルの値をTEXT関数を使って時刻の表示に変えることですね。 =A1&IF(B1="","",TEXT(B1,"h:mm"))&C1&D1 IF関数を使っているのはB1セルが空白でしたら空白にするためです。
3570日前view49
全般
62
Views
質問者が納得やめとけ ドコモで機種変更したら大損しますよ。おそらく旧料金プランでしょうから、機種変更すると新料金プランに半強制変更。料金割高になります。 旧料金プラン タブレット 3791円(プラスXi割、7GB) 新料金プラン タブレット 5500円(2GB) ドコモがタブレット2500円で使える!と盛んに宣してますが、家族の誰かが9500円以上の負担をしているから使えるだけ。2台目プラスってのもありますが、容量全く増えないのにシェアするだけで2500円かかります。 機種はどれでもいいんで白ロムで購入しましょ...
3574日前view62
全般
52
Views
質問者が納得SIMカードはキャリアからの貸与品なので本来は返却する必要があります。しかし、今後もトランスミッター機能を使いたいと言えば返さなくても良いでしょう。
3571日前view52
全般
61
Views
質問者が納得>瞬時にシャッターを切れるようにしています。 ってことは、 被写体を発見したら、それを撮影すべく、急いで設定した撮影するってことでしょうか。 前もって良い撮影場所を研究し、 電車や飛行機の時刻表を元に計算し、 じっくりと計画的に被写体と向かい合って、 じっくりと構図セッティングや撮影設定を行う・・・、 私が思うに、それの方が良い作品に近づくと思います。 あと、私なら昼間は、ISOは基本は100にしますね。足りなかったら400とかにしますけど。ISOは大きいとノイズが入りやすくなります。出来るだけ...
3585日前view61

取扱説明書・マニュアル

917view
http://www.nttdocomo.co.jp/.../F-10D_J_OP_01.pdf
173 ページ6.56 MB
もっと見る

関連製品のQ&A