質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

13459閲覧

EXCELVBAで、罫線がある表の最終行がうまく取れないときがある

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/07/29 02:54

(質問が2点あります)

今度ExcelVBAのエキスパート資格を取ろうかと考えてExcelVBAの勉強をしている最中です。

そこで今回、表の最終行を取得するコードを書いているのですが、
最終行を取得するには色々な方法があることを知りました。

特に

  1. :表の中に空白がある場合
  2. :罫線が引いてある表の場合

この2点は注意が必要だということも分かりました。

そして今回お聞きしたいのは、2についてです。

2について、表に罫線が引いてあると、以下のコードを使っても最終行を取得できないことがあります。

[質問1]---------

例えば、以下の図だと

イメージ説明

列3番目のところで最終行の結果は7となるようにしたいのですが、

VBA

1Cells(3, Columns.Count).End(xlToLeft).Column

このコードだと、結果は「4」です。

ですが、

VBA

1Range("C65536").End(xlUp).Row

このコードだと、結果はちゃんと「7」が返ってきます。

ここで、Cellsの場合だとなぜ結果が「4」となり正しく返ってこないのかが分かりません。

ちなみに全体のコードは

VBA

1Option Explicit 2 3Sub test() 4 5Const stroutput_FName As String = "練習.xlsb" 6Const stroutput_SheetName As String = "テスト" 7 8Dim wboutput As Workbook 'アウトプットファイル格納 9Dim wboutput_Sheet As Worksheet 'アウトプットファイルのシート 10Dim endcol As String 11 12 'アウトプットファイルのファイルパスを取得 13 Workbooks.Open ThisWorkbook.Path & "\" & stroutput_FName 14 Set wboutput = ActiveWorkbook 15 Set wboutput_Sheet = ActiveWorkbook.Worksheets(stroutput_SheetName) 16 17 '最終行をチェック 18' endcol = wboutput_Sheet.Range("A1").End(xlDown).Row 19 20 endcol = Cells(1, Columns.Count).End(xlToLeft).Column 21 endcol = Cells(2, Columns.Count).End(xlToLeft).Column 22 endcol = Cells(3, Columns.Count).End(xlToLeft).Column 23 endcol = Cells(4, Columns.Count).End(xlToLeft).Column 24 25 endcol = Range("A65536").End(xlUp).Row 26 endcol = Range("B65536").End(xlUp).Row 27 endcol = Range("C65536").End(xlUp).Row 28 endcol = Range("D65536").End(xlUp).Row 29 30End Sub

です。
(テストなのでステップインで1行ずつテストをして確かめています)
どこかが間違っているのでしょうか?

(なお、Celssで取得している行で最初の1行以外全て間違った結果が返ってきています)

[質問2]------

今回、Range("C65536").End(xlUp).Row というコードでうまく取得できることが
分かりました。
しかし、65536と直接入れて今は動かせていても、
今後例えばExcelのバージョンが変わった時にExcelの最終行が変わったりすることも
あるかもしれませんし、または例えば業務で大量のデータを扱う時などは
もしかしたら65536行以上のデータが入ることだってあるかもしれませんし・・・

なので、これでいいのかな?と思っています。

何か良い置き換えというか、そういうコードはありますでしょうか?

以上よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torisan

2019/07/29 05:51

他の方からも指摘がありますが、結果は7で良いのでしょうか? 罫線を生かすなら、10となりそうですが。
退会済みユーザー

退会済みユーザー

2019/07/30 01:31

お返事が遅くなり申し訳ありません。 結果は7で良いです。 ありがとうございます。
guest

回答2

0

ベストアンサー

VBA

1Cells(3, Columns.Count).End(xlToLeft).Column

このコードは、3行目の一番右の列番号を取得しようとしています。
結果として「しょうゆ」が入っている4列目になりますので「4」が返ってきています。

Columns.Countは、そのExcelのバージョンで扱える最大の列番号を取得すると考えて良いでしょう。
End(xlToLeft)で最大の列番号から左方向に見ていき、何らかのデータが入っているセルを探します。
最後のColumnメソッドで「しょうゆ」が入っている行番号を返しています。

VBA

1Range("C65536").End(xlUp).Row

このコードは、C列の一番下の行番号を取得しようとしています。
結果として「モモ」が入っている7行目になりますので「7」が返ってきています。
先のColmnsメソッドが列番号を返すのに対して、Rowメソッドは行番号を返します。

VBA

1Cells(Rows.Count, 1).End(xlUp).Row

定型文としては、上記のコードで最終行を取得します。
A列の場合は1、B列の場合は2と書き換えると良いでしょう。

投稿2019/07/29 03:19

Secret

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Range("C65536").End(xlUp).Row というコード

ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
1列番号

このコードだと、結果は「4」です。

RowじゃなくてColumnを取っているようですが

あと罫線は関係ない と お も う

投稿2019/07/29 03:16

hentaiman

総合スコア6415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問