アプリ版:「スタンプのみでお礼する」機能のリリースについて

恐れ入りますが初心者になります。どうぞよろしくお願いいたします。
VBAの空白行取得で困っております。
具体的には
あらかじめ項目がある表があります。(以下のアルファベットの部分です。)
ごくまれに一行挿入されることがありこの空白行がある時、処理を中断したく下記のように
if文を作りましてテストしておりますが、空白行がある時は中断されますが、空白行がないときも中断してしまいます。

A列,B列,C列
項目行,品名,数量
A,値,値
(一行項目もない空白行)→ここを見つけて中断をしたいです。
B,値,値
C
D

If Trim$(Cells(i行, i列).Value) = "" And Trim$(Cells(i行, 15).Value) = "" Then ※
MsgBox "空白なしです" 
Else
MsgBox "一行空白あります。"
Application.EnableEvents = True
End
End If
↓次に進みます。

※一行空白行と申しますのは、データは横方向に数十列ほどあります。
最後の列までとらえなくとも、
実際はA列から右方向に数十列見れば空白行とみなされれば十分です。
本当に恐れ入りますが、if文ともに、アドバイスいただけないでしょうか?
よろしくお願いいたします。

A 回答 (4件)

#3です


補足を読んで
>空白行は二行あることはありませんが、もし空白行が二行あった場合
一番最終行を見つけることができず、そのようなときはデータを確認するため止めたいとも考えます。

もし空白行が二行あった場合止めるのであればこんな感じかと
変数の使い方を変えてしまいますが、多分大丈夫かと

Dim i行 As Long
Public Const i列 As Integer = 5
Sub test()
i行 = 9
  Do Until Trim$(Cells(i行, i列).Value) = "" And Trim$(Cells(i行, 15).Value) = "" ’条件を考察してください
    i行 = i行 + 1
  Loop
  If Trim$(Cells(i行 + 1, i列).Value) = "" And Trim$(Cells(i行 + 2, i列).Value) <> "" Then
    MsgBox i行 & "行目と" & i行 + 1 & "行目には、空白があります。"
    End
  End If
End Sub

ちなみに何も該当する行がなく実行された場合、変数 i行の値は最終行+1です。
    • good
    • 0
この回答へのお礼

Qchan1962様
お世話になっております。
自身が未熟なのにもかかわらず
丁寧に皆様ご親切に有難うございます。

勉強にもなりまして本当に有難うございました。
ありがたいアドバイスをもとに、動作の確認を含めて、理解を深めてまいりたいと思います。


Qchan1962様をはじめ、皆様本当に暖かいアドバイスをありがとうございました。

お礼日時:2020/08/14 18:05

こんにちは、


Trim$で、いくつかのセルに空白があるかを確認する場合、
Forなどで範囲をループするかAndで条件を増やす事になりますね。(1セルのみだと誤判定のリスクがある場合)
i行, i列各変数がカウント変数ならループとANDを両方使っている事になります。
もちろん、処理が増えるのは良くないと思いますが、、、判定には問題無いと思います、
ご質問のコードの場合、2つの条件がTrueならと言う事になるので少し違うような、、、

ご提示のコードのみでは、どこに判定ミスがあるのかわかりません。

>実際はA列から右方向に数十列見れば空白行とみなされれば十分です。
であれば、And Trim$(Cells(i行, 15).Value) = "" は、不要かもしれません
また、Forで空白セルを複数個確認して判定する場合、カウント用の変数が必要になります。

例を挙げずに答えるのが下手なので、

例えばこんな感じです
Dim i行 As Long, i列 As Integer, cnt As Integer
For i行 = 2 To 20       'Cells(Rows.Count, 1).End(xlUp).Row
    For i列 = 1 To 10
      If Trim$(Cells(i行, i列).Value) = "" Then
        cnt = cnt + 1
        If cnt = 9 Then
          MsgBox i行 & "行目には、空白があります。"
          Exit Sub '空白行があったので処理を終了します。
        End If
      Else
        cnt = 0
      End If
    Next i列
  Next i行
  MsgBox "空白なしです"
  Application.EnableEvents = True

9つのセルすべてが ""の場合判定がTrueになります。(数は10以下ならいくつでも条件に合わせて)

判定条件が =なのでMsgBox "空白なしです" は間違いかと思います。

また、ExcelであるならApplication関数を使用した方が良いかも知れません。
一例

Dim i行 As Long, i列 As Integer, cnt As Integer
For i行 = 2 To 20 'Cells(Rows.Count, 1).End(xlUp).Row
If Application.CountIf(Range(Cells(i行, 1), Cells(i行, 10)), "") > 9 Then
MsgBox i行 & "行目には、空白があります。"
Exit Sub
End If
Next i行
MsgBox "空白なしです"
Application.EnableEvents = True
    • good
    • 0

これはfor文内のロジックでしょうか?


そうだとして

Trim$(Cells(i行, i列).Value) = ""

これだとCells(1,1)、Cells(2,2)……と、横にもズレていってませんか?
例えば10列の表の場合、どれだけ表の行数があろうと「Cells(11,11)」は空白になるはずです。

Trim$(Cells(i行, 15).Value) = ""

15列目を空白行の判定に使っている理由は何でしょうか?
    • good
    • 0
この回答へのお礼

自分で試している現在はif文になっております。
ご指摘本当に有難うございます。
やりたいこととif文がうまくかけておらずすみません。

文章にいたしますと

データ開始i行から上から下に見ていいって
i列から15列目までみてすべて空白の時
空白があります。 
処理を終了(※)
そうでない時は
次の処理に進みたいです。
最後の
End If
↓次に進みます。

次に進むところまでまとめて構文かきますと
If Trim$(Cells(i行, i列).Value) = "" And Trim$(Cells(i行, 15).Value) = "" Then ※
MsgBox "空白なしです" 
Else
MsgBox "一行空白あります。"
Application.EnableEvents = True
End
End If
Do Until Trim$(Cells(追加行, 日付列).Value) = "" And Trim$(Cells(追加行, 品名列).Value) = ""
と続きます。

Trim$(Cells(i行, 15).Value) = "" and
は私の書き方がandになっておりますので、こちらは本来範囲にしたいのですが、うまく書けずにいます。

(※)の空白行を見つけたときの処理についての補足です。
空白行は二行あることはありませんが
もし空白行が二行あった場合
一番最終行を見つけることができず、そのようなときはデータを確認するため止めたいとも考えます。

宣言の一部です
Public Const データ開始i行 As Long = 9
Public Const i列 As Integer = 5
Dim 追加行 As Long

ロジックを含めて不慣れでありますが、アドバイスよろしくお願いいたします。

お礼日時:2020/08/14 10:59

例えばA列だけを判定基準とするのなら、



If Trim$(Cells(i行, "A").Value) = "" Then '※ i行って変数と考えていいのですよね?
MsgBox "一行空白あります。"
Application.EnableEvents = True
End
End If

とか?
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。
見ず知らずの私の相談にも関わらず
丁寧にアドバイス有難うございます。
はい。i行は変数になります。
アドバイスいただいた通り、行ってみます。
すぐのご連絡本当に有難うございます。

お礼日時:2020/08/13 23:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!