如何将四列中的函数填充到A列中的数据停止的位置?
Posted
技术标签:
【中文标题】如何将四列中的函数填充到A列中的数据停止的位置?【英文标题】:How to fill down functions in four columns to where the data in column A stops? 【发布时间】:2021-06-16 21:17:02 【问题描述】:我正在尝试将四列中的函数填充到 A 列中的数据停止的位置,但是当它到达第四个 FillDown 时,需要很长时间。
有什么方法可以更有效地重写它吗?
Range("D2").Select
ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],2)"
Range(ActiveCell, ActiveCell.Offset(0, 0).End(xlDown)).FillDown
Range("E2").Select
ActiveCell.FormulaR1C1 = "=MID(RC[-2],7,2)"
Range(ActiveCell, ActiveCell.Offset(0, 0).End(xlDown)).FillDown
Range("Z2").Select
ActiveCell.FormulaR1C1 = "=IF(RC[-22]<>""SO"",RC[-22],RC[-12])"
Range(ActiveCell, ActiveCell.Offset(0, 0).End(xlDown)).FillDown
Range("AA2").Select
ActiveCell.FormulaR1C1 = _
"=IF(OR((RC[-22]=""17""),(RC[-22]<>""11""),(RC[-23]=""SO"")),""HQ"",""Remote"")"
Range(ActiveCell, ActiveCell.Offset(0, 0).End(xlDown)).FillDown
【问题讨论】:
您可以一次将公式写入范围,而无需填写。另请参阅How to avoid using Select。 Entering formula in one go 【参考方案1】:我在这里看到了几个问题
-
您说 ... 到 A 列中的数据停止的位置,但在 D、E、Z、AA 列上使用
.End(xlDown)
。这可能会将公式填充到工作表的底部。
您不需要Fill Down
,只需将公式应用于指定范围
Select
不是必需的
考虑一下
Sub Demo()
Dim ws As Worksheet
Dim LastRow As Long
Set ws = ActiveSheet ' or specify the required sheet
With ws
' find where data in column A stops
LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
If LastRow = 1 Then
' there is no data in column A
Exit Sub
End If
.Range(.Cells(2, 4), .Cells(LastRow, 4)).FormulaR1C1 = "=LEFT(RC[-1],2)"
.Range(.Cells(2, 5), .Cells(LastRow, 5)).FormulaR1C1 = "=MID(RC[-2],7,2)"
.Range(.Cells(2, 26), .Cells(LastRow, 26)).FormulaR1C1 = "=IF(RC[-22]<>""SO"",RC[-22],RC[-12])"
.Range(.Cells(2, 27), .Cells(LastRow, 27)).FormulaR1C1 = "=IF(OR((RC[-22]=""17""),(RC[-22]<>""11""),(RC[-23]=""SO"")),""HQ"",""Remote"")"
End With
End Sub
【讨论】:
【参考方案2】:正如@BigBen 指出的那样,您可以通过从一开始就引用整个范围来避免使用.FillDown
。您也可以同时避开.Select
,使用.Resize
等函数在当前范围的基础上引用更大的范围。
此外,由于您的宏正在将公式写入单元格,因此您可以通过禁用在编辑单元格时发生的自动计算来加快代码速度。禁用可能从Worksheet_Change
过程运行的任何事件也是一个好主意。
您可以使用Application.Calculation = xlCalculationManual
和Application.EnableEvents = False
禁用这两个功能。在代码之后,您需要使用 Application.Calculation = xlCalculationAutomatic
和 Application.EnableEvents = True
将这两个设置恢复为默认设置
以下是如何实施这些建议的示例:
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
With Range("D2")
.Resize(.End(xlDown).Row - .Row).FormulaR1C1 = "=LEFT(RC[-1],2)"
End With
With Range("E2")
.Resize(.End(xlDown).Row - .Row).FormulaR1C1 = "=MID(RC[-2],7,2)"
End With
With Range("Z2")
.Resize(.End(xlDown).Row - .Row).FormulaR1C1 = "=IF(RC[-22]<>""SO"",RC[-22],RC[-12])"
End With
With Range("AA2")
.Resize(.End(xlDown).Row - .Row).FormulaR1C1 = _
"=IF(OR((RC[-22]=""17""),(RC[-22]<>""11""),(RC[-23]=""SO"")),""HQ"",""Remote"")"
End With
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
我保留了.End(xlDown)
方法,因为我不知道您的工作表是什么样的,这可能是匹配您的数据格式的最佳方法。
【讨论】:
以上是关于如何将四列中的函数填充到A列中的数据停止的位置?的主要内容,如果未能解决你的问题,请参考以下文章