Excel2003を使用しています。
システムからCSVで落としたデータで、データの並び方に規則性があるので、それを利用して、不要部分のデータをマクロで削除できないかと思い、質問させていただきます。
A列に『累計』を含む文字があった場合、その行のD列が0だったら、その行より上の行のA列に『計上日』と入力されている行までを削除するということをしたいです。
下記でいうと、2~5行までを削除したいです。
A B C D
1
2 計上日
3
4
5 累計 0
6
7 計上日
8
9 累計 1000
上記では、B列、C列には何も書いていませんが、実際はデータが入力されていたり、空欄だったりです。
D列が0の行を削除するコードはわかるのですが、さらに、条件が加わっても同じように処理は可能でしょうか?
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
こんなマクロでもできそうです。
念のため元のシートをコピーしてから実行するようにしましたSub Macro1()
Dim idx As Long
Dim rng As Range
Application.ScreenUpdating = False
ActiveSheet.Copy after:=ActiveSheet
For idx = Range("A65536").End(xlUp).Row To 1 Step -1
If Cells(idx, "A") = "計上日" Then
Set rng = Range(Cells(idx, "A"), Cells(65536, "A")).Find(what:="累計", LookIn:=xlValues, lookat:=xlWhole)
If Not rng Is Nothing Then
If rng.Offset(0, 3).Value = 0 Then
Range(Rows(idx), Rows(rng.Row)).Delete
End If
End If
End If
Next idx
Application.ScreenUpdating = True
End Sub
>さらに、条件が加わっても同じように処理は可能でしょうか?
できると思いますが、その条件が指定されないとマクロは書けません。
ご自身で工夫してみてください。
あまりお急ぎの質問ではないようですが、その「工夫」を更に求めたいなら補足は早めにお願いします。
何日も経ってから補足されても再度巡回する保証はありませんので…
回答ありがとうございます。
教えていただいたマクロで試してみたところ、うまくいきました。
>さらに、条件が加わっても同じように処理は可能でしょうか?
>できると思いますが、その条件が指定されないとマクロは書けません。
>ご自身で工夫してみてください。
書き方が紛らわしかったようで、申し訳ありません。
“D列が0の行を削除する”という条件に、今回のようにもうひとつ条件が加わっても…という意味で、書いていたつもりでした。
今回は教えていただいたコードを参考にさせていただき、無事完成しました。
ありがとうございました。
No.4
- 回答日時:
ロジックの一例
ForNextでやると、行削除は最下行からやるほうが都合がいい。
コード
データのあるシートをアクチブシートにして実行。
Sub tet01()
d = Range("A65536").End(xlUp).Row
For i = d To 2 Step -1
If dl = "Y" And Cells(i, "A") = "計上日" And dl = "Y" Then
'この行が計上日で、累計行 AND D列0が先にあり(dl=”Y")なら
MsgBox i & "-" & x & " 削除処理"
Rows(x & ":" & i).EntireRow.Delete
dl = "N" '累計とのペアー待ち状態解消
End If
If Cells(i, "A") = "累計" And Cells(i, "D") = 0 Then
dl = "Y" 'D列0で累計行現れた
x = i 'その行を記憶
End If
Next
End Sub
ーーー
例データ 質問者の意図に沿わない部分があるかも知れないが、ご容赦を
A列 B列 D列
集計計数
1
計上日
3
4
累計0<ーーD列,以下累計の跡の数字はD列
計上日
5
6
累計11
計上日
7
8
累計0
12
計上日
13
14
累計0
15
計上日
16
17
累計20
計上日
18
累計1000
ーーー
結果
集計計数
1
計上日
5
6
累計11
12
15
計上日
16
17
累計20
計上日
18
累計1000
ーー
少数例のテストしかやってないこと、
万一ロジックの不完全があるかも知れないが、コード数は少ないと思う。
回答ありがとうございます。
>ForNextでやると、行削除は最下行からやるほうが都合がいい。
手元にある参考書にも同様のことが書いてありました。
教えていただいたコードでも、うまくいきました。
MsgBox で、1回1回の削除の状態を確認できて、分かりやすかったです。
ありがとうございました。
No.2
- 回答日時:
これでどうでしょう?
至極単純に作りましたが・・・
Sub Macro1()
Range("A:A").Select
endline = Selection.Find( _
What:="累計", _
After:=ActiveCell, _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False _
).Row
n = 1
Do Until n = endline
If Cells(n, 1) = "計上日" Then
a = Cells(n, 1).Row
End If
If Cells(n, 1) = "累計" And Cells(n, 4) = 0 Then
Range(Cells(a, 1), Cells(n + 1, 1)).EntireRow.Delete
n = n - (n - a)
End If
n = n + 1
Loop
End Sub
回答ありがとうございます。
教えていただいたコードで試してみたところ、うまくいきました。
Do Until ~ Loopステートメントを使用してもできるのですね。
あまり使い慣れていないので、勉強になります。
ありがとうございました。
No.1
- 回答日時:
こんにちは。
以下のマクロを試してみてください。
Sub 削除()
Dim mR As Long
Dim wR As Long
Dim sR As Long
'
With ActiveSheet
mR = Range("A" & Rows.Count).End(xlUp).Row
For wR = mR To 1 Step -1
If .Cells(wR, "A") = "累計" Then
If .Cells(wR, "D") = 0 Then
'開始行を求める
sR = Get_StartRow(wR)
.Rows(sR & ":" & wR).Delete Shift:=xlUp
wR = sR
End If
End If
Next
End With
End Sub
'
'開始行を求める
Function Get_StartRow(wI As Long) As Long
Dim wR As Long
'
Get_StartRow = 0
With ActiveSheet
For wR = wI To 1 Step -1
If .Cells(wR, "A") = "計上日" Then
Get_StartRow = wR
Exit For
End If
Next
End With
End Function
回答ありがとうございます。
記載していただいたマクロを試してみたところ、うまくいきました。
Functionプロシージャは、ここでも何度か教えていただいたことがあるものの、自分で記述するところまではまだまだです。
おかげさまで、勉強になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル・スプレッドシートで、一定数を超えたらゼロから再累計する方法 8 2022/05/28 03:52
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセルのVBAにショートカットキーの割り当て 3 2022/07/13 14:19
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Excel(エクセル) 列を自動で追加したい 3 2022/07/11 12:58
- Visual Basic(VBA) Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、 2 2022/09/01 23:57
- Visual Basic(VBA) 【VBA】もし、値が0だったら左のセルと合わせて削除したい 3 2023/04/20 10:12
- Visual Basic(VBA) EXCEL VBAでA列にある空白行より下の行すべてを削除する方法を教えてください。 3 2023/02/17 07:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access 最後のレコードに到達...
-
パソコンのパーツの勘定科目に...
-
経費計上時期について
-
確定申告 保証金の扱い
-
シャッターを交換した場合の経...
-
タンクローリーの交換代
-
【貸借対照表について】 前払保...
-
なんでこのパソコンはこんなに...
-
自動車税の前払処理 5月末決算...
-
刈払機の燃料は光熱費でいいの...
-
屋外簡易トイレの勘定科目…
-
機械装置の据付費に含まれるもの
-
建退共の証紙。 購入のときの...
-
車の整備費(6ヶ月点検、車検な...
-
法人税別表4について
-
納税充当金の残高が残ってしま...
-
リース契約期間終了時に買取し...
-
アパート入居時・退去時の勘定...
-
(税務)仮払税金認定損とはど...
-
受講証紙代の処理について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access 最後のレコードに到達...
-
シャッターを交換した場合の経...
-
経理用語で「計上」と「「振替...
-
パソコンのパーツの勘定科目に...
-
稲作農業における年貢での地代...
-
従業員への退職金
-
予算書
-
医療費控除の交通費、新幹線代...
-
飲食店移転費用の税金について
-
車両運搬費への計上について
-
町内会の予算の作り方
-
経費計上時期について
-
本年中の償却期間について お詳...
-
簿記について質問です。 損益計...
-
タンクローリーの交換代
-
日銀の負債に計上される項目つ...
-
会社設立日と事業開始日
-
松本さんのホテル代の勘定科目は
-
パソコンの減価償却費の計算方法
-
エステサロンの勘定科目について
おすすめ情報