9

次のコードの値を含む列Aの最後の行を見つけようとしています。

LastRow = DataWorksheet.Range("A:A").Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row

これは、最後の数行が除外される場合を除いて、ほとんどの場合に正常に機能します。たとえば、30行のデータがあるとします。行1〜10が表示され、11〜20が除外され、21〜30が表示されている場合、最後の行が正常に検出されます。30が返されます。すべてが表示され、行21〜30が除外されると、LastRowは1を返します。

行21〜30を除外する代わりに手動で非表示にすると、最後の行が20であることがわかります。

何が得られますか?最後の行がフィルタリングされている場合、どうすれば最後の行が何であるかを判断できますか?

編集:これで、LastRowが最後のフィルタリングされていない行を選択しているように見えます。これは、以前の動作からの明確な逸脱です。発生しているバグ/不整合をより適切に特定できるようになったら、この投稿を更新します。

4

7 に答える 7

3

これらはフィルタリング/可視性を無視し、最後に使用された行番号を提供する必要があります:

DataWorksheet.UsedRange.Rows.Count

-また-

DataWorksheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row

ただし、列 A で最後に使用されたセルも見つかりません...それが必要ですか?

于 2013-01-07T17:01:36.860 に答える
1

これはどうですか(XLの制限に対する一種の回避策として)。ループは長くて不格好ですが、少なくともループは最初に表示される最後のセルから始まります。

LastRow = DataWorksheet.Range("A:A").Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row


If LastRow <> DataWorksheet.UsedRange.Rows.Count 'assumes data starts in A1, if not adjust acoordingly

'now check if there is anything below

    Dim rngSearch as Range
    rngSearch = DataWorksheet.Range("A" & LastRow & ":A" & DataWorksheet.UsedRange.Rows.Count)

    Dim lngRows as Long, lngCnt as Long
    lngRows = rngSearch.Rows.Count

    For lngCnt = lngRows to 1 Step -1

        If DataWorksheet.Range("A" & lngCnt) = vbNullString And DataWorksheet.Range("A" & lngCnt -1) <> vbNullString Then

            LastRow = DataWorksheet.Range("A" & lngCnt-1).Row
        End If

    Next

End If
于 2013-01-07T18:04:33.857 に答える
1

これは、非表示の行とオートフィルターの両方を持つシートで機能します。また、値を持つ最後のセルの下のセルがフォーマットされている場合、間違った行は表示されません (これにより、使用範囲が探している行よりも大きくなります)。

Sub FindLastRowWithValue()
    Dim ws As Worksheet
    Dim temp As Worksheet
    Dim lastrow As Long

    ' copy the sheet that may have hidden rows
    Set ws = Sheets("Sheet1")
    ws.Copy Before:=Sheets(1)
    Set temp = ActiveSheet

    ' turn off autofiltering if need be
    If temp.AutoFilterMode Then temp.AutoFilterMode = False

    ' unhide all rows
    temp.Columns("A:A").EntireRow.Hidden = False

    ' get the last row with a value now that all rows are unhidden
    lastrow = temp.Range("A" & temp.Rows.Count).End(xlUp).Row

    ' delete the temporary sheet
    Application.DisplayAlerts = False
    temp.Delete
    Application.DisplayAlerts = True

    MsgBox lastrow
End Sub
于 2013-01-09T02:34:34.113 に答える