• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelvba表に空白行があれば上に詰める重い)

Excel VBAで表の空白行を上に詰める方法

このQ&Aのポイント
  • Excel VBAを使用して、表の空白行を上に詰める方法を紹介します。
  • 指定した範囲の表で、一行まるごと空白の場合、上の行に詰める処理を行います。
  • 同じ処理を複数の表に対して行う際には、コードの行や列を変更する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

何度もごめんなさい。 前回は大きな勘違いをしていました。 各票の1列目には数式が入っていて、その数式は消さずに2列目~8列目を消去 → 上詰め というコトですね? とりあえずSheet2を作業用のSheetとして使っていますので、 Sheet2は使っていない状態にしておいてください。 (実際は操作したいSheetの使っていないセルでも構いません) Sub Sample2() Dim i As Long, j As Long, k As Long, cnt As Long Dim myRng As Range, wS As Worksheet, myAry Set wS = Worksheets("Sheet2") '★ myAry = Array("D4", "D30", "N4", "N30") '←に各表の最初のセル番地を追加 ★ Application.ScreenUpdating = False For k = 0 To UBound(myAry) Set myRng = Range(myAry(k)).Resize(20, 8) wS.Range("A1").Formula = myRng(1).Formula '★(表の1行目・1列目の数式をSheet2のA1セルに一旦表示させる) 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 '★(前回「8」の部分が「7」に変更) myRng(i).Offset(, 1).Resize(, 7).Delete shift:=xlUp myRng(153).Offset(, 1).Resize(, 7).Insert shift:=xlDown myRng(i).Offset(, 1).Resize(, 7).Copy myRng(153).Offset(, 1).PasteSpecial Paste:=xlPasteFormats myRng(1).Resize(20).Formula = wS.Range("A1").Formula '★Sheet2・A1セルの数式を元の表に戻す End If cnt = 0 Next i Next k Application.CutCopyMode = False Application.ScreenUpdating = True End Sub ※ myAry 宣言の手抜きを指摘いただきどうもありがとうございます。 何も宣言しない場合は「Valiant」型になりますので、宣言していませんでした。 本来はご指摘のように丁寧に宣言する方が良いと思います。 ※ 今度はどうでしょうか?m(_ _)m

hinoki24
質問者

お礼

どうもありがとうございます。結論的にはうまく動きました。 これで完成か、と思い別シートを見たところ、#REF表示がいっぱい出ていました。 表の内容を参照していた所のセルが削除されたためでした。 今回のファイルには、行を削除してまた作るやり方は不適でした。 またの機会に使わせていただきます。 質問はまたその条件で再投稿いたします。この質問はこれで閉めます。 色々協力していただいたのですが、結果このようになってしまい申し訳ございませんでした。 再投稿しますので、良い案があればご教授くださればと思います。 本当にどうもありがとうございました。

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

何度も何度も失礼します。 前回の投稿で誤記がありました。 >「Valiant」型 は >「Variant」型 の間違いです。 どうも失礼しました。m(_ _)m

hinoki24
質問者

お礼

どうも、わざわざありがとうございます。 この度は、お世話になりました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

続けてお邪魔します。 >ただ、各表の一列目に数式が入っていたのが削除されていたのでそれを再書き込みする必要がありました。 各表の1行目に手を付けてはいけなかったのですね? 前回のコードの >For i = 145 To 1 Step -8 の行を >For i = 145 To 9 Step -8 に変更してみてください。 (前回アップした画像の145番目のセルから9番目のセルまで) これで各表の1行目は何も変わらないはずです。m(_ _)m

hinoki24
質問者

補足

1行目ではなく、各表の1列目のみ全部関数が入っています。 例えば最初のセル番地であるD4セルには=IF(F4="","","AAA") という関数が入っています。残りも同じ関数で相対参照になっています。 1列除いてやったら、参照先がなくなって#REFになってしまいました。 とりあえず、現在は最低でも最初のセル番地は関数が残っているので、myAryを使って格納してコピーして下の19行に貼り付ければいけそうですが、うまくいかずエラーになっています。 とりあえず Dim myAry As Variant が抜けていました。 どう指定すれば効率よくできるでしょうか?

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です。 >とりあえず一つの表のみで適当に入力してやってみましたが何も変化しません。 表の配置は前回アップした配置になっているでしょうか? こちらでD4~K23セルを一つの表として前回のコードでやってみました。 データが1つも表示されていない行はちゃんと削除され上詰めできました。 考えられる原因としては、 1つの表が20行・8列となっているか?くらいです。 それと質問をよく読み返してみると 表は12か所あるというコトですね? コード内の「myAry」の部分に 各表の最初のセル番地を追加してください。 各表とも同じ行数・列数であればいくつ追加しても構いません。 直接の解決とはいかないと思いますが、 ごめんなさいね。m(_ _)m

hinoki24
質問者

お礼

度々すいません。動いたという事でもう一度してもだめで、新規ブックに表をつくってしたらできたのでもう一度もどって、コードのコピーからやり直したらなぜか出来ました。 どうもありがとうございます。 ただ、各表の一列目に数式が入っていたのが削除されていたのでそれを再書き込みする必要がありました。 また、それで試してみます。 ありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! >このような表が同じ列に4か所×3=12か所あるので・・・ というコトですので、一案です。 考え方として↓の画像のように一つの表の範囲が160セルになると思いますので、 各表を「myRng」に格納します。 番号を振っているのが「myRng」の順番となります。 その最左列を基準としてやってみました。 Sub Sample1() Dim i As Long, j As Long, k As Long, cnt As Long Dim myRng As Range, myAry '▼4つの表の最初のセル番地を myAry に格納 myAry = Array("D4", "D30", "N4", "N30") Application.ScreenUpdating = False '▼myAryの最初~最後まで For k = 0 To UBound(myAry) '▼ myAry のセル番地から20行、8列を myRng に格納 Set myRng = Range(myAry(k)).Resize(20, 8) '▼ myRng の最後から2行目から myRng の1行目まで For i = 145 To 1 Step -8 '▼列方向にループ For j = 0 To 7 If myRng(i).Offset(, j) = "" Then cnt = cnt + 1 End If Next j '▼ myRng i 番目セルの行すべてが空白の場合、 'その行を削除し最終行を1行挿入、最終行の書式を整える If cnt = 8 Then myRng(i).Resize(, 8).Delete shift:=xlUp myRng(153).Resize(, 8).Insert shift:=xlDown myRng(i).Resize(, 8).Copy myRng(153).PasteSpecial Paste:=xlPasteFormats End If cnt = 0 Next i Next k Application.CutCopyMode = False Application.ScreenUpdating = True End Sub ※ もっと良い方法があるかもしれませんが、 とりあえずはこの程度で・・・m(_ _)m

hinoki24
質問者

補足

こんばんは。早速どうもありがとうございます。 動きは早そうです。でも、とりあえず一つの表のみで適当に入力してやってみましたが何も変化しません。 空白行があればDeleteされるようになっていますが、見ていてもなぜか分かりませんが消されてないようです。 どこかおかしいのでしょうかね?

関連するQ&A