我希望能够确定特定列的最后一行。但是,本专栏不断变化。因此,我使用变量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)
答案 0 :(得分:1)
我认为你对自己的必要方法感到困惑。如果你想让最后一列向右,你的方法是合理的。但是,如果您尝试从该列获取最后一行,则使用最后一列的变量不是一个很好的参考。为什么呢?
这是因为您的最后一列是您填写第一个目标的目标。如果你想在那里输入一个公式,要么得到一个辅助引用来锚定你的代码以获得必要的最后一行。
例如,您有以下数据集:
假设我们想在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非常聪明,可以在整个范围内“正确”“传播”它。运行代码后,请参阅以下屏幕截图:
钽哒!如果这有帮助,请告诉我们。
答案 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))