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使用最后一列查找最后一行的主要内容,如果未能解决你的问题,请参考以下文章