1

私はこのような機能を持っています:

Function GetLastRowOnSheet(ByVal SheetName As Worksheet) As Long
    On Error Resume Next
    GetLastRowOnSheet = SheetName.Cells.Find(what:="*", after:=SheetName.Cells(1),     searchorder:=xlByRows, searchdirection:=xlPrevious).Row
    On Error GoTo 0
End Function

「Sheet1」というシートがあるとしましょう。Excel シートで、 =GetLastRowOnSheet('Sheet1') と言うか、名前付き範囲を使用できるようにしたいと考えています。

上記の関数と、これを含むサブルーチンまたは関数を使用して、vba でこれを簡単に行うことができます。

Dim Sheet1 As Worksheet
Dim LastRow as Long
Set Sheet1 = ThisWorkbook.Sheets("Sheet1")
LastRow = GetLastRowOnSheet(Sheet1)

' last row then returns the last filled in cell on the sheet

考え?

4

3 に答える 3

6

代わりに次のコードを使用する必要があります。

Function GetLastRowOnSheet(ByVal SheetName As String) As Long
    Dim wks As Worksheet

    On Error Resume Next
    Set wks = ActiveWorkbook.Worksheets(SheetName)
    GetLastRowOnSheet = wks.Cells.Find(what:="*", after:=wks.Cells(1), searchorder:=xlByRows, searchdirection:=xlPrevious).Row
    On Error GoTo 0
End Function

100% 確信があるわけではありませんが、今のところ、Worksheet-Object を Worksheet-Function-Parameter として渡すことができるかどうかは非常に疑わしいと思います。そのため、代わりに文字列を使用しました。

を使用しているためResume Next、ワークシートが実際に存在するかどうかを確認する必要はありませんが、存在しない場合は確認する必要があります。

ただし、Worksheet-Name を参照する限り、NAMED-Range を簡単に使用できるようになりました。

編集

このワークシート関数の入力としてワークシート名を動的に取得するのは面倒なので、これを行うためのより良い方法を見つけました。これを直接行うための組み込み関数はありません - 少なくとも私は見つけられませんでした。Cell("address")それに一番近いでしょう。

Function GetLastRowOnSheet(ByVal SheetName As Range) As Long    
    On Error Resume Next
    With SheetName.Worksheet
      GetLastRowOnSheet = .Cells.Find(what:="*", after:=.Cells(1), searchorder:=xlByRows, searchdirection:=xlPrevious).Row
    end with
    On Error GoTo 0
End Function

GetLastRowOnSheet(SheetXY!A1)orを使用できるようGetLastRowOnSheet(NAMEDRANGE)になりました。これは非常に簡単で、すでに誤った入力に対する保護を提供しています。

VBA で使用するには、次のように使用できます。

Dim LastRow as Long
LastRow = GetLastRowOnSheet(ThisWorkbook.Sheets("Sheet1").Cells)
于 2012-11-15T14:37:21.843 に答える
2

Worksheet の代わりに Variant 型を使用する必要があります。私のために働いた。

Function GetLastRowOnSheet(SheetName As Variant) As Long
    On Error Resume Next
    GetLastRowOnSheet = SheetName.Cells.Find(what:="*", after:=SheetName.Cells(1),     searchorder:=xlByRows, searchdirection:=xlPrevious).Row
    On Error GoTo 0
End Function
于 2014-04-07T06:28:14.173 に答える
0

シートNAMEはシートOBJECTではありません。

シートNAMEがあるときにシートOBJECTを参照するには、ThisWorkbook.Sheets(SheetName)を使用できます。ここで、SheetNameは関数パラメーターであり、タイプは文字列であり、タイプはワークシートではありません。

名前付き範囲はグローバル(ワークブック全体)レベルまたはローカル(ワークシートのみを含む)レベルである可能性があるため、範囲の場合は少し難しくなります。

したがって、2つの可能性を確認し、どちらか一方を優先するか(最初にローカルで確認し、存在するかどうかはグローバルに続行します)、ユーザーが好みを表現できるようにするか、ユーザーが指定する必要がある2番目のパラメーターを作成する必要があります。

于 2012-11-15T14:38:14.487 に答える