質問: union(setran, tergetsetsheets.rows(i - p)) end if next >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 500行くらいなら0.03秒くらいで処理できていたのですが、 4700行で6.8秒、9400行で52秒になりました。 ※描写は停止にしています。 これ以上早く処理を行うことはできるのでしょうか? なるべくなら行の削除を行いたいと思っています。 なぜなら表の集計をこの後に行うのにあらかじめ不要な行を先に削除しておくことにより 処理速度が上がるのではないかと思っているからです。 いい方法がありましたら知恵を貸してください。 どうかよろしくお願いいたします。
回答: > 例: > a b > 1 太郎 住所 > 2 電話 > 3 メールアドレス > 4 誕生日 > 5 年齢 > 6 性別 > 7 既婚 > 8 花子 住所 > 以下続く この7行が繰り返されていて、 例えば、年齢、既婚 部分の行を一気に消したい・・・ という事で良かったでしょうか 作業列として、今使っている最終列+2の所の列を使います。 その作業列に =if(index({0,0,0,0,1,0,1},mod(row()-1,7)+1)>0,1,"") という計算式を埋め込んで、削除する行を特定します。 {0,0,0,0,1,0,1} このパターンは、 左から、住所、電話・・・に対応していて、削除したい所を > 0 で設定します。 {0,0,0,0,1,0,1} ↓誕生日も削除対象にするのなら、左から4つ目の 0 を変更 {0,0,0,1,1,0,1} 以下の samp1 でどうなりますか? option explicit public sub samp1() dim irowh as long, icol as long dim i as long const climit as long = 5000 with activesheet with .usedrange with .cells(.rows.count, .columns.count) icol = .column + 2 irowh = .row end with end with with .cells(1, icol).resize(irowh) .formula = _ "=if(index({0,0,0,0,1,0,1},mod(row()-1,7)+1)>0,1,"""")" .value = .value on error resume next for i = (irowh - 1) \ climit to 0 step -1 .cells(i * climit + 1).resize(climit) _ .specialcells(xlcelltypeconstants, xlnumbers) _ .entirerow.delete next .clearcontents end with end with end sub ※ 速くならなかったらごめんなさい ※ screenupdating 等は必要に応じて追加してください なお、確認用データは以下で作ってました public sub testdata() dim r as range for each r in range("a1:z30000") r = r.address(false, false) next columns.autofit end sub