VBAでたとえばA列の最後にデータが入っているセルを取得するのに、今まで
Range("A65536").End(xlUp)
という書き方をしてきました。
しかし、Office2007ではExcelの最大列数が従来の256列から16384列に,最大行数が従来の65536行から1048576行に増えました。
そうすると、Excelを2007にバージョンアップしたら、上記の書き方をした既存のマクロを使っているブックのデータが増えていって65536行を超えたとき、マクロが正常に稼動しなくなります。
Range("A1048576").End(xlUp)
とすればExcel2007では動くのかもしれませんが、Excel2003以前のバージョンでは、A1048576などというセルはないのでエラーになります。
できるだけExcelのバージョンに依存しない書き方をしたいのですが、上記のようなA列の最後にデータが入っているセルを求めるには、どういう書き方をすればいいのでしょうか。
自分なりに考えたのは、行数だけ求めるなら、
Range("A1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row
で、この値をInteger型の変数でFor~Nextでループさせる、という方法です。
しかし、ネットで検索していろいろ調べたところ、上記の書き方では不具合が生じることがわかりました。たとえばA1からA10まで値が入っていた場合、
Range("A1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row
では10が求まりますが、A10のセルを選択してDelキー(またはBackSpace)で値を削除しても、上の式の結果は10のままなのです。(Selectすると、空白のセルが選択されます)
Excelのバージョンに依存しない、データが入っている最終行の求め方でいい方法はないでしょうか?
No.7ベストアンサー
- 回答日時:
こんにちは。
私自身は、あまり、Excel 2007 VBA自体に触ることもないような気がしているので、特に、あまり気にしていないのですが、こんな風にすればよいですね。
以前は、こう書きましたが、明示的ではないので、廃れたのだと思います。また、復活ですね。
Cells(Rows.Count, 1).End(xlUp).Select
>Range("A1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row
それ自体に、無理がありますね。CurrentRegion と、SpecialCells(xlCellTypeLastCell) との結びつきが薄いからです。親戚ではあっても、根っこの違うものを、繋げて使うのは良くありません。SpecialCells(xlCellTypeLastCell) これ自体が、勝手に範囲を取ろうとするからです。
SpecialCells は、ワークシート系(オブジェクト・ブラウザの[Excel]という項目に入ります)で、一般的にVBAでは用いられますが、SpecialCells メソッドは、UsedRangeでも、CurrentRegion でもない、独自の範囲の取り方をします。おそらく、ワークシートのショートカットなどとつながっているものだと思います。もちろん、ないはずのA10 の位置は、一旦保存すれば直りますが。
CurrentRegion で、取るというのでしたら、以下のようになりますね。良かったら試してみてください。
With ActiveSheet.Range("A1").CurrentRegion
i= .Cells(.Count).Row
End With
なお、Version で行数などを替える方法には、#if Directive 構文という方法がありますが、そこまでの致命的な問題はなさそうです。
昔はRow.Countを使っていたのですね。SpecialCellsに関しても詳しい解説をありがとうございます。Wendy02さんのご回答はいつも勉強になります。どうもありがとうございました。
No.8
- 回答日時:
こんなのがありました。
ActiveSheet だとして、
Cells(ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row(), 1).Select
参考URL:http://www.microsoft.com/japan/technet/scriptcen …
No.6
- 回答日時:
Dim myLastCell As Range
Dim r As Integer
Set myLastCell = Range("A1").SpecialCells(xlCellTypeLastCell)
If myLastCell.Value = "" Then
r = Cells.Find("*",myLastCell, , ,xlByRows,xlPrevious).Row
Else
r = myLastCell.Row
End If
Msgbox "最終行は" & r & "行です"
上記VBAスクリプトを実行したらどうなりますか?
よくあるパターンです。ExcelVBAの参考書を1冊買われたらいかがですか?
VBAの参考書は持っていて、それで勉強してはいるのですが、この回答のパターンは載っていませんでした。
(「最終行の求め方」で、質問文に書いたRange("A65536").End(xlUp)が載っていたのですが…)
Rows.Countを使うことで解決しそうです。ご回答ありがとうございました。
No.5
- 回答日時:
1. Application.Versionでバージョンを調べ、グローバル変数に
対応した最終行を入れておく。
2. Range("A65536").End(xlUp)と同様にCells(最終行,1).End(xlUp)
じゃ駄目ですか?
Rows.Countを使うことで解決しました。
Application.Versionでわけるという方法も、他に異なる仕様が出てきた場合に使えそうですね。勉強になりました。
ご回答ありがとうございました。
No.4
- 回答日時:
ちょっと、回答とは違うんだけど・・・。
基本的に、ソフトウェア開発というものは下位バージョンとの互換性は考慮するけど、上位バージョンとの互換性は考慮できない。
そのため、どんなアプリでも対応OSを記載してる。
基本的な考え方としては、バージョンを取得して処理を分岐させるのがもっとも一般的なものだと思う。
今回の場合なんかは、Application.Version関数を利用してバージョンごとに異なる数値を割り当てるのがメンテナンスしやすいんじゃないかな~?
Selectステートメントにしておけば、Caseを追加してくだけで今後行の最終値については取得できるようになると思うし。
あと、将来的に、対応できるようなプログラムというものは作ることができない。
それは、現在のプログラムというものはOSの上でのみ動くものだからね。
OSが進化している以上、プログラムの対応は必然的に発生するし・・・。
・・・とこんなこといってもしょうがないので、ちょっと考えてみました。(相当強引)
1行目から+1行していく無限ループ作って、エラーをわざと発生させる。
Excel2007は1048577でエラーが発生するし、Excel2007以外では65537でエラーが発生する・・・はず。
そのエラーをOn Errorステートメントでキャッチして、その値から-1すれば求められるんじゃないかな?
そのあと、Range(変数).End(xlUp)で求められると思うけど・・。
テストしたわけじゃなく、しかも、あくまで私の頭の中なんで参考程度にね・・・。
ただ、ロジック的に綺麗じゃないし、処理は遅くなるだろうし、相当邪道っぽいけどね。(^.^;;)
私もソフトウェア開発に携わっていたので、仰ることはよくわかります。確かに上位バージョンとの互換性というのは、将来のバージョンで仕様がどう変わるかわからないので、考慮しようがないですね。
しかし今回の質問に関しては、Excel2007というのがまだ誰も仕様がわからない、という未知のものでなく既に発売されており仕様もわかっており、
「Excel2007で動作するが、まだ2003や2000を使っている人が多いことを考慮にいれて、それらでも支障なく動くようなVBAの書き方は?」
ということなので、どちらかと言うと下位互換性の話になるのかな~という感じです。
Application.Versionでわけるという方法は、他に今までのバージョンと違う仕様が出てきた場合(関数の仕様などが微妙に変わったりだとか。あるかな~、MSならこっそりやりそう…)に使えそうですね。参考になりました。
ご回答どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
白血球が多いとどんな心配があ...
-
勃起する時って痛いんですか? ...
-
風俗店へ行く前のご飯
-
イタリアから帰国する際、肉製...
-
甲状腺が腫れているが血液検査...
-
エクセル指定した範囲からラン...
-
精子が黄色?
-
これって喉仏ですか? 私は女性...
-
EXCELで条件付き書式で空白セル...
-
精子に血が・・・
-
急に主人の性欲が強くなった
-
一番多く表示のある値(文字列...
-
精液の落とし方を教えてください
-
エクセルで数式の答えを数値と...
-
2つの数値のうち、数値が小さい...
-
テスターで断線を調べる方法教...
-
VLOOKUP関数を使用時、検索する...
-
検便についてです。 便は取れた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
白血球が多いとどんな心配があ...
-
勃起する時って痛いんですか? ...
-
精子が黄色?
-
検便についてです。 便は取れた...
-
これって喉仏ですか? 私は女性...
-
小数点以下を繰り上げたものを...
-
甲状腺が腫れているが血液検査...
-
精液の落とし方を教えてください
-
エクセル指定した範囲からラン...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
精子に血が・・・
-
エクセルのラベルの値(文字列...
-
イタリアから帰国する際、肉製...
-
ある範囲のセルから任意の値を...
-
リンク先のファイルを開かなく...
-
中出しをするとお腹が痛い・・・。
-
MIN関数で空白セルを無視したい...
おすすめ情報