2014-02-28 421 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

相關問題