
いつもお世話になっております。
列がD列からK列で、行が4行目から23行までの表があります。
その表で1行まるまる空白の時(4行目にには数式が入っていますがそれは除く)
上の行に詰めるようにしてあります。行はそのまま空白のまま残して、値のみ上に詰めるようにしています。
このような表が同じ列に4か所×3=12か所あるので、今はそれぞれ下のコードの行、列を変更して処理しています。
上の表と下のの表の間隔は、上が4~23行までで、下は30~49、と6行間隔です。結合セルも間にあるため5行空きがあります。
列と列の間隔は、左側から、D列~K列、続いて、N列~U列と続きます。2列空きがあります。
家で試した時は一応問題なく動いたのですが、
会社でした時フリーズしてしまい、うまくいきませんでした。
その後、家でしてもなぜかうまく動作しなくなりました。
12の表は多いのかと思い、1つで試してもだめになりました。
同じような作りの別のファイルは動いています。
念のため、新しいファイルにコピーし直してやりましたが、駄目でした。
コードもあまり良くないのかもしれません。
一応家ではVISTAの2007で試し、会社は7(32ビット)の2013です。
もう少し負担が少なくなるようなやり方があればと思っています。
もう少し、いいやり方があればお手数ですが、ご教授ください。
よろしくお願いいたします。
Sub 表の空白行は上に詰める()
Dim i As Integer, x As Integer, y As Integer, CSUM As Integer
Dim flag As Boolean
Application.ScreenUpdating = False
flag = 0 '1回だけの処理で使うフラグ
For x = 22 To 4 Step -1 '23行→4行まで処理をします。
CSUM = 0 '列の文字数を数える変数CSUMを用意し、初期値0とします。
For y = 4 To 11 'D列→K列まで処理をします。
CSUM = CSUM + Len(Cells(x, y)) 'CSUMにセル(x,y)の文字数を足します。
Next '列処理繰り返し
If CSUM = 0 Then
Range(Cells(x + 1, 4), Cells(23, 11)).Copy '空白行の1行下から23行目までをコピー
Cells(x, 4).PasteSpecial '空白行の1列目のセルを基点として貼り付け
If flag = 0 Then '23行目の値クリア処理 1回だけの処理
Cells(23, 5) = 1 '23行目がすっからかんのときエラーになるので、暫定入力
Range(Cells(23, 4), Cells(23, 11)).SpecialCells(xlCellTypeConstants).ClearContents
End If '1回だけの処理 ここまで
flag = 1 '1回だけの処理させないためフラグ値変更
End If
Application.CutCopyMode = False
Next '行処理繰り返し
End Sub
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
どうもありがとうございます。結論的にはうまく動きました。
これで完成か、と思い別シートを見たところ、#REF表示がいっぱい出ていました。
表の内容を参照していた所のセルが削除されたためでした。
今回のファイルには、行を削除してまた作るやり方は不適でした。
またの機会に使わせていただきます。
質問はまたその条件で再投稿いたします。この質問はこれで閉めます。
色々協力していただいたのですが、結果このようになってしまい申し訳ございませんでした。
再投稿しますので、良い案があればご教授くださればと思います。
本当にどうもありがとうございました。
No.3
- 回答日時:
続けてお邪魔します。
>ただ、各表の一列目に数式が入っていたのが削除されていたのでそれを再書き込みする必要がありました。
各表の1行目に手を付けてはいけなかったのですね?
前回のコードの
>For i = 145 To 1 Step -8
の行を
>For i = 145 To 9 Step -8
に変更してみてください。
(前回アップした画像の145番目のセルから9番目のセルまで)
これで各表の1行目は何も変わらないはずです。m(_ _)m
この回答への補足
1行目ではなく、各表の1列目のみ全部関数が入っています。
例えば最初のセル番地であるD4セルには=IF(F4="","","AAA")
という関数が入っています。残りも同じ関数で相対参照になっています。
1列除いてやったら、参照先がなくなって#REFになってしまいました。
とりあえず、現在は最低でも最初のセル番地は関数が残っているので、myAryを使って格納してコピーして下の19行に貼り付ければいけそうですが、うまくいかずエラーになっています。
とりあえず Dim myAry As Variant が抜けていました。
どう指定すれば効率よくできるでしょうか?
No.2
- 回答日時:
No.1です。
>とりあえず一つの表のみで適当に入力してやってみましたが何も変化しません。
表の配置は前回アップした配置になっているでしょうか?
こちらでD4~K23セルを一つの表として前回のコードでやってみました。
データが1つも表示されていない行はちゃんと削除され上詰めできました。
考えられる原因としては、
1つの表が20行・8列となっているか?くらいです。
それと質問をよく読み返してみると
表は12か所あるというコトですね?
コード内の「myAry」の部分に
各表の最初のセル番地を追加してください。
各表とも同じ行数・列数であればいくつ追加しても構いません。
直接の解決とはいかないと思いますが、
ごめんなさいね。m(_ _)m
度々すいません。動いたという事でもう一度してもだめで、新規ブックに表をつくってしたらできたのでもう一度もどって、コードのコピーからやり直したらなぜか出来ました。
どうもありがとうございます。
ただ、各表の一列目に数式が入っていたのが削除されていたのでそれを再書き込みする必要がありました。
また、それで試してみます。
ありがとうございました。
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

この回答への補足
こんばんは。早速どうもありがとうございます。
動きは早そうです。でも、とりあえず一つの表のみで適当に入力してやってみましたが何も変化しません。
空白行があればDeleteされるようになっていますが、見ていてもなぜか分かりませんが消されてないようです。
どこかおかしいのでしょうかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定のセルだけ結果がおかしい...
-
エクセルのdatedif関数を使って...
-
エクセルのVBAで集計をしたい
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
エクセル ドロップダウンリスト...
-
【関数】同じ関数なのに、エラ...
-
Office2021のエクセルで米国株...
-
【マクロ】列を折りたたみ非表...
-
9月17日でサービス終了らし...
-
【マクロ】アクティブセルの時...
-
ページが変なふうに切れる
-
【条件付き書式】シートの中で...
-
【マクロ】3行に上から下に並...
-
【マクロ】オートフィルターの...
-
【マクロ】EXCELで読込したCSV...
-
【画像あり】オートフィルター...
-
他のシートの検索
-
エクセルの循環参照、?
-
Excelファイルを開くと私だけVA...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
9月17日でサービス終了らし...
-
エクセル
-
【マクロ】WEBシステムから保存...
-
エクセルの循環参照、?
-
エクセル ドロップダウンリスト...
-
エクセルのdatedif関数を使って...
-
特定のセルだけ結果がおかしい...
-
【マクロ】A列にある、日付(本...
-
【マクロ】EXCELで読込したCSV...
-
【マクロ】アクティブセルの時...
-
【エクセル】期限アラートについて
-
iPhoneのExcelアプリで、別のシ...
-
【関数】同じ関数なのに、エラ...
-
Excelの新しい空白のブックを開...
-
【マクロ】3行に上から下に並...
-
【マクロ】宣言は、何のために...
-
VBA チェックボックスをオーバ...
-
Excelについての質問です 並べ...
-
【マクロ】アクティブセルの2...
-
【関数】不規則な文章から●●-●●...
おすすめ情報