[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
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
ここで書式について解説してたけど 「直上の下罫線」については触れられてないから、これはわかりにくいですね・・・。
(稲葉) 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.