[[20231005102818]] 『シートの最終行取得』(もん) ページの最後に飛ぶ

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

 

『シートの最終行取得』(もん)

お力添えいただきたく。

各列の行数がバラバラなリストにおいて、最終行番号を1発で取得する方法はありますか?
例えば、A列は6行までデータがあり、B列には3行、C列には10行のように
列ごとに羅列するデータ数が異なった場合に、そのシート上における最終列番号を取得したいです。

因みに、「Cells.Find("*", , xlValues, , , xlPrevious).Row」で取得できていたという認識なのですが、突如取得できない状態になりました。

< 使用 Excel:Excel2019、使用 OS:Windows11 >


 SearchOrder引数を明示すると良いのでは?
(xyz) 2023/10/05(木) 10:41:30

 2016 ですが Cells.Find("*", , xlValues, , , xlPrevious).Row でできますね。

 Range("A1").CurrentRegion(Range("A1").CurrentRegion.Count).Row なんてのはどうでしょ。
(xlg) 2023/10/05(木) 10:45:13


 SearchOrder引数を明示すると良いのでは?
⇒コメントありがとうございます。
サーチオーダーの引数は何にすればよいでしょうか?

2016 ですが Cells.Find("*", , xlValues, , , xlPrevious).Row でできますね。
 Range("A1").CurrentRegion(Range("A1").CurrentRegion.Count).Row なんてのはどうでしょ。
⇒後者の方で取得できました!!
ありがとうございます!
これはどのような処理になるのでしょうか?
(もん) 2023/10/05(木) 10:54:51


>これはどのような処理になるのでしょうか?

 A1 を選択し、Ctrl+Shift+* で選択された範囲(CurrentRegion)の右下の行番号を求めてます。

 変な具合に空白セルがあって全体が選択されない状態だとうまくいきませんが。
(xlg) 2023/10/05(木) 11:10:05


行ごとを指定して下さい。
ご自分でヘルプくらい確認して下さいよ。
Findは履歴依存なので必要な引数は省略しないことが肝心でしょう。 
(xyz) 2023/10/05(木) 11:17:13

 Findメソッドのヘルプには、以下の記述があります。
 > LookIn、LookAt、SearchOrder、および MatchByte の設定は、このメソッドを使用するたびに保存されます。
 つまり、それらを省略したときには、直前に使用したときの設定が引き継がれて適用されるので、注意が必要です。
 たぶん、その直前にSearchOrder:=xlByColumnsに相当する検索をしたために、
 最終行を得るための指定が崩れてしまったことが原因でしょう。
 これらの引数は省略しないでその都度指定したほうが安全です。

 その最終行取得処理の理屈を理解されておいたほうが、よいと思います。
 以前に、こちらのサイトで回答したものを再度掲載しておきます。参考にしてください。

 ------------------ 引用開始 --------------------------
 最終行 = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 最終列 = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
 これは説明が要りますね。
 【ながーい説明】
 (1)After引数が省略されています。
    このときは、検索対象範囲の左上端のセル(つまり、A1セル)を起点に、
    その次のセルから検索を始めます。
 (2)SearchDirection:=xlPrevious ですから、後ろ向きに進みます。
    "A1セル"の一つ前のセルとはどこでしょうか。
    これは"メビウスの帯"のように(知らなければスキップ下さい)、
    "A1セル"の一つ前のセルは、(1,048,576,"XFD")セルと考えます。
 (3)SearchOrder:=xlByRows       ですから、行毎に検索していきます。
    つまり、
      (1,048,576,"XFD")セル →  (1,048,576,"XFC")セル →  ・・・・ → (1,048,576,"A") →
      (1,048,575,"XFD")セル →  (1,048,575,"XFC")セル →  ・・・・ → (1,048,575,"A") →
          ・・・・
      (        1,"XFD")セル →  (        1,"XFC")セル →  ・・・・ → (        1,"A") 
    の順序に、"*"、つまり、""以外の何かが入っているセルを検索します。
    この結果、(罫線とか色とかは無視して)何かが入っている一番下の行が最初にヒットします。
 (4)そのRowですから、結局、最終行を得ることができるわけです。
 (5)最終列も同様に、シートの右下隅のセルから、列に沿って、後ろ向きに検索しますから、
   ""以外の何かが入った最終列を求めることができるわけです。
 これは、それぞれが一行で書けるので、理屈が分かってしまえば、使いまわしができます。
 # こちらの掲示板でもこれを使って何回か回答したことがあります。

 【結論】
  |    MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row             '1列目で最終行を取得
  |    MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column   '1行目で最終列を取得
 をそれぞれ、
  MaxRow = .Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
  MaxCol = .Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
 とすればよいはずです。
 ------------------ 引用終了 --------------------------

(xyz) 2023/10/05(木) 12:22:57


コメント返信:

[ 一覧(最新更新順) ]


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