[[20200309053612]] 『最終行を取得するVBAのコード−について』(あっこ) ページの最後に飛ぶ

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

 

『最終行を取得するVBAのコード−について』(あっこ)

初歩的な質問です。
https://www.fastclassinfo.com/entry/inventory_control_system
のサイト内で、

cmax1 = ws1.Range("A65536").End(xlUp).Row
cmax2 = ws2.Range("A65536").End(xlUp).Row

と書かれています。
※以前、cmax1の変数の付け方には、このサイトで御指南いただきました。

ここの「ws1.Range("A65536").End(xlUp).Row」の「"A65536"」「xlUp」はどこを指し示すのでしょうか?

Range("A1").End(xlDown)ならばなんとなく理解できるのですが、A65536がどこから来たのか、また、なぜxlUpなのかがわかりません。
このマクロは、「新しくデータが増えたらしたのほうに追加していく」マクロのようなので、xlDownなのではないのでしょうか。

自分なりに本やネットで調べたのですが、調べ方や調べるポイントがどこなのかよくわかりませんでした。

ご教示頂けますと幸いです。何卒よろしくお願い申し上げます。

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


追加の質問になりますが、在庫管理の見本マクロでもう少し簡単なマクロを組んでいるサイトや初心者でもわかりやすい本があれば、ご教示頂けますと幸いです。もし、お分かりの方がいらっしゃったら、教えていただけますと幸いです。不躾なご依頼申し訳ございません、よろしくお願いいたします。
(あっこ) 2020/03/09(月) 06:14

ws1.Range("A65536").End(xlUp).Row
はws1のA65536から上方向に検索していき、データ入力されているセルに当たったら、そのセルの行番号を取得するという意味です。
つまり「ws1.Range("A65536").End(xlUp).Row」はA列のデータが入力されている行番号の最大値という1〜65536までの間の整数値のいずれかとなります。
その後のコードでその行番号に1を足して新しくデータ入力する行を決定するといったプロセスがあるのではないでしょうか?
もちろん、ws1.Range("A1").End(xlDown)でも同じく最大行番号は取得できると思いますが、例えば上から検索すると途中に空白セルが含まれるデータの場合では、下から検索したほうが確実ということではないでしょうか?
上からの検索でも確実に最終行を取得できる仕組みであれば、どちらでも目的は達成できると思います。

追加質問についてですが、個人的には一番優秀な教材はgoogle先生だと思っています。
先人が書かれたソースコードがネットにいっぱい散らばっており、そのコードを読んで意味を理解できるようになるというのが手っ取り早い勉強方法ではないかと。
前述の検索方向にしても、そのコードで取得できるものが何なのかという意味を理解できていれば、UpでもDownでもどちらでも目的が達成できそうだったり、Downの場合の注意点に気づくことができると思います。
(おさんどん) 2020/03/09(月) 06:29


>初歩的な質問です。
既に同種の回答がありますが、そのように断言できるくらいなら、もうちょっと調べてみるとよいです。
http://www.niji.or.jp/home/toru/notes/8.html
https://www.excelspeedup.com/vbalastrow/
http://officetanaka.net/excel/vba/tips/tips130.htm

ちなみに。紹介したサイトにも書いてありますが

 〜 Excel2003 :  65536行目が最大行 (2の16乗)
 Excel2007 〜 :1048576行目が最大行  (2の20乗)

です。

(もこな2) 2020/03/09(月) 07:23


 あちゃー。衝突しましたがそのままアップします。

 >「"A65536"」

 これは、エクセル2002までの遺産ですね。
 エクセル2002までは、ワークシートの行数は
 65536行でした。256の2乗ですね。
 そのあとに出たバージョンからは1048576、
 つまり、1024の2乗行です。

 ただ、
 Rows.Count
 で、どのバージョンであってもワークシートの最大行数
 は取得できます。

 ですので、特に1048576行のバージョン(どのバージョン
 だったかは覚えてないです)が出たときに、新旧のどの
 バージョンでも使えるように、ということで、行数のハード
 コーディングを止めて、
 Rows.Count
 で行数を取得する方法にしておくべきだ、というやり取りが
 多くみられるようになりました。
(OK) 2020/03/09(月) 07:28

まず、Cells(Rows.Count, "A").End(xlUp).Row の原理ですが、シート上で CTRL+↑(上下左右)とすると、データのある連続したセルまたは連続した空欄のセルを飛ばし、切り替わるセルまで一瞬で移動できます。 これを利用し、最下行から CTRL+↑ とした場合の行位置を得ているのが、この1文です。

なんで上から CTRL+↓にしないかというと、データの途中に空欄があるかどうかで結果が変わってくるからです。 上からだと、空欄行で止まってしまうのですね。 なので、下からにして最下行を得て、途中空欄の場合は処理しないようにコーディングするのが便利なのです。(絶対途中空欄はない、という場合には、上からでOK)

なお、この書き方を使う場合、データが1件もない場合を考慮してください。 例えば、1行目はタイトル行で、2行目からはデータ、という場合、1件も無いと、CTRL+↑の結果は1行目になります。 2行目からデータのある最終行まで処理、というコードだと、データ部だけ変えるはずが、タイトル行を上書きしてしまう結果になるので、注意。
(???) 2020/03/09(月) 10:47


 Excel97、2000、2002、2003の最大行数が65536だってこと。
 97時代、95(16384行)も考慮して、Rows.Count を使うこともしばしば。
 65536が当時は簡単だったので、65536を使う人が多かった。
 2007なら、ws1.Range("A1048576").End(xlUp).Row と書いてるところ。

 今は、2007以降対応で、Rows.Countばっかり。
 Rows.Count は、シートの行数が、16384、65536、1048576とエクセルのバージョンによって変わる。
(BJ) 2020/03/09(月) 13:21

おさんどん様

「ws1.Range("A1").End(xlDown)でも同じく最大行番号は取得できると思いますが、例えば上から検索すると途中に空白セルが含まれるデータの場合では、下から検索したほうが確実ということではないでしょうか?」そうだったのですね、、まったく思いつきもしませんでした。原理もわかりました。Google先生が一番とのこと、耳が痛いです。自分では調べたつもりだったのが恥ずかしいです。優しく御指南いただき、ありがとうございます。

もこな2様

「自分で調べてはどうか」は本当に耳が痛いです。わからなくなったらとりあえず調べる、ではなく、調べまくるようにしてみます。今は調べるサイトもよくわからずで、不勉強で本当にお恥ずかしいです。また、そいう言いながらも、教えて頂きまして、ありがとうございます。紹介いただいたサイト、読ませて頂きました。ありがとうございます。

OK様

ありがとうございます。さっそくハードコーディングをググってみました。Rows.Countを教えて頂きまして、ありがとうございます。A65536が2002までの遺産だったとは、知りませんでした。恥をかきましたが、この掲示板で質問してよかったです。

???様

ありがとうございます。Rows.Countについて、原理までさかのぼり、詳しくご教示頂き、ありがとうございます。タイトルの件も承知しました。細かなところまで、御指南ありがとうございます。

BJ様

Rows.Countの歴史をわかりやすく教えていただき、ありがとうございます!コードの書き方で書き手がどのバージョンをよく使っていたかまで推測できますね。面白い発見でした。ありがとうございます。

(あっこ) 2020/03/10(火) 06:11


コメント返信:

[ 一覧(最新更新順) ]


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