アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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型で定義されてしまうんです。
    • good
    • 0
この回答へのお礼

Set myRange = Cells(Lrow + 1, 34)
Set myRange = Union(myRange, Cells(i, 34))
とするのですね。
完全に間違えておりました。

Dim Lrow, i As Long
も見落としておりました。

とても参考になりました。
もっと勉強しようと思います。

ありがとうございましたm(_ _)m

お礼日時:2009/04/04 16:54

>全ての列に適用してしまって困っております。


 [回答番号: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
だけで、すべて実行できます。
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。
皆様の回答を試した結果、あっさりと
解決してしまいました。
ずいぶん難しく考えていたようです。

VBAの使い方も大変参考になりました。

どうもありがとうございました。

お礼日時:2009/04/04 16:52

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

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