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

Posted

技术标签:

【中文标题】VBA使用最后一列查找最后一行【英文标题】:VBA Finding Lastrow using Lastcolumn 【发布时间】:2014-06-06 21:33:56 【问题描述】:

我希望能够确定特定列的最后一行。但是,此列是不断变化的。因此,我使用变量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)

【问题讨论】:

那么问题出在哪里? 【参考方案1】:

我认为您对必要的方法感到困惑。如果你想把最后一列放在右边,你的方法是合理的。但是,如果您尝试从该列中获取最后一行,则使用 last column 的变量不是一个好的参考。为什么?

这是因为您的最后一列是您首先要填写的目标。如果您尝试在此处输入公式,请获取辅助引用以锚定您的代码以获得必要的最后一行。

例如,您有以下数据集:

假设我们要在 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 足够聪明,可以在整个范围内正确“传播”它。运行代码后看下面的截图:

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

【讨论】:

【参考方案2】:

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

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

您可能需要稍微调整一下范围内的选择器。

【讨论】:

【参考方案3】:

我最终找到了自己的方法,但感谢您的帮助!

这里看到的代码:

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

【讨论】:

以上是关于VBA使用最后一列查找最后一行的主要内容,如果未能解决你的问题,请参考以下文章

excle vba,如何查找一个已知值的行号和列号?

VBA复制最后一行范围并粘贴到另一个工作表

从Range VBA查找最后一个单元格

不确定如何将公式动态粘贴到最后一列和最后一行

EXCEL VBA 如何找到某一数据的行号和列号?

vbscript 查找范围中的最后一列