一回も披露したことのない豆知識

添付画像のように縦3段になっている表で
一番下の段と2段目の段が空白の時、下に詰めるようにするには(添付画像の右側に状態にするには)
どのようなコードを書けばいいでしょうか?

「VBA 空白セルを削除ではない方法で詰め」の質問画像

A 回答 (4件)

対象範囲を選択した状態で下のプロシージャーを実行してみて下さい。


何行でも同じように動作します。

'積み木マクロ
Sub ggrks()

Dim v: v = Selection
Dim c As Long, r As Long, i As Long

For c = LBound(v, 2) To UBound(v, 2)
For i = 0 To UBound(v, 1)
For r = UBound(v, 1) To LBound(v, 1) Step -1
If r - 1 >= LBound(v, 1) Then
If v(r, c) = "" Then
v(r, c) = v(r - 1, c)
v(r - 1, c) = ""
End If
End If
Next
Next
Next
Selection = v
End Sub
    • good
    • 0
この回答へのお礼

コードの方ありがとうございました。
おかげさまでやりたい事が出来ました。
ありがとうございました。

お礼日時:2020/12/08 12:40

No2氏の回答にもあるように


配列に一度格納して吐き出す事で解消できますが
一点注意があります
「空白セル」とは人間が目で見て空白であっても
コンピューターは空白ではないと判断する事があります
? と思うかもしれませんが 私はこれで悩んだ事があります
それは何かというと 「スペース」です
選択したセルでスペースキーを叩くと、
空白というデータが入ります 見た目は空白ですが
データとしては空白ではありません
これは 入力者が無意識にやってしまう事によるもので、
それ自体を回避する方法はありません
プログラム的に回避するには、置換を使って空白データを
削除する方法があります ループで回し、空白セルを判定する前に、
セルデータを空白置換させてから判定させます
ただ、この方法の場合、入力されているセルに 意図したスペースがある場合それも削除されます
    • good
    • 0

ExcelVBAの初心者です。

私なら次のようにします。
おそらくもっとスマートな方法があるだろうとは思うのですが。

① 最初に全データを二次元配列で表のイメージで変数に読み込む。

② 変数の最終行からチェックを開始して、もし空欄があれば一行上の欄のデータをその欄にいれ、一つ上のデータを空欄にする。一つ上の欄が空白ならば、更にもう一つ上のデータを調べる。

③ 一行の処理が終われば、次はもう一行上ののデータを読み込み、②の作業をくりかえす。これを一番上の行までよみこむ。

④ 最後に二次元配列に読み込んだ変数を別の表に書き出す。

もしコードをご希望でしたら、一度ご自身でコードを組むことをおすすめします。ここはVBAの無料の作成場所ではありませんので、コードを組んだ上でご相談されることをおすすめします。

なお、VBAは保守が大変ですよ。おすすめしません。
    • good
    • 0

こんにちは



>削除ではない方法で詰める
ってのが、どういう意味だかわかりませんでしたので、単に「詰める」ものと解釈しました。

対象がたかだか3行分なので何とでもなると思いますが、一般化した考え方の一つとして…
最初に1列分の値をまとめて読み込んで、行の下から見て行って空白でないものを出力するようにすれば宜しいかと。

一列分ができれば、あとは各列をループすれば良いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A