Excel VBAを使用して2行ずつ行の削除をし、1行残して(3行目を残す)また2行ずつ行の削除、1行残しす(6行目を残す)をループして行う方法が知りたいです。
イメージとしては以下のような感じです。
━━【A】━━━━
【1】あいうえお
【2】かきくけこ
【3】さしすせそ
【4】たちつてと
【5】なにぬねの
【6】はひふへほ
【7】まみむめも
【8】やゆよ
【9】らりるれろ
━━━━━━━━━
↓マクロ実行後↓
━━【A】━━━━
【1】さしすせそ
【2】はひふへほ
【3】らりるれろ
━━━━━━━━━
当方VBA初心者ですので、できるだけわかりやすくご教授頂けると助かります。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
標準モジュールに貼りつけて動かしてみてください。
下から削除とか、上から一つずつ削除するという方法も考えられますが、まとめて削除するほうが、理屈は楽なはずです。
If i Mod 3 <> 0 Then
これで、3で割り切れる数以外のものを削除対象にします。
最初に、rng を取るのは、その範囲の何行目という理屈からです。つまり、A2 でも、A3でも、そこが最初だったら、1行目になるということです。
'//
Sub Test1()
Dim rng As Range
Dim uRng As Range
Dim i As Long
Set rng = Range("A1").CurrentRegion.Columns(1)
With rng
For i = 1 To rng.Rows.Count
If i Mod 3 <> 0 Then
If uRng Is Nothing Then
Set uRng = .Cells(i, 1)
Else
Set uRng = Union(uRng, .Cells(i, 1))
End If
End If
Next i
End With
''A列の中から削除
uRng.Delete Shift:=xlShiftUp
''行全体を削除
'uRng.EntireRow.Delete Shift:=xlShiftUp
Set rng = Nothing
End Sub
No.10
- 回答日時:
初心者は、頭の中からコードはしばらくしないと書けませんよね?。
どのコマンド、構文を使ったらいいかすらわからないはず。
「with」「DOの後判定」等使うのはまだまだ早い。
回答で、「do~loop」はどういう意味かはわかることになるが、
以後、「・・・」はどのコマンド?、という逆の辿り方はわからないだろう。
だから、また迷ってしまう人が多い。
『初心者』というにも幅広いとは思う。
どこまで知ってて、どのあたりがわからないかは
はっきりした方がより良い。
No.9
- 回答日時:
プログラムで、自分で頭の中で考えたものを、具体化してコードを書かなければ、見えてこないのがあります。
'//量が少なければ、上からした所で関係ありません。
Sub Test2()
Dim i As Long, j As Long
i = 1: j= 1
Do
If j Mod 3 <> 0 Then
Cells(i, 1).EntireRow.Delete
Else
i = i + 1
End If
j = j + 1
Loop Until Cells(i, 1).Value = ""
End Sub
'//
'オートフィルタでも、大量の場合は失敗します。
Sub Test3()
Dim rng As Range
Dim lastCol As Long
Set rng = Range("A1").CurrentRegion
With rng
lastCol = .Cells(.Cells.Count).Column
End With
Application.ScreenUpdating = False
rng.Offset(, lastCol).Resize(, 1).Formula = "=IF(MOD(ROW(A1),3)=0,1,"""")"
rng.Resize(, lastCol + 1).AutoFilter Field:=lastCol + 1, Criteria1:="="
With ActiveSheet.AutoFilter.Range
.SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlShiftUp
End With
rng.Offset(, lastCol).Resize(, 1).ClearContents
ActiveSheet.AutoFilterMode = False
Application.ScreenUpdating = True
End Sub
'//大量の場合
Sub Test4()
Dim rng As Range
Dim lastCol As Long
Set rng = Range("A1").CurrentRegion
With rng
lastCol = .Cells(.Cells.Count).Column
End With
Application.ScreenUpdating = False
With rng.Offset(, lastCol).Resize(, 1)
.Formula = "=IF(MOD(ROW(A1),3)=0,1,"""")"
.Value = .Value
End With
With rng.Resize(, lastCol + 1)
.Sort Key1:=rng.Cells(1, lastCol + 1), Order1:=xlAscending, Header:=xlNo
End With
i = rng.Offset(, lastCol).Cells(1).End(xlDown).Offset(1).Row
rng.Offset(, lastCol).Resize(, 1).ClearContents
Range(rng.Cells(i, 1), rng.Cells(rng.Rows.Count)).ClearContents
Application.ScreenUpdating = True
End Sub
No.8
- 回答日時:
こんにちは。
そもそも論ですが。
せっかく入力したデータを削除するというのがそもそもおかしなことで、
そのようなシステム設計が最初からおかしいと思います。
見直しをしてもよいでしょう。
不要ならば消したように見せる、必要なデータだけを取り出して利用する
がこのような場合の常套手段だと思います。
その際にフィルタオプションやクエリは強力な手段となります。
よく印刷書式そのままのシートに入力させる、という手法がとられますが
入力は入力用のシートで行い、結果は結果専用のシートで見せる
というやり方を私はよくとります。
No.7
- 回答日時:
━━【A】━━━━
【1】あいうえお
【2】かきくけこ
【3】さしすせそ
【4】たちつてと
【5】なにぬねの
で
1行目、2行目と処理を考えた場合
1行目→物理削除のとき
━━【A】━━━━
【2】→【1】かきくけこ
【3】→【2】さしすせそ
【4】→【3】たちつてと
【5】→【4】なにぬねの
と考えてしまいます。
さらに、
2行目→削除のとき
2行目になった『【3】さしすせそ』は削除対象、ということで、
本来残るべき行を消してしまう恐れあります。
物理的に『行削除』というのは、対象セルが動的になるので
ややこしくさせます。
なお
【6】はひふへほ
【7】まみむめも
【8】やゆよ
【9】らりるれろ
━━━━━━━━━
の後ろからするにしても
『【9】らりるれろ』が1番目2番目削除3番目残す、の
『削除行』なのか『残す行』なのかが分かっていないといけません。
ここにもややこしくさせている感じがあります。
どこまで行があるのか、も必要です。
『【8】やゆよ』を消したあと、
【6】はひふへほ
【7】まみむめも
【9】らりるれろ
━━━━━━━━━
となるでしょうから、
『【7】まみむめも』
を消すかどうかは【8】の影響少なく判断しやすいです。
そういう意味で後ろからがよく使われます。
いずれにしてもロジックを整理しないと、
初心者には、単純なようで単純でないと思います。
普通は、
"1" "削除" 【1】あいうえお
"2" "削除" 【2】かきくけこ
"3" "残す" 【3】さしすせそ
"1" "削除" 【4】たちつてと
"2" "削除" 【5】なにぬねの
マーク(削除行を確定)することから考えます。
削除が目的なら、
"3" "残す" 【3】さしすせそ
"1" "削除" 【1】あいうえお
"2" "削除" 【2】かきくけこ
"1" "削除" 【4】たちつてと
"2" "削除" 【5】なにぬねの
と(エクセルの機能で)並べ替えできるので、
以後はマクロでなくてもまとまって消すことができます。処理効率も早いです。
物理行削除は、エクセルの処理を遅くさせる事例があるので、
大量データを扱えば明らかに処理速度差が出ます。
学習のため、という分には数行物理削除を使ってもいいでしょうが、
業務等には使えません。
No.6
- 回答日時:
#4のimogasiさんへ
失礼します。気になったので。
基本的に行削除は上からやると失敗します。
削除するたびにExcelが行番号を付け替えるので。
したがってもしループしながら行削除をするなら基本的に下からやるべきです。
しかし、もっと大切なことは、
「行削除とか列削除のような作業はExcelにとってとても負荷のかかる作業である」
ということを踏まえ、ループでやるべきでない
ということです。
というわけであらかじめ削除対象となる行を特定した後、
一気にやるべきです。
UNION使用も1つの方法ではありますが、対象の個数がある値を超えると
劇的に遅くなると聞いたことがあります。
したがって「削除対象をフィルタでとらえ、一気に削除」がお薦めです。
失礼しました。
No.5
- 回答日時:
こんなこと聞く前に、フローチャートをまず書いてみるのが先でしょう。
作業手順、間違った指導を受けているだろうから改善するべき。基本的なとこから進める。
コードを見せても本人のためにならない感じ。
考える課題はほかにもある。
繰り返しさせる構造は当然考えるとして
終了条件は3番目、3でわりきれる時とは限らない。ので、空振りの無駄がなくおわるのがより良い。
削除して1、2、3、と連番付けたいとしても、それは後回しでも良い。
応用としては、
削除でなく結果はシート2に作るようにしてみる。
No.4
- 回答日時:
For Nextループでループ変数が行番号 の i とする。
Sub test01()
d = 10 '最終行の行番号
For i = 3 To d Step 3 '第3行目が最初の削除行とする
MsgBox i 'ここへ行削除のコードを入れる
Next i
End Sub
これで何処が都合が悪いのか。
上記で良いなら、こんなところの質問に適さないと思うことほどの基礎的なことだと思うが。
No.3
- 回答日時:
単純に1行目ならカウント1、2行目ならまたカウントして2、3行目なら残すからカウントクリア、この繰り返し。
まずはこの組み立てができるようにならないといけない。3で割るや3ずつ移動、これは上記を効率よくしたものだから、まだ書けない人にはさらに簡単な記述をした方がいいでしょう。
何がわからないのか、明確に。
削除行の判断か
繰り返しか
セルの値の表現か
FOR文とかの命令を見つけるに至るまでがわからないなら、コードを見ても悩みは消えない。今後の新たな仕掛けは解決できないのではないでしょうか。
また「.DELETE」を使うと処理遅くなるので大量に扱うときは使わない方が良いです。
No.1
- 回答日時:
Sub 行削除()
Dim I As Long
Dim 削除行 As Range
Set 削除行 = Range("A1")
For I = 1 To Cells(Rows.Count, "A").End(xlUp).Row Step 3
Set 削除行 = Union(削除行, Cells(I, "A").Resize(2))
Next I
削除行.EntireRow.Delete
End Sub
【処理概要】
削除する行を「削除行」のRange変数に蓄えて、最後に一気に削除します。
【補足説明】
・Cells(Rows.Count, "A").End(xlUp).Row
入力されている最終行を取得
・Union(削除行, Cells(I, "A").Resize(2))
2行ずつ「削除行」に範囲を蓄積(A列の行のみ)
・削除行.EntireRow.Delete
A列だけの行を全行に変更(EntireRow)し削除(Delete)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Yahooフリマってどれくらい時間...
-
もう関わりたくない人がいたらL...
-
VBA:Openステートメントで開い...
-
インスタグラムのギャラリーの...
-
喧嘩をしてLINE削除され、 また...
-
【エクセル】セル内の右側のみ...
-
Facebookメッセンジャーの不具合
-
ブラウザを閉じた時にCOOKIEを...
-
エクセルの右クリックで行削除...
-
マクロで特定の行まで削除する...
-
【ExcelVBA】指定のシート以外...
-
EXCELの列複数削除
-
指定した文字があった場合、そ...
-
ハメ撮りが流出したら
-
エクセル:右クリックすると出...
-
エクセルで住所の混在する「丁...
-
Accessの削除クエリについて
-
MACからBootCampを削除したいが...
-
ウェブページへのアクセス不可 ...
-
すべてやりきった、大満足を意...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えてgooの裏事情
-
Yahooフリマってどれくらい時間...
-
Facebookメッセンジャーの不具合
-
もう関わりたくない人がいたらL...
-
VBA:Openステートメントで開い...
-
喧嘩をしてLINE削除され、 また...
-
指定した文字があった場合、そ...
-
これはやらせですよね?
-
何回ぐらい質問を削除されると...
-
エクセルで住所の混在する「丁...
-
BOX Fresh で質問に回答したの...
-
(Access)複数条件の重複デー...
-
アクセスにおいて間違って削除...
-
インスタアカウント、前の携帯...
-
エクセルVBAで行削除時にエラー...
-
ウェブページへのアクセス不可 ...
-
告白してフラれた相手の連絡先...
-
google chromeのブックマークが...
-
女友達にLINEしたら、既読スル...
-
すべてやりきった、大満足を意...
おすすめ情報