Rows.CountをIntegerに代入

すんごく下らないことで詰まったのでメモ

VBAでEXCELの最終行を代入しようとしたら何度やっても0になってしまって代入できなかった。

こんな感じで書いてた。
Dim rn As Integer
rn = Rows.Count


これを実行すると、何故かrnは0となっている
Rows.Countは選択している領域の行数を出力する関数なので、何も選択していなければEXCELの最大行数が出力されます。
つまり、EXCEL2003形式(.xls)なら65536、2007以降の.xlsxなら1048576が代入されてるはずなのです。
原因は何だろうと、最初は参照型を代入しようとして変なことになってるのかとか、変なこと考えてたんですが、もっと根本的な問題でした・・・orz


はい、勘のいい人は気づいてるかもしれませんが、Integer型は-32,768~32,767までしか代入できないのです・・・orz
代入できる範囲などについて、詳しくはこことか参照。

まったく、メモリーオーバーとか一切エラーでないんですね・・・^^;
まあ、代入するまでは問題無く行く可能性ありますからねー。
でも、戻り値の型は分かってるはずですから、戻り値の範囲より小さい型に代入しようとしてたら警告ぐらい出してくれるべきですよねー(´・ω・`)

ようは、こうすれば代入できるようになりました・・・
Dim rn As Long
rn = Rows.Count


Cのintの範囲と勘違いしてました・・・
全くくだらねーw


追記:
実はそれ以前にVBとも変数の範囲が違うらしい・・・
VB データ型 – Integer, Long, Stringなどの概要

VBとVBAでInteger型の範囲が違うって完全に落とし穴だろw

 

備考: 旧ブログ移植

コメントを残す

メールアドレスが公開されることはありません。