VBA使用LastcolumnfindLastrow

我想能够确定特定列的最后一行。 但是,这个专栏是不断变化的。 因此,我使用variableslastcolumn2来确定我需要弄清楚的列。 一旦我找出最后一行,我需要自动填充这个列。 我目前的代码如下:

 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) 

我认为你用必要的方法搞糊涂了。 如果你想得到最后一列,你的方法是正确的。 但是,如果您试图从该列中获取最后一行,则使用最后一列的variables不是一个好的参考。 为什么?

这是因为你的最后一栏是你填写第一名的目标。 如果你试图在那里input一个公式,可以获得一个辅助引用来锚定你的代码,以获得必要的最后一行。

例如,您有以下数据集:

在这里输入图像描述

假设我们想在D中input公式,以得到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)部分。

现在,使用这两个variables,而不是使用AutoFill ,我宁愿创build一个范围,并直接在每个范围的单元格中input一个公式。 我可以创build一个覆盖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足够聪明,可以在整个范围内“正确地”传播它。 运行代码后请参阅以下屏幕截图:

在这里输入图像描述

当当! 让我们知道这是否有帮助。

我总是使用“反向查找”方法,因为它是唯一可靠工作的方法。 尝试这个…

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

你可能不得不使用范围内的select器。

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

代码在这里看到:

 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))