[[20180515210305]] 『マクロで空白行の削除を非表示シートに実行したい』(スマトラ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで空白行の削除を非表示シートに実行したい』(スマトラ)

大変いつもお世話になっております。

下記、コードは、BKシート内にデータ範囲と空白範囲があり、空白行のみ検索して削除するというコードです。
ネットの書き込みを参考にしました。

質問内容は

With sh2のみに行削除を別のシートを開いた状態でも実行できるようにしたいのですが

下記のコードでは、他のシートを開いた状態で実行すると、まんまと削除されてしまいました。

それと、繰り返し処理で、1行づつ処理しているためか若干時間が(数秒ですが)かかるのも気になります。

皆様どうか、アドバイスの程よろしくお願い致します。

    '表形成処理
  Dim sh2 As Worksheet: Set sh2 = Worksheets("BK")   '転記先
    Dim row_end As Long
    Dim i As Long
    With sh2
        row_end = .Cells(Rows.Count, 2).End(xlUp).Row    '転記先の最終行取得
        For i = row_end To 1 Step -1    '最終行から上に向かって1行づつ処理
            If WorksheetFunction.CountA(Rows(i)) = 0 Then    '値がない場合
                Rows(i).Delete    '行削除
            End If
        Next i
    End With

< 使用 Excel:Excel2010、使用 OS:Windows7 >


↓こちらと同じミスしていませんか。

[[20180509001948]] 『マクロ:別のシートで実行するとWorksheetエラーが』(スマトラ)

(マナ) 2018/05/15(火) 21:23


範囲を選択してその範囲が空白なら行を消すっていうのが
Range.SpecialCells(xlCellTypeBlanks).EntireRo.Delete
でできたかと思います。
(ゾーマ) 2018/05/15(火) 21:24

 >若干時間が(数秒ですが)かかるのも気になります。

並び替えていいなら、
並び替えをすると空白セルは下に追いやられるので、
空白を削除したように見えます。
そして、処理速度は速いです。
その方法ではだめでしょうか?

 >Rows(i).Delete '行削除
どのシートの行を削除するか指示してないので、
指示された側で勝手に判断されても文句は言えません。
間違いなく作業を他人(今回はエクセル君)にしてもらうためには、
正確に横着せずに丁寧に指示をしてやる必要があります。

(まっつわん) 2018/05/15(火) 21:41


ありがとうございます皆様、

.Rows(i).Delete '行削除 →忘れていました「.」

フィルタ操作、かなり高速でしたので以下の通り修正しました。
別のシートからでもできました。

ただ、連番は少しもたつきます。

    '表形成処理
    Dim r As Long

    With sh2
        r = .Cells(.Rows.Count, "B").End(xlUp).Row '最終行取得
        .Range(.Cells(2, 1), .Cells(r, 1)).Value = 1 'フィルタ認識させるために最終行までA列を1で埋める
        .Range("A1").Sort key1:=.Range("B1"), order1:=xlAscending, Header:=xlYes '昇順で空白除去
        .Range(.Cells(2, 1), .Cells(r, 1)).Value = "" 'A列をクリア→後に連番コードに移る
    End With
    '連番付加
    Dim n As Long
    Dim No As Integer
    With sh2
        n = 1    'nは連番の最初の値
        For No = 2 To .Cells(.Rows.Count, "B").End(xlUp).Row    '2行目〜B列の値が入っている最終行範囲まで
            If .Cells(No, "B").Value <> "" Then    'Bに値がなければ終了
                .Cells(No, "A").Value = n    '値があれば1を挿入
                n = n + 1    '順次1を加える
            End If
        Next No
    End With
(スマトラ) 2018/05/15(火) 22:24

連番はオートフィルコピーで高速になりました。

    Dim r As Long
    With sh2
        r = .Cells(.Rows.Count, "B").End(xlUp).Row
        .Cells(2, 1).Value = 1
        .Cells(3, 1).Value = 2
        .Range(.Cells(2, 1), .Cells(3, 1)).AutoFill Destination:=.Range(.Cells(2, 1), .Cells(r, 1))
    End With
(スマトラ) 2018/05/15(火) 22:38

連番は連続データの方がオートフィルよりわずかに速かった気がします。

↓マクロの記録の結果

Sub Macro1()
'
' Macro1 Macro
'

'

    Range("A9").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A9:A16").Select
    Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
        Step:=1, Trend:=False
End Sub
(まっつわん) 2018/05/15(火) 23:11

Sub test()
    Dim Rng As Range

    With Worksheets("BK")
        Set Rng = .Range(.Range("B2"), .Cells(.Rows.Count, "B").End(xlUp))
    End With

    With Rng
        .Sort key1:=.Cells(1), Header:=xlNo
        With .SpecialCells(xlCellTypeConstants).Offset(, -1)
            .Cells(1).Value = 1
            .DataSeries Rowcol:=xlColumns, Step:=1
        End With
    End With
End Sub

対象セル範囲がよくわかってないけど^^;

(まっつわん) 2018/05/15(火) 23:24


まっつわん さん

何から何までありがとうございます。

処理完了できました。

解決です(^^)
(スマトラ) 2018/05/16(水) 19:22


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.