プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になります。

ActiveSheet.Cells.SpecialCells(xlLastCell).Rowなどのコードで
最終行を取得しようとするとき、縦スクロールバーを下端まで下げた
時に空行を表示してしまうなどをすると正しく取得できなくなると
いったことが起こります。現在では保存すれば修正されるみたい
ですが、保存をせずに正しく取得できるようにするための方法は
ありますでしょうか。

宜しくお願いいたします。

教えて!goo グレード

A 回答 (5件)

#2 です。

ついでに補足を。

実務的には、データのある最終行とか最終セルがほしいことがほとんど
ですよね。SpecialCells(xlLastCell) でも UsedRange でもその動作仕様
を理解している場合は問題なく使えますが、こんな方法が最も確実だった
りします。

Sub Sample2()
  Dim r As Range
  Set r = FindLastCell(ActiveSheet)
  MsgBox r.Address
End Sub

' // シート内の最終データセルを求める(最後のセルではない)
Public Function FindLastCell(ByVal Sh As Worksheet) As Range
 
  Dim lRow As Long, lCol As Long
  
  On Error GoTo Err_
  lRow = Sh.Cells.Find(What:="*", _
             LookIn:=xlValues, _
             SearchDirection:=xlPrevious, _
             SearchOrder:=xlByRows).Row
  lCol = Sh.Cells.Find(What:="*", _
             SearchDirection:=xlPrevious, _
             SearchOrder:=xlByColumns).Column
  Set FindLastCell = Sh.Cells(lRow, lCol)
  
Bye_:
  Exit Function
Err_:
  ' // case no data in the worksheet.
  Set FindLastCell = Sh.Cells(1, 1)
  Resume Bye_
End Function
    • good
    • 4

Excel で最終行の取得方法は複数あります。

下のサイトで検証されています。
すべてを試されてはいかがでしょうか。

ノーツ/ドミノ パワーアップガイド (toru's page) - No.8 ワークシートの最終行、最終列を取得する
http://www.niji.or.jp/home/toru/notes/8.html
    • good
    • 1

ActiveSheet.Cells.SpecialCells(xlLastCell).Row


の仕様上の問題です。まぁバグと言ってしまえばそうなんですが、最早そういう仕様という認識をされた方がよいかと。VBAのサンプルサイトでもその方法を推奨しているところはあまり見かけたことはありません。あったとしても下記のようにちゃんと注意点が書かれていたりします。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …

対策としてはFAQサイトでサンプルとしてよく挙げられている方法を使うべきかと。
例えば下記とか。
ActiveSheet.Range("$A$65536").End(xlUp).Address
    • good
    • 1

こんにちは。



ダミーで良いから一度 UsedRange を使うと最終セルが補正されます。
こんな感じ。

Sub Sample()
  Dim lDummy As Long
  lDummy = ActiveSheet.UsedRange.Row
  MsgBox ActiveSheet.Cells.SpecialCells(xlLastCell).Row
End Sub
    • good
    • 7
    • good
    • 3

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

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

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング