• ベストアンサー

ExcelVBAで最終行を誤認する問題の回避方法

popesyuの回答

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.4

ActiveSheet.Cells.SpecialCells(xlLastCell).Row の仕様上の問題です。まぁバグと言ってしまえばそうなんですが、最早そういう仕様という認識をされた方がよいかと。VBAのサンプルサイトでもその方法を推奨しているところはあまり見かけたことはありません。あったとしても下記のようにちゃんと注意点が書かれていたりします。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_100.html 対策としてはFAQサイトでサンプルとしてよく挙げられている方法を使うべきかと。 例えば下記とか。 ActiveSheet.Range("$A$65536").End(xlUp).Address

関連するQ&A

  • エクセルVBAでデータ最終行取得方法

    エクセルVBAでデータ最終行取得方法で良い方法を教えてください。 データの行数、列数は不定。 最多のデータ行の列も不定。 この条件で、データ最終行を取得するにはどうすればよいでしょうか? lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row では、A列の最終行に限定されます。 lastrow = ActiveSheet.Cells(1, "A").SpecialCells(xlLastCell).Row では、列の限定はありませんが、一旦データ入力後、削除した部分まで入ってしまいます。 lastrow = ActiveSheet.UsedRange.Rows.Count では、データ入力後、削除した部分まで入ってしまい、かつ、1行目など上部が空白の場合、不正確になります。

  • excelVBA 行の範囲指定についてです。

    excel2007のVBAの質問です。 1行目から文字入力がされている行までを範囲指定したいのですが、 For i = 1 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row このように入力すると、数式が入力されている行まで指定されてしまいます。 あくまでも 「文字入力がされているところまで」を指定したい場合 どのようにVBAを作成したらよいのでしょうか? よろしくお願いします!

  • 文字が入力されているセルの位置取得について

    セルに文字が入力されている 最左列・最右列・最上行・最下行 を求める場合、 最左列=ActiveSheet.UsedRange.Column 最右列=ActiveCell.SpecialCells(xlLastCell).Column 最上行=ActiveSheet.UsedRange.Row 最下行=ActiveCell.SpecialCells(xlLastCell).Row でよろしいですか? 教えて下さい。

  • 重複する行の削除の方法(VBA)

    エクセルのVBAで質問です。 以下のような表で、   A B C 1 赤 10 × 2 青 20 ○ 3 青 20 ○ 4 黄 30 × 5 緑 10 ○ 6 紫 15 △ 7 紫 15 △ 8 紫 15 △ Aのセルの要素が重複しているこのような場合に1つだけを残したい、 つまり3行目と7.8行目を削除したいのです。 (実際の列数は10、行数は1万程度あります) このような場合、どのようなマクロを組めばいいでしょうか? なお、最終行の場所は lngMaxRow = Cells.SpecialCells(xlLastCell).Rowによって取得しております。 出来れば後学のために処理の簡単な説明も付けていただけると助かります。 宜しくお願いします。

  • 何列の何行目が最終行なのか取得するコードはありますでしょうか?

      A列  B列  C列 1  ○   ○ 2        ○ 3               ○ これは最終行が3行目と言うのがぱっと見でわかりますが もっと列も行も多い場合、 シート内の何列の何行目が最終行なのか取得するコードはありますでしょうか? Cells(65536, ?).End(xlUp).Row を行ないたいのですが 毎回何列の行が一番下かを取得する方法があれば教えてください。 よろしくお願い致します。

  • vba activeSheet.Cells.SpecialCells(xlLastCell).Rowについて

    またまたVBAで質問があります。 分かる方、ご教授願います。 あるフォーマットの見積依頼書を、指定されたフォーマットに変換するマクロを組んでいます。 マクロ実行excelファイルに、処理された見積依頼ファイルから以下のデータを取得します。 ・伝票番号(A列) *A4に手でセット ・会社名    ・郵便番号 ・住所 ・電話番号 ・見積合計(F列) *F4に手でセット activeSheet.Cells.SpecialCells(xlLastCell).Rowを使用し、アクティブシート(上記6つのデータが格納されるシートに設定済み)の最終行番号を取得しようとしているのですが、どうもうまく取得できていないみたいです。 以下質問。 ・初期動作時には、行番号4が取得されると思うんですが、違いますかね?(実際取られる値は5) ・仮に初期動作時に5が取られるなら、2回目には、6が取られますよね?(実際取られる値は5) 何回実行しても、最終行番号5を取得しているみたいです。(保存は処理完了時に毎回上書き保存済み) ソースを張付けますので、どなたかご教授お願いします。 ' 見積書一覧シートをアクティブシートに設定 Set activeSheet = quotationList.Worksheets("見積書一覧") activeSheet.Activate ' 見積書一覧の最終行取得 fileLastRow = activeSheet.Cells.SpecialCells(xlLastCell).Row ' 見積書一覧に取得した値をセット quotationList.Worksheets("見積書一覧").Cells(fileLastRow, 1).Value = sendSlipNo quotationList.Worksheets("見積書一覧").Cells(fileLastRow, 2).Value = sendCompany quotationList.Worksheets("見積書一覧").Cells(fileLastRow, 3).Value = sendPostNo quotationList.Worksheets("見積書一覧").Cells(fileLastRow, 4).Value = sendAddress quotationList.Worksheets("見積書一覧").Cells(fileLastRow, 5).Value = sendTelNo quotationList.Worksheets("見積書一覧").Cells(fileLastRow, 6).Value = quotationSum quotationList.Save 補足 ・quotationListには、マクロ実行excelファイルがworkbookとして格納されています。 ・send~って変数には、予めコピーした値(別シートから)が格納されています。

  • 最終行/処理対象のデータまでを表すVBA

    こんばんは、データの最終行/処理する対象のセルまで処理する場合のVBAの記述について質問させてください!VBAの最終行/処理する対象のセルまで選択するために使用する記述方法が何種類かありますが、そのうち、書籍やネットで検索しても出てこない記述方法について今一つ理解ができていません(T_T) 本屋で売っている書籍やネットで検索すると出てくる記述方法 Range~.End(xlUp).Row Range~.CurrentRegion Range~.SpecialCells(xlLastCell) Range~.Cells(Rows.Count, 1).End(xlUp).Row 上記のようなVBAは書籍やネットで検索すると説明や違いについても出てくるので、説明を読めば理解ができるのですが、 Sheets("テスト").Range("A1:C" & Sheets("テスト").Cells _(1).CurrentRegion.Rows.Count) Range("A1").CurrentRegion.Cells(Range _("A1").CurrentRegion.Cells.Count).Row 上記のようなVBAについては検索しても説明など出てこないうえに、 なぜ上記のような記述になるのかあまり理解できていません(>_<) 書籍やネットで検索すると出てくる「Range~.CurrentRegion」などの記述方法から何となく、CurrentRegionやCells.Countを使わないといけないというのは理解できますが、なぜ「~CurrentRegion.Rows.Count)」はRowsがカッコの中に入っていて、「~CurrentRegion.Cells.Count).Row」はカッコの外に出ているのか??といった細かいことが分からずにいます。。。 半ば丸暗記のようにして使ってしまっているのですが、もし上記のようなVBAについてわかるかたがいらっしゃれば、ご教授いただけるととても嬉しいです! また、上記以外にもまだ検索しても出てこないようなVBAがあるのでしょうか?? 頭が混乱しそうです!(゜Д゜;)

  • プロパティとメソッドが混乱してくる

    ActiveSheet.Cells.SpecialCells(xlLastCell).Addressというステートメントがあるとします。 このどれがメソッドで、どれがプロパティでどれがオブジェクトで、どれがコレクションでと わからなくなってきます。特にメソッドとプロパティは"."で区切られるので混乱してきます。 ActiveSheetオブジェクトのCellsメソッドのSpecialCellsプロパティのAddressプロパティに なるんでしょうか?これは一例ですが、ドットが沢山連なるにつれて意味がわからなくなってきます。 どれがプロパティでどれがメソッドでなどです。どのように見分ければいいでしょか?一応は メソッド、プロパティの違いは理解しているつもりです。

  • VBAで最終行を取得する方法

    最終行を取得する方法について教えていただきたいです。 例えば以下のようなデータがあった場合 (A列~D列、3行までデータがある状態) -------------------------------- 田中 24歳 生命保険 営業 山口 47歳 銀行   営業 大野 36歳 IT    SE -------------------------------- ここで最終行を取得する際に、 Range("A1").End(xlDown).Rowをすれば取得できました。 しかしデータが以下のような場合 (A列が空白) -------------------------------- 田中 24歳 生命保険 営業    47歳 銀行   営業    36歳 IT    SE -------------------------------- この場合に上記と同じ取得方法をすると、オーバーフローになります。 そこで他の取得方法を調べたのですが、 ActiveSheet.UsedRange.Rowを試したところ、最終行として取得できたのは「1」でした。 A列が空白の状態でも、今回の場合だと「3」という最終行を取得するにはどうすれば良いでしょうか。

  • エクセルVBAでの行の取得方法

    myrow = Cells(1, 1).Row + 1 などの方法で行を取得するのではなく、 エクセルのセルにある数字、たとえば A1に3、B1に3 で3行目を取得できませんか? Cellsの括弧の中をValueで指定してもエラーとなります…