[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白行の行飛びがあったときにメッセージをだしたい』(ちこ)
VBA初心者です
教えてください
B列からM列まで3行目から始まる表で
行(データ)が飛んで入力されたデータがあった場合
"行飛びデータがあります"とメッセージを出して飛んで
入力されたデータのセルに黄色の背景色をつけたいのですが
どう記述すればいいでしょうか
行数は3から83の80行です
こんな感じです
A B C D E F
3××××××××
4△△△△△△△△
5○○○○○○○○
6 ←空白行の下に1つでもデータがあれば処理をしたい
7◎◎◎◎◎◎◎◎
8
よろしくお願いします
< 使用 Excel:Excel2016mac、使用 OS:Windows10 >
Sub test() Dim tbl As Range Dim r As Range
Set tbl = Range("B3:M83") Set r = tbl(1).CurrentRegion
Set r = Intersect(tbl, r.Offset(r.Rows.Count)) If r Is Nothing Then Exit Sub
Set r = r.SpecialCells(xlCellTypeConstants) If Not r Is Nothing Then r.Select
End Sub
(マナ) 2019/11/02(土) 08:47
>"行飛びデータがあります"とメッセージを出して
これはいいのですが、どのタイミングで出したいのでしょう?
>入力されたデータのセルに黄色
入力されていない行の誤りですか?
(渡辺ひかる) 2019/11/02(土) 08:49
__B_____C_____D_____E_____.._M__ 3 ×× ×× ×× ×× ×× 4 △△ △△ △△ △△ 5 ○○ ○○ ○○ ○○ ○○ 6 7 ◎◎ ◎◎ ◎◎ ◎◎ ◎◎ 8
このとき、「"行飛びデータがあります"とメッセージを出して」
ということなので、1行そっくり抜けている場合のみメッセージを出すという理解でよいですか?
(私が提示したもので言うと、D4が抜けているけどセーフ扱いでよいのか)
(もこな2) 2019/11/02(土) 09:30
メッセージとセルへの色つけのタイミングはマクロを走らせたときです
行飛びの飛んでいない上部の方はB列からM列まではすべて入力されていて抜けはありません
逆に行飛び後のデータはデーターセルの数に限らず1つ以上のセルにデータがあったら処理をします
よろしくお願いします
(ちこ) 2019/11/02(土) 15:31
Sub test()
Dim r As Range, rr As Range, r1 As Range, r2 As Range Dim flg As Boolean With Range("B3:M83") .Interior.Pattern = xlNone .Cells(1).Select Set r = .Find("*", .Cells(1), , , xlByRows, xlPrevious) '81行くらいなら全てLoopしても良いが、最終行取得 '行数は3から83は81行です If r Is Nothing Then MsgBox "There is no data at all" Exit Sub End If For Each r1 In .Rows("1:" & r.Row - .Row + 1) '最終行までLoop Set r2 = Nothing On Error Resume Next '次行のステートメントで空白行だとエラーが出るのでエラーを無視 Set r2 = r1.SpecialCells(xlCellTypeConstants) '行中の記入セルを探す(空白行ならエラーでr2 = Nothingのまま) On Error GoTo 0 If flg Then If Not r2 Is Nothing Then 'チェックフラグ有り(空白行以降)で If rr Is Nothing Then '空白行で無く Set rr = r2 '飛んで入力セルが未登録なら登録 Else Set rr = Union(rr, r2) '登録済みなら飛んで入力セルを連結 End If End If Else If r2 Is Nothing Then flg = True '初回空白行ならチェックフラグ立てる End If Next If Not rr Is Nothing Then rr.Interior.Color = vbYellow rr.Select MsgBox "行飛びデータがあります" End If End With End Sub
(kazuo) 2019/11/03(日) 09:03
> Set r = Intersect(tbl, r.Offset(r.Rows.Count)) ↓ Set r = Intersect(tbl, tbl.Offset(r.Rows.Count))
で、ご指摘のケースも考慮するとこんな感じで。
★の行で、必ずしも、意図した通りに取得できませんが
結果的には、同じ結果になるようです。
Sub test2() Dim tbl As Range Dim r As Range
Set tbl = Range("B3:M83") Set r = tbl.SpecialCells(xlCellTypeConstants).Areas(1) '★
Set r = Intersect(tbl, tbl.Offset(r.Rows.Count)) If r Is Nothing Then Exit Sub
On Error Resume Next Set r = r.SpecialCells(xlCellTypeConstants) On Error GoTo 0 If Not r Is Nothing Then r.Select
End Sub
(マナ) 2019/11/03(日) 09:59
>If Not r Is Nothing Then r.Select
(マナ) 2019/11/03(日) 10:04
お邪魔します。。お邪魔やったら出て行って・・・まぁ、、そうおおしゃらずに(^^;関西人のノリです。。 そんなんどうでもええから早よ回答せんかえ!おっさん、、はい!すみません。。
えっつと、、最初から気になっていたんですけど、、↓これ?
>行飛びの飛んでいない上部の方はB列からM列まではすべて入力されていて抜けはありません >逆に行飛び後のデータはデーターセルの数に限らず1つ以上のセルにデータがあったら処理をします
下からループして抜けがあったら抜ける(しゃれ?ではないです。)かなと、、老婆心ながら、、
見当違いでしたら、、ゴミ箱にでもポイしてといてください。。。では、、では、、
大筋は、、kazuo さんのコードをお借りしました。m(__)m
Option Explicit Sub てすと() Dim r As Range Dim i As Long Dim flgA As Boolean Dim flgB As Boolean Range("B3:M83").Interior.Pattern = xlNone For i = 83 To 3 Step -1 If Application.CountA(Range("B" & i).Resize(, 12)) > 0 Then flgA = True If r Is Nothing Then Set r = Range("B" & i).Resize(, 12).SpecialCells(xlCellTypeConstants) Else Set r = Union(r, Range("B" & i).Resize(, 12).SpecialCells(xlCellTypeConstants)) End If Else If flgA Then flgB = True Exit For End If End If Next If flgB Then If Not r Is Nothing Then r.Interior.Color = vbYellow r.Select MsgBox "行飛びデータがあります" End If End If End Sub (SoulMan) 2019/11/03(日) 11:52
>行飛びの飛んでいない上部の方はB列からM列まではすべて入力されていて抜けはありません
ということなので、B3〜B列最終行のうち、ブランクセルがあるかどうかをチェックすればよいことになるので、↓みたいな感じでどうでしょうか?
Sub さんぷる() Dim 最終行 As Long Dim MyRNG As Range
'▼塗りつぶしを一旦解除 Range("B3:M83").Interior.ColorIndex = xlNone
'▼最終行を取得してデータが入力されているかをチェック 最終行 = Cells(Rows.Count, "B").End(xlUp).Row If 最終行 < 3 Then Exit Sub
'▼B3〜B列最終行までのうちブランクセルを取得 On Error Resume Next Set MyRNG = Range("B3", Cells(最終行, "B")).SpecialCells(xlCellTypeBlanks) On Error GoTo 0
'▼取得されたセルがあるときだけ処理 If Not MyRNG Is Nothing Then Intersect(MyRNG.EntireRow, Range("B:M")).Interior.Color = vbRed MsgBox "行飛びデータがあります" End If
End Sub
(もこな2) 2019/11/03(日) 13:27
大変お忙しいところご教示いただきまして
ありがとうございました。
皆様に教えていただいた素晴らしいサンプルコードを元に
作成してみたいと思います
本当にありがとうございました。
(ちこ) 2019/11/03(日) 17:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.