[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『グループ化された行列を削除するマクロ』(まさ)
複数のシートにグループ化された行や列が不規則にありまして、その行や列を丸ごと削除したいのですが、数が多い為マクロで簡単にできないかと考えております。
グループ化されている行(列)は展開、折りたたみの状態に関わらず全て削除します。
できればブック丸ごと一発で処理したいのですが、シート毎でも構いません。
あちこち探してみたのですが、一発で展開したり閉じたりするマクロはありましたが、削除する方法は見つけきれませんでした。
グループ化されている行(列)番号が取得できれば良い気がしますが、その方法が分かりません。
以上、よろしくお願い致します。
列や行のプロパティの 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.