Excel / VBA最后一行/列

时间:2013-05-03 13:04:43

标签: vba excel-vba excel

我需要复制粘贴大页,这需要花费很多时间。 我被告知不要在工作表上使用.copy过程,而是逐个单元地进行。为新细胞提供古细胞的每种特性。这就是我在这里所做的:Saving only some sheets in another Workbook

要按单元格进行单元格,我需要知道包含信息的最后一个单元格。 (不仅是价值,还有颜色,边界......等等)。我在互联网上看到了许多简单的解决方案,但它们都有问题。

ActiveSheet.UsedRange.Rows.Count通常会提供太多的值...我得到了一个5 * 18表的810 * 16000答案

范围(“A”和& activesheet.rows.count).end(xlup).row仅适用于第一列......

最终的方法是用最终的方式来判断真正的最后一行有什么价值?包含信息(值,颜色,边界......)

3 个答案:

答案 0 :(得分:3)

Excel 2010 ActiveCell.SpecialCells(xlLastCell).Select中的此命令会将光标(活动单元格)移动到具有非平凡值的最后一个,即使单元格当前为空白

此命令Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select将选择当前到最后一个具有非平凡值的单元格。

答案 1 :(得分:2)

这两种方法都适用于我获取最后一个单元格2007.我在Excel 2003中也使用了“UsedRange”方法。

如果它们不适合您,则您的电子表格中可能包含Excel未向您显示的内容。这件事发生在我之前。修复方法是选择真实数据下方的每个空行,然后右键单击 - >删除它们(与右侧列相同)。

删除行的快捷方式:Shift + Space,Shift + Control + DownArrow,Rightclick->删除

删除列的快捷方式:Control + Space,Shift + Control + RightArrow,Rightclick->删除

的示例:

set lastCell = ActiveCell.SpecialCells(xlLastCell)

Set lastCell = worksheetObj.UsedRange.Item(worksheetObj.UsedRange.Cells.Count)

答案 2 :(得分:0)

将以下代码保存到类文件名FinalRowLocator

Public Property Get FinalRow(Optional ByVal Col As String, Optional ByVal Min As Boolean) As Long
    FinalRow = pFinalRow(Col, Min)
End Property
Public Property Get Verify(Optional ByVal Col As String, Optional ByVal Min As Boolean) As Long
    Verify = pVerify(Col, Min)
End Property
Private Function pVerify(Optional ByVal Col As String, Optional ByVal Min As Boolean) As Long
    Dim i As Long
    Dim j As Long
    Dim rVerify As Long
    Dim Votes(1 To 5) As Byte
    Dim Congress(1 To 5) As Long
    Dim FRL As New FinalRowLocator
        Congress(1) = FRL.Columbus
        Congress(2) = FRL.GosEgg
        Congress(3) = FRL.OldTimer
        Congress(4) = FRL.RainMan
        Congress(5) = FRL.Slacker
    For i = 1 To 5
        For j = 1 To 5
            If Congress(i) = Congress(j) Then Votes(i) = Votes(i) + 1
        Next j
    Next i
    For i = 1 To 5
        If rVerify < Congress(i) Then rVerify = i
    Next i
    pVerify = Congress(rVerify)
End Function
Public Property Get GosEgg(Optional ByVal Col As String) As Long
    GosEgg = pFinalRow_M1(Col)
End Property
Public Property Get RainMan(Optional ByVal Col As String) As Long
    RainMan = pFinalRow_M2(Col)
End Property
'Public Property Get MathIt() As Long
'    MathIt = pFinalRow_M3
'End Property
Public Property Get OldTimer() As Long
    OldTimer = pFinalRow_M4
End Property
Public Property Get Columbus() As Long
    Columbus = pFinalRow_M5
End Property
Public Property Get Slacker(Optional ByVal Col As Long) As Long
    Slacker = pFinalRow_M6(Col)
End Property
Private Function pFinalRow(Optional ByVal Col As String, Optional ByVal Min As Boolean) As Long
    Dim FinalRow As Long
        Select Case Col
            Case Is = ""
                Select Case Min
                    Case False
                        If pFinalRow_M1 > pFinalRow_M2 Then FinalRow = pFinalRow_M1
                        If pFinalRow_M1 < pFinalRow_M2 Then FinalRow = pFinalRow_M2
                        'If pFinalRow_M3 > FinalRow Then FinalRow = pFinalRow_M3
                        If pFinalRow_M5 > FinalRow Then FinalRow = pFinalRow_M5
                        If pFinalRow_M6 > FinalRow Then FinalRow = pFinalRow_M6
                    Case True
                        If pFinalRow_M1 < pFinalRow_M2 Then FinalRow = pFinalRow_M1
                        If pFinalRow_M1 > pFinalRow_M2 Then FinalRow = pFinalRow_M2
                        'If pFinalRow_M3 < FinalRow Then FinalRow = pFinalRow_M3
                        If pFinalRow_M5 < FinalRow Then FinalRow = pFinalRow_M5
                        If pFinalRow_M6 < FinalRow Then FinalRow = pFinalRow_M6
                End Select
            Case Is <> 0
                    Select Case Min
                        Case False
                            If pFinalRow_M1(Col) > FinalRow Then FinalRow = pFinalRow_M1(Col)
                            If pFinalRow_M2(Col) > FinalRow Then FinalRow = pFinalRow_M2(Col)
                        Case True
                            If pFinalRow_M1(Col) < FinalRow Then FinalRow = pFinalRow_M1(Col)
                            If pFinalRow_M2(Col) < FinalRow Then FinalRow = pFinalRow_M2(Col)
                    End Select
        End Select

        'If pFinalRow_M4 > FinalRow Then FinalRow = pFinalRow_M4 'Disabled, lags behind.

            pFinalRow = FinalRow
