如何将四列中的函数填充到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 = xlCalculationManualApplication.EnableEvents = False 禁用这两个功能。在代码之后,您需要使用 Application.Calculation = xlCalculationAutomaticApplication.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列中的数据停止的位置?的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL如何将两列中相同的行筛选出来并排序

显示表中的所有列以及每列中填充的记录数

通过检测 NaN 出现的位置,通过其他列的数学运算将 NaN 填充到列中

根据另一列中的行自动填充第二列中的数据

如何根据列中的值自动填充谷歌表格中的数据

如何根据excel中的另一个单元格值自动填充两个不同列中的数据