0

列の長さを教えて、列の最初のレコードを与える簡単な関数を書きたいと思います。したがって、私は次のようなものを書きます...

Public Function getColumnLen(firstCell As Range) As Long

Dim lastRow As Long
lastRow = Range(firstCell.Address).End(xlDown).Row

getColumnLen = lastRow - firstCell.Row + 1
End Function

これで、プロジェクトに「A」と「B」の2つのワークシートがあり、VBAでは次のように呼び出します。

Dim colLen as Long
colLen = getColumnLen(Worksheets("A").Range("A1"))

A1以降のデータの高さを知りたいとき。結果の値は、colLenシート「A」がアクティブであるか「B」がアクティブであるかによって異なります。getColumnLen関数でfirstCellは、それが「A」シートの一部であることを覚えていますが、スクロールはアクティブなシートで行われます。firstCell各呼び出しでアクティブ化する以外に、アクティブなシートに関係なく、これで正しい結果が得られるようにする方法はありますか?

4

1 に答える 1

2

これは、完全修飾されていないセルアドレスを指定しているためです。

lastRow = Range(firstCell.Address).End(xlDown).Row

ここでは、関数を呼び出すときに指定したワークシートに関係なく、をfirstCell.Address返します。$A$1

  • Worksheets("A").Range("A1").Address
  • Worksheets("B").Range("A1").Address
  • Worksheets("Whatever other sheet").Range("A1").Address

これらはすべて戻り$A$1ます!

Addressプロパティを忘れてください。それが何をするのか知りたい場合は、VBAヘルプを読んでください。代わりにこれを行ってください:

lastRow = firstCell.End(xlDown).Row

ただし、範囲に空白のセルが含まれている場合、最後の行を検索するこの方法は失敗することに注意してください。この問題は何億回も解決されています。このサイトを検索するだけですが、提案されたソリューションのすべてが等しく有効であるとは限らないことに注意してください。

于 2012-10-26T07:13:51.610 に答える