Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
行数が増減する表の入力チェック
投稿日時: 21/03/14 21:42:40
投稿者: あかつきさん2021

お世話になります。
 
行数が増減する表の入力チェックをVBAで作成しています。
空欄ならセルの色を黄色にしています。
 
' データが入力されている最終行
      MsgBox Cells(Rows.Count, 15).End(xlUp).Row
         
             
        For i = 3 To Cells(Rows.Count, 15).End(xlUp).Row
            If Cells(i, 15).Value = "" Then
                Cells(i, 15).Interior.ColorIndex = 6
            End If
        Next i
 
上記のコードだと最終行にデータが入力されていなかったらセルが黄色くなりません。
アドバイスいただけないでしょうか。
 
よろしくお願いいたします。

回答
投稿日時: 21/03/14 22:04:08
投稿者: WinArrow
投稿者のウェブサイトに移動

>Cells(Rows.Count, 15).End(xlUp).Row
 
このコードは、最終行を求めるコードです。
意味は、データが入っているセルの最終行の行番号が返ります。
従って、空白セルは、最終行にはなりません。
 
なにか勘違いしていませんか?
Msgboxでデータの最終行を表示していますが、
その値は意図する値でしょうか?
 
 
 

回答
投稿日時: 21/03/14 23:02:57
投稿者: WinArrow
投稿者のウェブサイトに移動

データの最終行で
入力漏れをチェックしているのでしょうか?
 
先ほどのレスと重複しますが、
それではチェックにならないと思います。
 
例えば、今回(または、本日)、入力すべきデータの件数を
先にどこかのセルに入力しておいて
その値とデータの最終行を比較する
というようなことを考えてみてはいかがでしょうか?
 
若し、これができるのでしたら
条件付き書式を設定すル方法もあります。

回答
投稿日時: 21/03/14 23:20:54
投稿者: WinArrow
投稿者のウェブサイトに移動

参考までに、
条件付き書式で適用先(適用範囲)を可変にする方法
  

B1〜Bxx
に条件付き書式を設定する方法です。
前提:データ件数をセルD1に入力する。
ですからデータ件数の増減に合わせてD1セルを変更します。
  
B1セルを選択して
条件付き書式を選択
セルの値で「空白」を選択しますやすい。
セルの背景色はお好みで
この状態で登録します。
  
次に条件付き書式のルールの管理を開きます。
適用先を次のように変更します。
=INDIRECT("B1:B"&D1)
データ入力すると背景色は消えます。
  
これ以外の方法もあると思いますが、
取り敢えず試してみてください。
この方法でしたら、途中のセルが空白もチェックできます。

回答
投稿日時: 21/03/14 23:53:26
投稿者: simple

すでに適切な回答を頂いていますが、若干追加する部分もありますので、あえて。
最終列の取得方法がポイントですね。
複数列がある場合は、どの列で、その手法を適用するかが問題になります。

     A列     B     C
1行    1     5     7
2      2     6     8
3      3           9
5      4
というようなデータがあるときに、
B列やC列で最後の行を判定してはマズイですよね。
この場合はA列で最終行を求めればよいわけですよね。
 
15列目がチェックしたい列だとしても、
最終行の判定に15列目を使わないといけないことはない、
そんな義理はないし、この場合は裏目に出ているわけです。
もっと別の列で、そうした適当な列があるのであれば、話は簡単です。
ちょっとした勘違い、という話で終わりですね。
 
■しかし、もしそういうことが事前に分からないということであれば、
その場合にどうするか。ちょっと外れるかもしれないがメモしておきます。
(1)
Sub test1()
    Dim rng As Range
    Set rng = Range("A1").CurrentRegion
    MsgBox rng(rng.Count).Row
End Sub

なんていうので、うまくいくことも多いです。
まったく空白の行や列は無いということであれば、結構上手くいきそうです。
 
(2)さらに、こんな方法も。
A1セルから、空白以外のセルを検索します。
・逆の方向に(SearchDirection:=xlPrevious)
・行に沿った方向に(SearchOrder:=xlByRows)
検索すると、A1セルからワープして、いったんシートの最後のセルから、
行方向に沿って、下の行から上の行に順次検索していきますから、
それでマッチしたセルの行が、データのある最後の行ということになります。
これは確実にデータのある最終行が求まります。
Sub test2()
    Dim rng As Range
    Dim lastRow As Long
    
    Set rng = Cells.find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
        MatchCase:=False, MatchByte:=False, SearchFormat:=False)
    lastRow = rng.Row
End Sub
ちょっと直ぐには理解しにくいかもしれませんが、
比較的よく使われるテクニックです(と勝手に想像している)。
参考にしてください。

回答
投稿日時: 21/03/15 08:24:12
投稿者: WinArrow
投稿者のウェブサイトに移動

>複数列がある場合は、どの列で、その手法を適用するかが問題になります。
ちょっとそこまで気が回りませんでした。
 
入力チェック方法として、
行数を使う方法もあります。
その場合、Simpleさんのレスは、有効な方法です。
しかし、このマクロをどのようなタイミングで実行するかです。
 
入力規則を使うと、当該セルからカーソルが離れる時に
チェックする方法もあります。(つまりリアルタイム)
 

投稿日時: 21/03/15 09:35:33
投稿者: あかつきさん2021

WinArrowさん
simpleさん
 
アドバイスありがとうございます。
 
入力規則でやってみます!