[[20230519121819]] 『UsedRangeの最終行』(’ふ') ページの最後に飛ぶ

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

 

『UsedRangeの最終行』(’ふ')

UsedRangeの勉強中に不可解なことが起こりました。
あるブックのあるシートのみ
明らかに空白しかない行なのに最終行として出てきます。

なので
Sub Test()

    Dim r As Long, cnt As Long

    With Worksheets(4)
        r = .UsedRange.Rows.Count
        Do
            If r < 8 Then Exit Do
            cnt = cnt + 1
            .Rows(r).Delete Shift:=xlUp
        Loop Until cnt > .Rows.Count

        Select Case cnt < .Rows.Count
            Case True:  Debug.Print cnt & " 回実施で終了"
            Case False: Debug.Print "オーバーフロー"
        End Select
    End With

End Sub
を実行したところ、オーバーフローまで行きました。
何故か7行目にたどり着きません。

理由が分かる方がおられましたら、ご教授ください。
よろしくお願いします。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


間違えました、こちらでも同じ結果です
Sub Test()

    Dim r As Long, cnt As Long

    With Worksheets(4)
        Do
            r = .UsedRange.Rows.Count
            If r < 8 Then Exit Do
            cnt = cnt + 1
            .Rows(r).Delete Shift:=xlUp
        Loop Until cnt > .Rows.Count

        Select Case cnt < .Rows.Count
            Case True:  Debug.Print cnt & " 回実施で終了"
            Case False: Debug.Print "オーバーフロー"
        End Select
    End With

End Sub

(’ふ) 2023/05/19(金) 12:46:37


 よくわかってないんだけど
 >r = .UsedRange.Rows.Count
 この方法だと、
 >            .Rows(r).Delete Shift:=xlUp
 これが意図した通りに動かなくない?

 1行目が空行だと
     |[A]|[B]     
 [1] |   |        
 [2] |  1|<-残る  
 [3] |  2|<-残る  
 [4] |  3|<-残る  
 [5] |  4|<-残る  
 [6] |  5|<-残る  
 [7] |  6|<-残る  
 [8] |  7|<-消える
 [9] |  8|<-消える
 [10]|  9|<-消える
 [11]| 10|<-残る  
 こういう結果になる

 >        Loop Until cnt > .Rows.Count
 これもあり得ないと思うからいらない気がする

 考えられるのは、シートまたはThisworkbookモジュールにChangeイベントが入ってて、消したそばから値が入るとか。
 1048576行を超えるような処理だと1時間くらいかからないかね?

(稲葉) 2023/05/19(金) 13:17:14


 UsedRangeの勉強の趣旨とは違うけど、削除の考え方は一度Rangeオブジェクトに入れてしまったほうが良いような気がする
    Sub test2()
        Dim r As Range
        With Sheets(1)
            With .UsedRange
                Debug.Print "UsedRangeの行数   = "; .Rows.Count
                Debug.Print "UsedRangeの最終行 = "; .Item(.Count).Row
            End With
            Set r = Intersect(.UsedRange, Rows("8:" & .Rows.Count))
            If Not r Is Nothing Then
                r.EntireRow.Delete
            End If
        End With
    End Sub
(稲葉) 2023/05/19(金) 13:26:31

稲葉さん>
勉強ではないのです。

実際に使用している範囲がA1:AG7でUsedRange.Rows.Countが8を返しています。
なので上のコードを実行してUsedRange.Rows.Countが7になるまで
ひたすら8行目を削除するコードを書いたのですが・・・
結果UsedRange.Rows.Countが7になることはなかった、という現象が起きています。

その理由を知りたいのです。

 >        Loop Until cnt > .Rows.Count
 これもあり得ないと思うからいらない気がする
ごのあり得ない現象が起きています。
( 'ふ') 2023/05/19(金) 13:52:30

原因分かりました・・・

セルの枠線を二重線や太線にすると、
その線の上下のセルがUserRangeの範囲となるようです。
例:新規シートのC3セルに太枠を付けた場合、C2:C3が範囲になる
  新規シートのC3セルの下側に太線を付けた場合、C3:C4が範囲になる

これって仕様なんですか?
( 'ふ') 2023/05/19(金) 14:14:08


マジかと思って簡単に↓実験してみたけど本当だった

・新しいブックを作る
・手動でB2:C3の外枠に線を引く
・Debug.Print UsedRange.Address で確かめる

手動で引いた罫線の種類によって、B1:C3、B2:C3、B1:C4の3種類確認できた
(ufj) 2023/05/19(金) 14:48:29


 ほんとだ!!!
    |[A]|[B]                                     
 [1]|  1|                                        
 [2]|  2|                                        
 [3]|  3|                                        
 [4]|  4|                                        
 [5]|  5|                                        
 [6]|  6|                                        
 [7]|  7|<-このセルを上下二重線等にすると、      
 [8]|   |<-いくら消してもこのセルが最終セルになる

 CurrentRegionだと反応しないから、UsedRange特有のあれなのかしら。
 そうすると、UsedRangeの使う機会減るのかなぁ

(稲葉) 2023/05/19(金) 14:53:15


https://www.sejuku.net/blog/74287
 ここで書式について解説してたけど
 「直上の下罫線」については触れられてないから、これはわかりにくいですね・・・。

(稲葉) 2023/05/19(金) 14:56:05


訳が分からない仕様がありますね・・・
線によって見た目上の高さが変わるのが関係しているのでしょうか・・・

何はともあれ、解決できました。
ちょっと納得いかないけども。
( 'ふ') 2023/05/19(金) 17:01:19


コメント返信:

[ 一覧(最新更新順) ]


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