VBA使用最后一列查找最后一行

时间:2014-06-06 21:33:57

标签: excel vba autofill

我希望能够确定特定列的最后一行。但是,本专栏不断变化。因此,我使用变量lastcolumn2来确定我需要弄清楚的列。然后,当我弄清楚最后一行时,我需要自动填充此列。我目前的代码如下:

Dim lastColumn2 As Long
lastColumn2 = Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column

Dim Lastrow2 As Long
Lastrow2 = Range(lastColumn2 & Rows.Count).End(xlUp).Row

Cells(2, lastColumn2 - 1).Select
ActiveCell.FormulaR1C1 = "=IF(AND(RC[-1]>3,isnumber(RC[-1])),10,IF(AND(VLOOKUP(RC[-4],R1C[-11]:R50000C[-6],5,FALSE)=10,RC[-1]<3),""Depart"",0))"
Selection.AutoFill Destination:=Range(Cells(2, lastColumn2 - 1), Cells(785, lastColumn2 - 1))
Range(Cells(2,lastcolumn2,).AutoFill Destination:=Range(Cells(2,lastcolumn2):lastcolumn2 & lastRow)

3 个答案:

答案 0 :(得分:1)

我认为你对自己的必要方法感到困惑。如果你想让最后一列向右,你的方法是合理的。但是,如果您尝试从该列获取最后一行,则使用最后一列的变量不是一个很好的参考。为什么呢?

这是因为您的最后一列是您填写第一个目标的目标。如果你想在那里输入一个公式,要么得到一个辅助引用来锚定你的代码以获得必要的最后一行。

例如,您有以下数据集:

enter image description here

假设我们想在D中加入公式来得到A,B和C之和。但是,这一列的和可以是D,E或F.我们永远不确定它的位置,只有我们需要A,B和C的总和,并且这个列的总和总是在最右边。

要获取最后一列的列索引,以下内容的简单变体就足够了:

Cells(1, Columns.Count).End(xlToLeft).Column

在我们的示例中,这将返回4,这是D的列索引。但是,要获取最后一个有效行,我们不应该从D中获取它。观察只是告诉我们最后一行D中的行只是1.如果在执行代码之前已经在D中有值,那么这将是很好的 - 只有这样它才是有效的引用。但是,最佳实践避免采用这种方法:您应该始终为目标列没有值的时刻做好准备。

获取最后一行索引的最佳位置是A,B或C列中的任何一个。更改上面的代码,我们可以通过以下方式获取最后一行的索引:

Cells(Rows.Count, 1).End(xlUp).Row

我冒昧地假设最好的参考是A列,它将解释Cells(.Rows.Count, 1)部分。

现在,有了这两个变量,而不是使用AutoFill,我更愿意创建一个范围并直接在每个范围的单元格中输入一个公式。我可以创建一个覆盖D列中必要单元格的范围,如下所示:

Set Rng = Range(Cells(2, LCol), Cells(LRow,LCol))

根据我们的预期,上述内容粗略地转换为Set Rng = Range("D2:D10")。从那里开始,一切都是孩子的游戏,有一个简单的公式技巧,可以自动调整自己。

请参阅以下代码,完成限定符并应用上述逻辑。

Sub Rarara()

    Dim WS As Worksheet: Set WS = ThisWorkbook.Sheets("Sheet1") 'Change as necessary.
    Dim LRow As Long, LCol As Long
    Dim RngTarget As Range

    With WS
        LCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set RngTarget = .Range(.Cells(2, LCol), .Cells(LRow, LCol))
        RngTarget.Formula = "=SUM(A2,B2,C2)"
    End With

End Sub

请注意,我在这里使用了With。另外,请查看此With块的结束行之前的最后一行。看看我如何将多个细胞等同于一个看似静态的公式?好吧,在这种情况下,Excel非常聪明,可以在整个范围内“正确”“传播”它。运行代码后,请参阅以下屏幕截图:

enter image description here

钽哒!如果这有帮助,请告诉我们。

答案 1 :(得分:0)

我总是使用“反向查找”方法,因为它是唯一可靠运行的方法。试试这个......

LastRow = Range(lastCol2 & 65536).Cells.Find("*",SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row

您可能需要稍微使用范围内的选择器。

答案 2 :(得分:0)

我最终搞清楚自己的方法,但我很感激帮助!

此处看到的代码:

Dim lastColumn2 As Long
lastColumn2 = Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column

Cells(1, lastColumn2 - 1).Select ActiveCell.FormulaR1C1 = "Charge"

Dim Lastrow2 As Long
Lastrow2 = Worksheets(1).Cells(Rows.Count, lastColumn).End(xlUp).Row

Cells(2, lastColumn2 - 1).Select ActiveCell.FormulaR1C1 = "=IF(AND(RC[-1]>3,isnumber(RC[-1])),10,IF(AND(VLOOKUP(RC[-4],R1C[-11]:R50000C[-6],5,FALSE)=10,RC[-1]<3),""Depart"",0))"
Selection.AutoFill Destination:=Range(Cells(2, lastColumn2 - 1), Cells(Lastrow2, lastColumn2 - 1))