
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Excel(エクセル) Excelのマクロで、特定のセルから順番に値を取得したい 5 2022/12/06 15:34
- Excel(エクセル) Excleマクロ セル値の代入と文字列の結合について 3 2022/10/05 16:47
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
尿検査前日に自慰行為した時の...
-
値が入っているときだけ計算結...
-
excelでsin二乗のやり方を教え...
-
VLOOKUP関数を使用時、検索する...
-
尿検査の前日は自慰控えたほう...
-
彼女のことが好きすぎて彼女の...
-
EXCELで条件付き書式で空白セル...
-
至急!尿検査前日にオナニーし...
-
リンク先のファイルを開かなく...
-
EXCELで式からグラフを描くには?
-
Excel 数値の前の「 ' 」を一括...
-
小数点以下を繰り上げたものを...
-
【Excelで「正弦波」のグラフを...
-
精子に血が・・・
-
2つの数値のうち、数値が小さい...
-
検便についてです。 便は取れた...
-
Excel 0目標に対して数字があ...
-
一番多く表示のある値(文字列...
-
ワードのページ番号をもっと下...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
尿検査前日に自慰行為した時の...
-
至急!尿検査前日にオナニーし...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
値が入っているときだけ計算結...
-
リンク先のファイルを開かなく...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
尿検査の前日は自慰控えたほう...
-
MIN関数で空白セルを無視したい...
-
小数点以下を繰り上げたものを...
-
風俗店へ行く前のご飯
-
エクセルで空白セルを含む列の...
-
Excel 数値の前の「 ' 」を一括...
-
【Excelで「正弦波」のグラフを...
-
納豆食べた後の尿の納豆臭は何故?
-
EXCELで式からグラフを描くには?
-
ある範囲のセルから任意の値を...
おすすめ情報