[[20130328115357]] 『グループ化された行列を削除するマクロ』(まさ) ページの最後に飛ぶ

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

 

『グループ化された行列を削除するマクロ』(まさ)
Excel2010,Windows7

複数のシートにグループ化された行や列が不規則にありまして、その行や列を丸ごと削除したいのですが、数が多い為マクロで簡単にできないかと考えております。
グループ化されている行(列)は展開、折りたたみの状態に関わらず全て削除します。
できればブック丸ごと一発で処理したいのですが、シート毎でも構いません。

あちこち探してみたのですが、一発で展開したり閉じたりするマクロはありましたが、削除する方法は見つけきれませんでした。

グループ化されている行(列)番号が取得できれば良い気がしますが、その方法が分かりません。

以上、よろしくお願い致します。


 列や行のプロパティの OutlineLevel が 2以上なら、グループ化されていると判断できるんだけど、
 そのグループの一番最後の行、つまり折りたたんでも表示される行は、OutlineLevel が 1 なんだよね。
 なので、この行はグループ化されていないと見なされる・・・

 1でも直前の行のOutlineLevelが2以上なら、この1 の行もグループ化されているという判断はできそうかな?

 (ぶらっと)

 ちょっと心配だけど、こんな感じ?

 Sub Sample()
    Dim x As Long
    Dim y As Long
    Dim z As Long

    With ActiveSheet.UsedRange
        y = .Row + .Rows.Count - 1
        x = .Column + .Columns.Count - 1
    End With

    For z = y To 2 Step -1
        If Rows(z).OutlineLevel > 1 Or (Rows(z).OutlineLevel = 1 And Rows(z - 1).OutlineLevel > 1) Then Rows(z).Delete
    Next

    For z = x To 2 Step -1
        If Columns(z).OutlineLevel > 1 Or (Columns(z).OutlineLevel = 1 And Columns(z - 1).OutlineLevel > 1) Then Columns(z).Delete
    Next

 End Sub

 (ぶらっと)

 ↑ やっぱり抜けがあった。

 1行目や1列目がグループ化されていても削除されなかった。
 以下、改訂版。

 Sub Sample2()
    Dim x As Long
    Dim y As Long
    Dim z As Long
    Dim delR As Boolean
    Dim delC As Boolean

    If Rows(1).OutlineLevel > 1 Then delR = True
    If Columns(1).OutlineLevel > 1 Then delC = True

    With ActiveSheet.UsedRange
        y = .Row + .Rows.Count - 1
        x = .Column + .Columns.Count - 1
    End With

    For z = y To 2 Step -1
        If Rows(z).OutlineLevel > 1 Or (Rows(z).OutlineLevel = 1 And Rows(z - 1).OutlineLevel > 1) Then Rows(z).Delete
    Next

    For z = x To 2 Step -1
        If Columns(z).OutlineLevel > 1 Or (Columns(z).OutlineLevel = 1 And Columns(z - 1).OutlineLevel > 1) Then Columns(z).Delete
    Next

    If delR Then Rows(1).Delete
    If delC Then Columns(1).Delete

 End Sub

 (ぶらっと)

ぶらっとさん、はじめまして。
早々にご回答ありがとうございます。

ほぼ思った通りの動きですが、1行(列)余計に削除されてしまいます。

For z = y To 3 Step -1

とかやってみたんですが、うまくいきません。

処理の流れがよく分かってないのですが、(すみません未熟者ですので)
以下の通りでよいでしょうか?(勉強の為に教えて下さい)

(1)使用セル範囲の最終行(列)番号を求める
(2)最終行から順にグループ化されているか判定してグループ化されていればその行を削除
(3)グループ化されている行がなくなるまで繰り返し
(4)(2)(3)の列バージョン
(5)1行(列)目がグループ化されていれば削除

以上、よろしくお願い致します。


 コードの解釈は、ほぼOK。
 唯一、(3) グループ化されている行または列がなくなるまで ではなく、 最終行(最終列)から2行目(2列目)までをチェックして、グループ化されていれば消している。

 でも、 不思議だねぇ。

 こちらで、いくつかのパターンでやっているけど、グループ化されていない行(列)が削除されるということは
 ないんだけど・・・・??

 実際、そちらで、おかしくなったシートの、マクロ実行前の状況を教えてくれる?
 何行目から何行目がグループ化されている、さらに何行目から何行目がグループ化されている、さらに・・・
 何列目から何列目がグループ化されている、さらに何列目から何列目がグループ化されている、さらに・・・

 こちらで、おなじ状態にして確認してみるので。

 あっ!もしかして・・・

 たとえば 10行目から15行目までグループ化されているとする。
 で、折りたたむと 15行目だけになり、10行目から14行目は隠れるね。

 やりたかったことって、この15行目は残したいということだった?
 最初のレスでつぶやいた(ぼやいた)んだけど、そうじゃなく、この15行目も削除しなきゃいけないということで
 ちょっとだけロジックをいれこんだ。(たいしたもんじゃないけど)

 もし、15行目のようなグループ化の親は残す、グループ化の子や孫だけを削除するということなら
 コードは、もっと楽ちん。

 Sub Sample3()
    Dim x As Long
    Dim y As Long
    Dim z As Long

    With ActiveSheet.UsedRange
        y = .Row + .Rows.Count - 1
        x = .Column + .Columns.Count - 1
    End With

    For z = y To 1 Step -1
        If Rows(z).OutlineLevel > 1 Then Rows(z).Delete
    Next

    For z = x To 1 Step -1
        If Columns(z).OutlineLevel > 1 Then Columns(z).Delete
    Next

 End Sub

 (ぶらっと)

ぶらっとさん、こんにちは。
今回のコードがまさに欲しかったものです。
ありがとうございました。

>最初のレスでつぶやいた
すみません、OutlineLevelの事がよく分かってなかったので(今もですが・・・)気付きませんでした。
勉強します。

これだけ色々できると楽しくなりますね。
本当にありがとうございました。

(まさ)


コメント返信:

[ 一覧(最新更新順) ]


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