2014-02-28 422 views
10

我有大量从不同文件收集的数据。在这本主要工作手册中,我为每个单元格提供了不同类型的公式。范围A到F是收集其他文件的数据的地方。在范围H到AC中,我有每次输入新数据时都会手动将其自动填充的公式。下面的代码是我使用的,它只有6个不同的公式,我想自动填充。Excel VBA:使用公式自动填充多个单元格

Application.ScreenUpdating = False 

lastRow = Range("B" & Rows.Count).End(xlUp).Row 
Range("D2").Formula = "=$L$1/$L$2" 
Range("D2").AutoFill Destination:=Range("D2:D" & lastRow) 

Range("E2").Formula = "=$B2/2116" 
Range("E2").AutoFill Destination:=Range("E2:E" & lastRow) 

Range("F2").Formula = "=$D$2+(3*SQRT(($D$2*(1-$D$2))/2116))" 
Range("F2").AutoFill Destination:=Range("F2:F" & lastRow) 

Range("G2").Formula = "=$D$2-(3*SQRT(($D$2*(1-$D$2))/2116))" 
Range("G2").AutoFill Destination:=Range("G2:G" & lastRow) 

Range("H2").Formula = "=IF($E2>=$F2,$E2,NA())" 
Range("H2").AutoFill Destination:=Range("H2:H" & lastRow) 

Range("I2").Formula = "=IF($E2<=$G2,$E2,NA())" 
Range("I2").AutoFill Destination:=Range("I2:I" & lastRow) 
ActiveSheet.AutoFilterMode = False 

Application.ScreenUpdating = True 

然而,在主簿没有像我希望它自动填充每一个新的数据输入时间15个不同的公式。我有多个主要工作簿,并且公式不是恒定的。为每个公式插入上面的代码是一件痛苦的事情。有没有一种方法可以让程序自动拖拽它?在主要的工作簿中,我已经写出了公式。我尝试了许多不同的代码来使它自动填充,但到目前为止,上面的代码是唯一没有给我错误的工作。我试图用这样的或类似的版本,这一个,但没有工作:

With wbList.Sheets("Attribute - 10 mil stop") 
    lastRow = Worksheets(ActiveSheet.Name).Range("B2").Rows.Count 
    'Worksheets(ActiveSheet.Name).Range(Selection, Selection.End(xlDown)).Select 
    Worksheets(ActiveSheet.Name).Range("D2:I2").Select 
    Selection.AutoFill Destination:=Range("D2:I" & Range("B2" & Rows.Count).End(xlDown).Row) 
End With 

我的代码混乱周围这么多。我甚至不知道是否应该这样。感谢您的帮助!

+0

+1:*非常好的问题,比这个标签最近问的问题要好。 :)写一个简短的答案。 – Manhattan

+0

我建议将您的数据范围转换为表或listobject,然后它会自动为您做这个。如果您添加了另一列,您不必更新代码,那么在添加行时,excel将为您填写所有内容,在添加新计算列时填充,无需VBA。这也为您提供了使用公式的巨大优势,而不是说'= B2',您可以使用'= @ ColumnHeader',它将使用该行中该列的值,使更新公式变得更加容易,尤其是当您有这么多公式维护 – user2140261

回答

31

您正在寻找的方法是FillDown。另一种方式,所以你不必每次都把头停下来,就是将公式存储在一个字符串数组中。将它们结合起来,为您提供了一种由众多人员输入公式的强大方法。代码如下:

Sub FillDown() 

    Dim strFormulas(1 To 3) As Variant 

    With ThisWorkbook.Sheets("Sheet1") 
     strFormulas(1) = "=SUM(A2:B2)" 
     strFormulas(2) = "=PRODUCT(A2:B2)" 
     strFormulas(3) = "=A2/B2" 

     .Range("C2:E2").Formula = strFormulas 
     .Range("C2:E11").FillDown 
    End With 

End Sub 

截图:

结果作为行:.Range("C2:E2").Formula = strFormulas

enter image description here

结果作为行:.Range("C2:E11").FillDown

enter image description here

当然,你可以把它通过动态的最后一行存储到一个变量,并转向像.Range("C2:E" & LRow).FillDown,就像你做了什么。

希望这会有所帮助!

+0

感谢您的伟大答案,@Gilgamesh。任何想法如何将一个中心单元格对齐到这个?我查看了Horizo​​ntalAlignment的文档,但似乎无法将它与FillDown结合在一起。 – Hashim

+0

@Hashim只需在'FillDown'后面加上'.Range(“C2:E”&LRow).Horizo​​ntalAlignment = xlCenter'。希望有所帮助。 :) – Manhattan

4

基于我在这里的评论是得到你想要的东西的一种方式进行:

开始BYT在你的范围内选择任意单元格,并按下按Ctrl + 牛逼

这会给你这个流行达:

enter image description here

确保哪里是你的表中的文本是正确的,然后点击确定你现在将甲肝E:

enter image description here

现在如果添加列标题在d它会自动被添加到表一路到最后一行:如果你输入一个

enter image description here

现在公式此列:

enter image description here

后你进入它的如果你的下一行桌下添加一个新行

enter image description here

现在:

enter image description here

一旦进入这将是公式将自动一路填充到最后一行调整到您的表的宽度和所有列与公式将被添加:

enter image description here

希望这能解决您的问题!

+0

谢谢你的回答,但第一个对我来说简单得多。 – user3233328

+0

@ user3233328不知道你是否真的看过我的答案,它看起来很长,但应用它你所做的只是按下2个按钮并完成,计算机中没有任何东西比这更简单。我的回答中有90%向你展示了好处。这种方法也将越来越快,因为它不需要重新计算工作表中公式部分中的每个单元格,它只会在您添加它们时将一个单元格添加到一个单元格,而不是整个单元格列,您目前有22个计算列,即使您只有100行,即2200个单元格可以计算出每个单一的 – user2140261

+0

次输入的内容。在哪里我的总是只计算22列,只有变化。随着数据的增长,您会注意到我需要半秒的时间,而另一个答案则需要几分钟的时间才能加载。 – user2140261

相关问题