質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

2159閲覧

範囲指定した行を削除

VBA_Beginner_yu

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/09/04 09:41

vbaでA列に値がない行全体を削除したいのですが、
以下コードが反応していないことがわかりました。
※反応しなかったコードだけ抜粋してます。

私の認識では、以下コードで1~2行目は削除の対象外としているはずです。

Dim i As Long Dim lastRow As Long lastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To lastRow If Cells(i, 1).Value = "" Then Range(Cells(i, 1) & i).EntireRow.Delete End If Next i

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/09/04 10:09

反応しないとは、どのような状態のことでしょうか? ご提示のコードでは”連続する空白”を削除しないと思いますが、そのことでしょうか?
VBA_Beginner_yu

2020/09/04 14:12

"連続する空白"を削除しないになってるんですね・・・ A列、C列に連続して値が入っていて、A列に値がなくなった(空白になった)場合に、値がなくなった行以降削除する、というコードにしたつもりでした・・・ もう少し考えます。。
hatena19

2020/09/04 22:34

実行前ののシートのデータ例、 実行後の期待する結果と現状の結果を 表形式で書くか、スクリーンショット画像をアップロードしてもらうと誤解なく伝わると思います。
guest

回答3

0

まずは、提示のコードでは下記でエラーになり実行できませんね。

vba

1 If Cells(i, 1).Value = "" Then 2 Range(Cells(i, 1) & i).EntireRow.Delete '←この行で"Rangeメソッドは失敗しました"エラー 3 End If

あと対象シートは省略しないようにしましょう。

vba

1 If ws1.Cells(i, 1).Value = "" Then 2 ws1.Cells(i, 1).EntireRow.Delete 3 End If

とりあえずこれを修正してから、やりたいことをもう少し具体的に説明してください。

範囲指定した行を削除

 

vbaでA列に値がない行全体を削除したいのですが、

 

A列、C列に連続して値が入っていて、A列に値がなくなった(空白になった)場合に、値がなくなった行以降削除する

タイトル、質問、修正依頼へのコメント で3つの命題がありますが、言葉通りに解釈するとそれぞれ意味が異なりますよね。実際にやりたいことはなんでしょうか。

A列、C列に連続して値が入っていて、A列の途中の行の値を削除したときに、その行から下の行をすべて削除したいということでしょうか。

それとも、A列に値がない行のみを削除したいということでしょうか。

元データ

タイトル
サブタイトル
項目1項目2項目3
1a
2b
c
d
5e
6f

実行後のデータ

理想1

タイトル
サブタイトル
項目1項目2項目3
1a
2b
5e
6f

理想2

タイトル
サブタイトル
項目1項目2項目3
1a
2b

やりたいことは「理想1」「理想2」のどちらでしょうか。あるいは上記以外でしょうか。
その場合は、上記のように表形式で提示するか、スクリーンショットをアップロードしてください。

投稿2020/09/05 00:34

編集2020/09/05 01:08
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

提示のコードでは、

例えば、5行目が空白だった

削除

元の6行目が5行目、7行目が6行目に移動

6行目を削除

というような流れになるので、
元の6行目のデータが残ってしまいます。

一般的に行の削除・挿入は、
下から処理していくのが定石となっています。
下から処理していけば、次移行を処理するときに
上方向は削除・挿入の影響を受けませんので、
処理の漏れがなくなります。

また、空白セルはジャンプの機能で一括で検索可能となっています。
そちらの機能を使うと、vbaでマクロのループを書かなくて良くなります。

が、1,2行目が空白でないということであれば、
操作対象から外す工夫が必要ですし、
逆に検索対象(空白セル)がない場合はエラーになりますので、
エラーの回避対策も必要になります。

まずは手動での操作の確認と、その操作をマクロの記録機能でvbaのコードに翻訳してもらい、
コードを探ってみてください。
その後がうまく処理できなければ続きで聞いてください。

投稿2020/09/04 23:25

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

A列、C列に連続して値が入っていて、A列に値がなくなった(空白になった)場合に、値がなくなった行以降削除する、というコードにしたつもりでした・・・

lastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Row
lastRowに A列の最終行を取得

For i = 3 To lastRow
3行目からlastRow(A列の最終行)までループ
・・・ということはA列にデータがある3行目からA列の最終行までループしている。

よって
If Cells(i, 1).Value = "" Then
この条件は常にFalseになるので

Range(Cells(i, 1) & i).EntireRow.Delete
が実行されることはありません。(Rangeの引数がおかしいのは置いておく。。。)

lastRowの次の行以降を削除する必要があります。

VBA

1 Dim lastRow As Long 2 Dim ws1 As Worksheet 3 4 Set ws1 = ActiveSheet 5 6 With ws1 7 ' A列の最終行取得 8 lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 9 10 If (lastRow + 1) >= 3 Then 11 ' A列の最終行の次の行以降を削除 12 .Range((lastRow + 1) & ":" & .Rows.Count).Delete 13 End If 14 End With 15 16 Set ws1 = Nothing

投稿2020/09/04 16:14

編集2020/09/04 17:22
Y.H.

総合スコア7918

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VBA_Beginner_yu

2020/09/07 06:12

コメントありがとうございます。 ご丁寧に説明付きで助かりました。 3行目から最終行までをループしているということだったんですね。。。 範囲指定も奥が深いですね・・・
Y.H.

2020/09/07 06:28

ソースコードにコメント入れてられないようですが、 コメントを記述することをお勧めします。 やりたいことと、やっていること(コード)の違いに気づきやすくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問