[[20190118075113]] 『アクティブセルから1つ下』(やくると) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『アクティブセルから1つ下』(やくると)

アクティブセルから1つ下の行から(アクティブセルは含まれない)
下の5行をごっそり削除したいのですが、

Sub 行消し()
Range("A1:A" & ActiveCell.Row + 1).EntireRow.Delete
End Sub

エラーは出ないのですが、表がぐちゃぐちゃにくずれてしまいます。
たすけてください

インターネットで拾ってきたコードをわたしなりに変えてはみたのですが
そもそものRange("A1:A")の意味もちょっとわかりません。。。
("A:A")ならわかるのですが、、。

< 使用 Excel:Excel2010、使用 OS:Windows8 >


Cells(ActiveCell.Row + 1, 1).Resize(5).EntireRow.Delete
(ピンク) 2019/01/18(金) 08:27

■基準セル.Offset(行,列)
基準セルから、指定した行列分ズレたセルを表す。
 (例)Range("A1").Offset(1,0)  ・・・  A2セル (A1 から 1行↓0列→)
     Range("A1").Offset(0,1)  ・・・  B1セル (A1 から 0行↓1列→)
     Range("A1").Offset(3,2)  ・・・  C4セル (A1 から 3行↓2列→)

■基準セル.Resize(行,列)
基準セルを、指定した行列範囲に変更する。

 (例)Range("A1").Resize(2,1)  ・・・  A1:A2 (セル範囲を2行1列に変更)
     Range("A1").Resize(1,2)  ・・・  A1:B1(セル範囲を1行2列に変更)
     Range("A1").Resize(3,5)  ・・・  A1:E3(セル範囲を3行5列に変更)

■基準セル.EntireRow
基準セルが含まれる行全体を指定する。

 (例)Range("A1").EntireRow       ・・・  1行目
     Range("C5").EntireRow       ・・・  5行目
     Range("A1:A5").EntireRow    ・・・  1〜5行目

 以上を踏まえて、

 アクティブセル(ActiveCell)の、
 一つ下のセルの(Offset)、
 5行分が(Resize)、
 含まれる行を(EntireRow)、
 削除(Delete)
 すればいいので、、

 Sub a()
    ActiveCell.Offset(1, 0).Resize(5, 1).EntireRow.Delete
 End Sub

 と書けます。
(TAKA) 2019/01/18(金) 09:20

されたいことの回答はTAKAさんのとおりなので、私からは↓の部分について。
>そもそものRange("A1:A")の意味もちょっとわかりません。。。

これは見るべき場所がちょっと違います。
実は↓までで一つのセル範囲を示しています。

 Range("A1:A" & ActiveCell.Row + 1)

ポイントは「A1:A」という【文字列】に「ActiveCell.Row + 1」を【文字列結合】しているところです。
たとえば、C3セルがアクティブセルだったとすると
【ActiveCell.Row + 1】 → 【3 + 1】 →  【4】となり、
【"A1:A"】に【4】を文字列結合するから【"A1:A4"】という文字列になるわけです。

つまり、EntireRowはTAKAさんの説明を見て頂くとして、C3セルがアクティブだったとすると

 Range("A1:A" & ActiveCell.Row + 1).EntireRow.Delete
    ↓
 【A1:A4】 が 【含まれる行】 を 【削除しなさい】
    ↓
 1〜4行目全体を削除しなさい 

になっているので、構文として正しいのでちゃんと動作するからエラーは出ないけど、思った通りの動きではないということになっているのだとおもいます。

(もこな2) 2019/01/18(金) 12:49


こんなにたくさんの解説や見解をありがとうございます!
ぴんくさんのCells(ActiveCell.Row + 1, 1).Resize(5).EntireRow.Delete
でうまくいったのですが、そこにふくまれる写真(オブジェクト)が置いてけぼりで消えません。
なぜでしょうか、、、。(>_>)
(やくると) 2019/01/19(土) 10:08

ご自身でも書いているように、写真というオブジェクト(Shape)とセル範囲というオブジェクト(Range)は別物だからです。

されたいことは、こちらが参考になりそうです。
https://www.relief.jp/docs/018407.html

(もこな2) 2019/01/19(土) 11:46


参考に
Sub Test()
    Dim myRang As Range
    Dim shp As Shape
    Dim shpRang  As Range

    Set myRang = Cells(ActiveCell.Row + 1, 1).Resize(5).EntireRow
    For Each shp In ActiveSheet.Shapes
        Set shpRang = Range(shp.TopLeftCell, shp.BottomRightCell)
        If Not Intersect(shpRang, myRang) Is Nothing Then
            shp.Delete
        End If
    Next
    myRang.Delete
End Sub

(ピンク) 2019/01/19(土) 19:49


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.