- ベストアンサー
Excelの空白行を上に詰めるVBAについて
Excelにて特定の列のみの空白を上に詰めるVBAを組んだのですが、 全ての列に適用してしまって困っております。 Sub 空白を上に詰める() Dim Lrow, i As Long Dim myRange As Range Lrow = Range("AH65536").End(xlUp).Row Set myRange = Rows(Lrow + 1) For i = 1 To Lrow If Cells(i, 34) = "" Then Set myRange = Union(myRange, Rows(i)) End If Next i myRange.Delete End Sub 上記のように「AH」列にのみ適用するように組みましたが、 うまくいきません。 VBAは初心者レベルです。 VBAにお詳しい方のご意見をお聞かせ願えますでしょうか。 宜しくお願い致しますm(_ _)m
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ざっとコードを拝見したところでは、 > Set myRange = Rows(Lrow + 1) ここで、行番号Lrow+1の行全部のセルをmyRangeに格納し、 > Set myRange = Union(myRange, Rows(i)) ここで、行番号iの行全部のセルとmyRangeとをUnionしています。 AH列のみの適用にするのなら、これらを Set myRange = Cells(Lrow + 1, 34) Set myRange = Union(myRange, Cells(i, 34)) にすると上手くいくはずです。 ご参考までに、定義部分で > Dim Lrow, i As Long は、 Dim Lrow As Long, i As Long としたほうがいいですよ。 > Dim Lrow, i As Long ですと、LrowがVariant型で定義されてしまうんです。
その他の回答 (1)
- DOUGLAS_
- ベストアンサー率74% (397/534)
>全ての列に適用してしまって困っております。 [回答番号:No.1] の ok2007 さんがご指摘になっているように、 Set myRange = Rows(Lrow + 1) Set myRange = Union(myRange, Rows(i)) では myRange に 行の集合体が格納されてしまいます。 次に、Delete メソッド の構文は expression.Delete(Shift) で、引数 Shift については、 >この引数を省略すると、セル範囲の形に適応した方向にシフトされます。 とヘルプに出ていますので、 >空白行を上に詰め たいのであれば、キチンと「xlUp」を付けた方がよいかと存じます。 で、別の方法としては、 myRange.Delete ではなくて、収集した行の集合体である myRange と AH列との共有セル範囲を上方向に削除する、という考え方で Application.Intersect(Columns("AH"), myRange).Delete xlUp というのはいかがでしょうか? ちなみに、お示しの例でしたら、エクセル上で、[新しいマクロの記録] により 1)AH列を選択 2)ジャンプメニュー で [空白セル(K)] を選択 3)上方向に削除 を記録し、整理すると、 Columns("AH").SpecialCells(xlCellTypeBlanks).Delete xlUp Range("AH1").Select だけで、すべて実行できます。
お礼
ご回答ありがとうございます。 皆様の回答を試した結果、あっさりと 解決してしまいました。 ずいぶん難しく考えていたようです。 VBAの使い方も大変参考になりました。 どうもありがとうございました。
お礼
Set myRange = Cells(Lrow + 1, 34) Set myRange = Union(myRange, Cells(i, 34)) とするのですね。 完全に間違えておりました。 Dim Lrow, i As Long も見落としておりました。 とても参考になりました。 もっと勉強しようと思います。 ありがとうございましたm(_ _)m