Excelでの対象範囲行削除方法について
- ExcelのVBAマクロを使って、指定の条件で特定の範囲の行を削除する方法について質問です。
- 質問者はAセルに入っている文字列で比較し、範囲を抽出するマクロを作成したいと思っています。
- 具体的な例を挙げて説明すると、Aセルのデータの中で特定の見出し行から次の見出し行の1行前までの範囲を抽出したいということです。
- ベストアンサー
excelでの対象範囲行削除
excel2010 Aセルに入っている文字列で比較し、範囲抽出するマクロを作成しょうとしています。 何をやりたいかは、次の通りです。 Aセルに見出しがついた行を先頭に、次の見出しの1行前までを 行で抜出したいのです。 例 下記はAセルのデータのみを表示しています。 1行目 TEST_a 2行目 3行目 4行目 TEST_b 5行目 6行目 7行目 8行目 TEST_c 9行目 10行目 TEST_d 11行目 1~3行までを1つ目、4~7行を2つ目、8~9行を3つ目、10~11を4つ目で抜き出したいのです。 まず、4~7行目を抜き出すマクロは、 1~3行までを削除と下から8行目までを削除と考えました。 上から不要な部分を削除(1~3行までを削除)するマクロは下記の通りです。 Sub sample1() ' ' 上から下に検索 ' Dim x Range("A1").Activate '最初のセル Do Until ActiveCell.Value = "TEST_b" 'TEST_bが現れるまで x = ActiveCell.Value If x <> "TEST_b" Then 'TEST_bでないなら ActiveCell.EntireRow.Delete 'その行を削除する Else ActiveCell.Offset(1).Activate '次の行 End If Loop End Sub これは、正しく動作します。 上記を応用し、下から削除するマクロは次の通りとしました。 Sub sample2() '下から検索 Do Until ActiveCell.Value = "TEST_c" 'TEST_cが現れるまで y = Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row 'データ最下行取得 y = ActiveCell.Value If y <> "TEST_c" Then 'TEST_cでないなら ActiveCell.EntireRow.Delete 'その行を削除する Else ActiveCell.Offset(-1).Activate '次の行 End If Loop End Sub このsample2を実行すると、応答が返ってきません。 何が悪いのか、どの様にしたら正しく動作するのか教えていただきたく。(1) また、smple2だとTEST_cの行は残ってしまいます。 なので、下からTEST_cまでを削除するマクロは、 どの様に記述したらよいか教えていただきたく。(2) 以上2点、よろしくお願いします。 ※マクロは初心者です。いろいろWEBで調べてみたのですが、いきづまりました。
- 3620313
- お礼率84% (217/257)
- Excel(エクセル)
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VBAの一例です。 TEST_bをセルA1に表示するまで行を削除する。 1.TEST_bが現れるまで上部セルを削除 2. TEST_bが現れるまで最終行から行を削除 Sub test() Sub test1() どちらでも同じ結果が得られるます。 ご参考まで。 Sub test() Dim i, MaxRow As Single i = 1 Do While Range("A" & i).Value <> "TEST_b" If Range("A" & i).Value <> "TEST_b" Then Rows(i).Delete Shift:=xlUp Else Exit Do End If Loop 'A列最終行取得 MaxRow = Cells(Rows.Count, 1).End(xlUp).Row i = MaxRow Do While Range("A" & i).Value <> "TEST_c" If Range("A" & i).Value <> "TEST_c" Then Rows(i).Delete Shift:=xlUp i = i - 1 Else Rows(i).Delete Shift:=xlUp Exit Do End If Loop End Sub Sub test2() Dim i, MaxRow As Single i = 1 Do While Range("A" & i).Value <> "TEST_b" If Range("A" & i).Value <> "TEST_b" Then Rows(i).Delete Shift:=xlUp Else Exit Do End If Loop 'A列最終行取得 MaxRow = Cells(Rows.Count, 1).End(xlUp).Row i = MaxRow Do While Range("A" & i).Value <> "TEST_b" If Range("A" & i).Value <> "TEST_b" Then Rows(i).Delete Shift:=xlUp i = i - 1 Else Exit Do End If Loop End Sub
その他の回答 (1)
行を削除してしまっては、正しく動かないと思う。 セルの値は削除可能だと思う。 もしくは、削除したあと、セルの内容を判断すれば可能かな。
補足
行を削除してしまっては、正しく動かないと思う。 →何故なのか理由が知りたいところです。
関連するQ&A
- Excelマクロ:変数でセル範囲指定
マクロの迷い人です。 Excelの表をマクロで印刷しようと思っています。 行の数が毎回違うため、最終セルもその都度指定しなければなりません。 A1 B1 A2 B2 A3 B3 A4 B4 この例で、A5 B5 以降は空セルとします。 印刷範囲を Range("A1:B4")と書かずに、そのときどきのアクティブセルを変数に代入し、変数を使って範囲指定したいのです。 Sub MacroTest () Dim a As Variant Dim b As Variant Range("B1").Activate Do While a <> 0 ActiveCell.Offset(1, 0).Activate '空白でなければ一つ下に移る a = ActiveCell.Value Loop ActiveCell.Offset(-1, 0).Activate '上の行に移る b = ActiveCell.Value Range("A1:"& b).Select End Sub こうしてみましたがダメでした。 デバッグの方法がわからないので教えて下さい。よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 列幅、行の高さを指定するマクロ
元マクロ初心者(今はほとんど忘れています)です。 列幅、行の高さを変更するマクロを以前作りました。 セルに指定する列幅を入力するのですが、 最近100以上の値の時はスキップされることに気づきました。 100以上の値でも処理されるようにするにはどうすればよいでしょうか。 Sub 列幅変更マクロ() ' ' Macro1 Macro ' マクロ記録日 : 2004/1/31 ユーザー名 : ' 列幅の変更 ' Keyboard Shortcut: Ctrl+l ' If MsgBox("→:列幅を変更します。右の方向にセル内の数値に従って処理しています。一番右のセルに半角で「@」を終わりの印として入力してください。", vbOK) = 1 Then Do Until ActiveCell.Value = "@" If ActiveCell.Value < 100 Then If ActiveCell.Value > 0 Then Selection.ColumnWidth = ActiveCell.Value End If End If ActiveCell.Offset(0, 1).Select Loop End If End Sub Sub 行の高さ変更マクロ() ' ' Macro2 Macro ' マクロ記録日 : 2004/2/1 ユーザー名 : ' 行の高さ変更 ' Keyboard Shortcut: Ctrl+p ' If MsgBox("↓:行の高さを変更します。下の方向にセル内の数値に従って処理しています。一番下のセルに半角で「@」を終わりの印として入力してください。", vbOK) = 1 Then Do Until ActiveCell.Value = "@" If ActiveCell.Value < 100 Then If ActiveCell.Value > 0 Then Selection.RowHeight = ActiveCell.Value End If End If ActiveCell.Offset(1, 0).Select Loop End If End Sub
- ベストアンサー
- オフィス系ソフト
- マクロよ動け
VBA 難民です。 Excel で、左のセルが空白の場合、印刷文字を見えなくするつもりのマクロを作ってみましたが、知らん顔をされます。声の掛け方がまだよくわかってないのです。 こっちを向かせる方法を教えて下さい。よろしくお願いします。 Sub MacroWhiter() Dim a As Variant Dim b As Variant a = ActiveCell.Value b = ActiveCell.Offset(0, -1).Value '一つ左のセルの値 Range("B1").Activate 'ここから始める Do Until IsEmpty(ActiveCell.Value) '空きセルまで続ける If b = 0 Then 'ゼロの場合 ActiveCell.Font.Color = 2 '文字を白色にする ActiveCell.Offset(1, 0).Activate '下の行に移る End If Exit Do Loop '繰り返す a = ActiveCell.Value
- ベストアンサー
- オフィス系ソフト
- エクセルVBAで無限ループ
教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub
- ベストアンサー
- オフィス系ソフト
- セルの選択範囲を広げて消去したい
win 7 とEXCEL2007でマクロ作成初心者です。 Sub kigoumade() Range("DK30").Activate Do Until ActiveCell.Value = "※※" ActiveCell.UnMerge ActiveCell.Clear ActiveCell.Offset(1).Activate Loop End Sub 上のコードでDK列のセル(※※の無い行だけ)を消去できました。 これをActiveCell列のセルでなく、 ("BR30:EE30")という複数セルを、※※のある行の手前までをClearしたいのですが どうすればよろしいかご教示お願いします。
- ベストアンサー
- Visual Basic
- VBAについて
いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1 ↓セルA1 ↓セルB1 5月26日 26 B1のセルはDAY(A1)にて出してます 完売 A氏 ○ Sheet2 ↓A列 ↓B列 5月 1日 ・ ・ ・ 26日 ○ ←シート1の所に○が付いているとシート1セルB1と同じ 27日 日付の隣のセルに○を入力 28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。
- 締切済み
- オフィス系ソフト
- 重複行を完全削除するエクセルのマクロ
Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。 A B C E F 1 1/26 a1234 fdsa 5000 C1 2 1/27 a4567 sdfa 4000 T2 3 1/28 a1234 dfsa 5000 C1 4 1/30 b4567 asdf 6600 A2 5 2/10 b4567 fsda 6600 A2 6 2/10 a1234 afds 5000 C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。
- ベストアンサー
- オフィス系ソフト
- エクセルで行を非表示にするとアクティブなセルが・・・
エクセルで行を非表示にするとアクティブなセル?行?がどこかわからなくなり、マクロでアクティブなセルを移動するときにエラーが出ます。 Sub example() ActiveSheet.Range("D3").Select Do Until ActiveCell = 23 If ActiveCell <> "" Then ActiveCell.Offset(1, 0).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -3).Select ElseIf ActiveCell <> "" Then ActiveCell.Offset(1, -6).Select Else: ActiveCell.EntireRow.Select Selection.EntireRow.Hidden = True ActiveCell.Offset(0, -6).Select End If Loop End Sub 一番下のActiveCell.Offset(0, -6).Select にエラーが出るのですが、どうすればセルを移動できるでしょうか?
- ベストアンサー
- オフィス系ソフト
- 行方向の同じ値のセルを結合するマクロ
ネットで色々調べながら、A列方向の同じ値のセルを結合させるマクロ を作ってみたのですが、もっと簡単にできるようでしたら教えていただきたいです。 どうぞよろしくお願いいたします。 Sub セル結合() Dim r As Integer '行数 Dim i As Integer 'カウンタ r = Sheets(1).Range("a1").CurrentRegion.Rows.Count - 1 Application.DisplayAlerts = False For i = 1 To r Cells(i, 1).Activate '項目の一つ下のセルをアクティブに If ActiveCell.Value = ActiveCell.Offset(1).Value Then Range(ActiveCell, ActiveCell.Offset(1)).Merge End If Next Application.DisplayAlerts = True End Sub
- ベストアンサー
- その他MS Office製品
- 空白行の削除マクロについてご教示ください
空白行の削除に、下記マクロを活用させていただいていますが、 見た目空白なのに削除されない行が時々残ってしまいます。 削除されなかったセルを「Deleteキー」で空白にするとマクロが 実行され、きちんと削除されます。 こういった、スペースか何かが入っていても、見た目空白なら 削除するようにはできないでしょうか。 どなたかよろしくお願いいたします。 Sub 削除() Dim c As Range Dim 開始行 As Long Dim 最終行 As Long 開始行 = 5 最終行 = Range("a5000").End(xlUp).Row For Each c In Range("a" & 開始行 & ":a" & 最終行) If c.Value = "" Then Rows(c.Row).Delete End If Next End Sub
- ベストアンサー
- オフィス系ソフト
お礼
回答ありがとうございます。望み通りのVBAです。助かりました。