End Function

Private Function pFinalRow_M1(Optional ByRef ColLtr As String) As Long
    If ColLtr = "" Then ColLtr = "A"
    pFinalRow_M1 = Range(ColLtr & "65536").End(xlUp).Row
End Function

Private Function pFinalRow_M2(Optional ByRef Col As String) As Long
    Dim i As Byte
    Dim FinalRow As Long
    Select Case Col
        Case Is = ""
            For i = 1 To 26
                If FinalRow < Cells(ActiveSheet.Rows.Count, i).End(xlUp).Row Then FinalRow = Cells(ActiveSheet.Rows.Count, i).End(xlUp).Row
            Next i
        Case Is <> ""
            FinalRow = Cells(ActiveSheet.Rows.Count, Col).End(xlUp).Row
    End Select
        pFinalRow_M2 = FinalRow
End Function

Private Function pFinalRow_M3() As Long
    Dim FinalRow As Long
    Dim ASUC As Long
        ASUC = ActiveSheet.UsedRange.Count
    FinalRow = ASUC / pFinalRow_M2
    pFinalRow_M3 = FinalRow
End Function

Private Function pFinalRow_M4() As Long
    'Works on unmodified (saved) sheet only.
    Selection.SpecialCells(xlCellTypeLastCell).Select
    pFinalRow_M4 = ActiveCell.Row
End Function

Private Function pFinalRow_M5() As Long
On Error GoTo ErrorHandler
    'May have problems with hidden rows
    'This Method returns 0 on a sheet with no data while the others return 1
    pFinalRow_M5 = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Exit Function
ErrorHandler:
    Select Case Err.Number
        Case 91
            'Assume Error is due to no data, return 0
            pFinalRow_M5 = 0
            Resume Next
        Case Else
            On Error GoTo 0
    End Select
End Function

Private Function pFinalRow_M6(Optional ByRef ColLtr As Long) As Long
    If ColLtr <= 0 Then ColLtr = 1
    pFinalRow_M6 = Sheets(ActiveSheet.Name).Cells(Rows.Count, ColLtr).End(xlUp).Row
End Function
Public Function Diagnostics_Run()
    Dim FRL As New FinalRowLocator
        MsgBox "Columbus: " & FRL.Columbus & Chr(13) _
        & "FinalRow: " & FRL.FinalRow & Chr(13) _
        & "GosEgg: " & FRL.GosEgg & Chr(13) _
        & "OldTimer: " & FRL.OldTimer & Chr(13) _
        & "RainMan: " & FRL.RainMan & Chr(13) _
        & "Slacker: " & FRL.Slacker '& _
        ' _ & "MathIt: " & FRL.MathIt & Chr(13)
End Function

Public Property Get DoubleCheck(ByVal Result1 As Long, ByVal Result2 As Long) As Boolean
    If Result1 <> Result2 Then DoubleCheck = False
    If Result1 = Result2 Then DoubleCheck = True
End Property
Private Property Get pPara()
    Dim FRL As New FinalRowLocator
       pPara = FRL.FinalRow(, Not FRL.DoubleCheck(FRL.FinalRow, FRL.Verify))
End Property
Public Property Get Para()
    Para = pPara
End Property 

然后:

Dim FLR as new FinalRowLocator
Dim FinalRow as Long
    FinalRow = FRL.FinalRow

如果您确定了正确的最终结果,则以下情况应该有效。

'This will return the column letter
'This Function is dependant on FinalRow returning the correct value.
Dim rInt As Long
    rInt = ActiveSheet.UsedRange.Count
    psFinalCol = Chr((rInt / FinalRow) + 64)
'This will return the column number
'This Function is dependant on FinalRow returning the correct value.
Dim rInt As Long
    rInt = ActiveSheet.UsedRange.Count
    piFinalCol = rInt / FinalRow

其他使用信息:

Dim FRL as New FinalRowLocator 'Create an instance of the FinalRowLocator Class
Dim FinalRow as Long 'Declare the FinalRow Variable as Long

FinalRow = FRL.FinalRow 'Gets the Highest Number returned from all methods
FinalRow = FRL.FinalRow("", true) 'Returns the lowest number from all methods
FinalRow = FLR.FinalRow("A") 'Gets the highest number (column A) returned from methods 1 & 2
FinalRow = FRL.FinalRow("A", true) 'Gets the lowest number (column A) returned from methods 1 & 2
'FRL.DoubleCheck(FRL.FinalRow, FRL.Verify) 'returns true or false based on if the values match
FinalRow.Para is the same as FRL.FinalRow(, Not FRL.DoubleCheck(FRL.FinalRow, FRL.Verify)) 'Returns the lowest row number if the highest one can not be verified.
'FRL.Verify Determins the FinalRow in a Democratic Manner.
FRL.Diagnostics 'will display the results of each individual method in a msgbox
'***** Methods
FRL.Columbus 'Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row 'May have problems with hidden rows 'This Method returns 0 on a sheet with no data while the others return 1
FRL.GosEgg 'does not count past 65536 rows [Range(ColLtr & "65536").End(xlUp).Row]
FRL.OldTimer 'Selection.SpecialCells(xlCellTypeLastCell).Select [Works on Unmodified Saved Sheet Only]
FRL.RainMain 'Cells(ActiveSheet.Rows.Count, Col).End(xlUp).Row
FRL.Slacker 'Sheets(ActiveSheet.Name).Cells(Rows.Count, ColLtr).End(xlUp).Row