恐れ入りますが初心者になります。どうぞよろしくお願いいたします。
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文ともに、アドバイスいただけないでしょうか?
よろしくお願いいたします。
No.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です。
Qchan1962様
お世話になっております。
自身が未熟なのにもかかわらず
丁寧に皆様ご親切に有難うございます。
勉強にもなりまして本当に有難うございました。
ありがたいアドバイスをもとに、動作の確認を含めて、理解を深めてまいりたいと思います。
Qchan1962様をはじめ、皆様本当に暖かいアドバイスをありがとうございました。
No.3
- 回答日時:
こんにちは、
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
No.2
- 回答日時:
これはfor文内のロジックでしょうか?
そうだとして
Trim$(Cells(i行, i列).Value) = ""
これだとCells(1,1)、Cells(2,2)……と、横にもズレていってませんか?
例えば10列の表の場合、どれだけ表の行数があろうと「Cells(11,11)」は空白になるはずです。
Trim$(Cells(i行, 15).Value) = ""
15列目を空白行の判定に使っている理由は何でしょうか?
自分で試している現在は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
ロジックを含めて不慣れでありますが、アドバイスよろしくお願いいたします。
No.1
- 回答日時:
例えばA列だけを判定基準とするのなら、
If Trim$(Cells(i行, "A").Value) = "" Then '※ i行って変数と考えていいのですよね?
MsgBox "一行空白あります。"
Application.EnableEvents = True
End
End If
とか?
ご連絡ありがとうございます。
見ず知らずの私の相談にも関わらず
丁寧にアドバイス有難うございます。
はい。i行は変数になります。
アドバイスいただいた通り、行ってみます。
すぐのご連絡本当に有難うございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) 【VBA】Excelで罫線を引きたい 3 2022/07/14 12:04
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) VBA エクセル 条件の設定 1 2022/03/28 10:24
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
Cellsのかっこの中はどっちが行...
-
エクセルVBAにて =A1=B1とすれ...
-
VBマクロ 色の付いたセルを...
-
エクセルVBA intersect colu...
-
Worksheets メソッドは失敗しま...
-
文字列の結合を空白行まで実行
-
エクセルVBA シートモジュール...
-
【補足欄が足りなかったため、...
-
VBA 値と一致した行の一部の列...
-
vba 2つの条件が一致したら...
-
マクロ 関数を使った抽出でエラ...
-
【VBA】2つのシートの値を比較...
-
C# dataGridViewの値だけクリア
-
エクセル VBA ユーザーフォー...
-
別シートから年齢別の件数をカ...
-
グリッドの列の最大値を求めたい。
-
VBAで条件から範囲を指定して色...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
エクセルVBAにて =A1=B1とすれ...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
-
マクロについて。S列の途中から...
-
VBA UserFormからの転記で
-
targetをA列のセルに限定するに...
おすすめ情報