- ベストアンサー
Excel VBAで表の空白行を上に詰める方法
- Excel VBAを使用して、指定された表の空白行を上に詰める方法について教えてください。
- 表はD列からK列までで、行は4行目から23行目まであります。1行全体が空白の場合、その行を上の行に詰めて値のみを保持するようにしたいです。
- 同じ形式の別のファイルでは動作していますが、特定のPCや新しいファイルではフリーズしてしまいます。効率の良いコードや別の方法があれば教えてください。条件として、別シートでこの表のセルを参照しているため、一時的に行を削除する方法は使えません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! 前回回答した者です。 >条件として、別シートでこの表のセルを参照しているので・・・ というコトは結局コピー&ペーストしていくしかないのかもしれませんね。 Sub Sample3() Dim i As Long, j As Long, k As Long, cnt As Long Dim myRng As Range, myAry myAry = Array("D4", "D30", "N4", "N30") '←に各表の最初のセル番地を追加 ★ Application.ScreenUpdating = False For k = 0 To UBound(myAry) Set myRng = Range(myAry(k)).Resize(20, 8) For i = 145 To 1 Step -8 For j = 1 To 7 '★ myRngの i 番目セルの右となりから表の右端のセルまで If myRng(i).Offset(, j) = "" Then cnt = cnt + 1 End If Next j If cnt = 7 Then myRng(i).Offset(1, 1).Resize((153 - i) / 8, 7).Copy myRng(i).Offset(, 1) myRng(153).Offset(, 1).Resize(, 7).Copy myRng(i).Offset(, 1).PasteSpecial Paste:=xlPasteFormats If WorksheetFunction.CountA(myRng(153).Offset(, 1).Resize(, 7)) > 0 Then myRng(153).Offset(, 1).Resize(, 7).ClearContents End If End If cnt = 0 Next i Next k Application.CutCopyMode = False Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
たびたびごめんなさい。 >画面が白くなってフリーズしてしまいます というコトですので・・・ 極力ループさせない方法にしてみました。 各表の2列目以降は実データ(数式などによって「空白」に見えているセルではない!) という前提です。 Sub Sample4() Dim i As Long, k As Long Dim myRng As Range, myAry myAry = Array("D4", "D30", "N4", "N30") '←に各表の最初のセル番地を追加 ★ Application.ScreenUpdating = False For k = 0 To UBound(myAry) Set myRng = Range(myAry(k)).Resize(20, 8) For i = 145 To 1 Step -8 If WorksheetFunction.CountA(myRng(i).Offset(, 1).Resize(, 7)) = 0 Then myRng(i).Offset(1, 1).Resize((153 - i) / 8, 7).Copy myRng(i).Offset(, 1).PasteSpecial Paste:=xlPasteValues If WorksheetFunction.CountA(myRng(153).Offset(, 1).Resize(, 7)) > 0 Then myRng(153).Offset(, 1).Resize(, 7).ClearContents End If End If Next i Next k Application.CutCopyMode = False Application.ScreenUpdating = True End Sub ※最低限のループでとどめ、コピー&ペーストは「値」だけにしてみました。 今度はどうでしょうか? ※ 余談ですが、当方でも表の範囲を10個程度に増やして 前回のコードでやってみましたが、そんなに時間を要することはありませんでした。 何か数式などで時間を要するような関数が使われているといったことはないでしょうか? これでもダメならごめんなさいね。m(_ _)m
お礼
フリーズするので、新規のシートに表のみコピーして作って試したのですが、駄目だったのですが、改めてコピーせずに新規で作り変えてみました。 すると、軽く動作しました。 どうも、何か分かりませんがおかしくなっていたようです。 特にオブジェクトもなく、容量も大きくなかったのですが、とりあえず軽快に動作するようになりました。 どうもありがとうございます。 もう少し、すべて復元して正式に動作すればこれでいけそうです。
- tom04
- ベストアンサー率49% (2537/5117)
No.1です。 たびたびごめんなさい。 投稿後気づきました。前回のコードで不要な行があります。 >myRng(153).Offset(, 1).Resize(, 7).Copy >myRng(i).Offset(, 1).PasteSpecial Paste:=xlPasteFormats の2行を消してください。 全く無意味でした。m(_ _)m
お礼
これを使うシートはコピーを極力せず新規に作ったらフリーズしなくなりました。 ほかのシートは前のをそのまま移動して使っていますが、問題はなくなりました。 きちんと動作します。 いろいろお手数をおかけし、すいませんでした。 今回は長々とどうもありがとうございました。
補足
早速の投稿ありがとうございます。 No.2の投稿の部分を含めて試してみました。 画面が白くなってフリーズしてしまいます。DoEventsを間に適当に入れてみたのですがだめでした。 最初のと同じ症状です。何度も試しているとファイル自体壊れるのか、表を4つほどコピーして新規ファイルに普通に貼り付けようとしただけでフリーズしてしまいコピーできなくなってしまいました。(コピーで試しているので問題ないですが) 色々試すとどうも、空白行が多いとフリーズするようです。空白行が少ないときはきれいに動きましたが、20行×8列の表で1行だけ入力とかで試すと1つの表だけでもフリーズしてしまいます。 何が問題なのでしょうかね?