2013-03-01 139 views
0

我有一個電子表格,通過自動篩選器宏將某些項目從數據庫中拉出並放入不同的部分。我有公式,進入並自動填充到每個部分的每一行。我遇到的問題是如果一節只有一行,我的宏將調試。下面是我的代碼,插入公式並自動填充它們。最後一行是自動填充宏和我需要幫助的那一行。有人可以給我一個覆蓋,說如果沒有線路自動填充,只是繼續下一步。我不確定這個代碼會如何去。由於獲取自動填充宏以停止如果沒有行自動填充到

'To insert formulas 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IF(RC5<'Data Entry'!R2C2,""*"","""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IF(RC18=TRUE,IFERROR(VLOOKUP(RC2,Database!C[-2]:C[9],11,FALSE),""""),0)" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(RC2,Database!C[-3]:C[8],10,FALSE),"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR((VLOOKUP(RC9,Pull!C1:C5,4,FALSE))*RC4,"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR((VLOOKUP(RC9,Pull!C1:C5,5,FALSE))*RC4,"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(SUM(RC4,RC6:RC7),"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(RC2,Database!C[-7]:C[4],6,FALSE),"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IF(RC18=TRUE,IFERROR(VLOOKUP(RC9,'Pull'!C1:C5,2,FALSE),""""),"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(RC8*RC10,"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(RC8+RC11,"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(RC16*R9C13,"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IF(RC18=TRUE,IFERROR(VLOOKUP(RC9,'Pull'!C1:C5,3,FALSE),""""),"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(RC16*RC14,"""")" 
ActiveCell.Offset(0, 1).Select 
ActiveCell.FormulaR1C1 = "=IFERROR(RC12/(1-R9C13-RC14),"""")" 
Range(Cells(Selection.Row, 3), Cells(Selection.Row, 17)).AutoFill Destination:=Range(Cells(Selection.Row, 3), "Q" & Range("B" & Rows.Count).End(xlUp).Row) 

回答

2

你可以設置一個LASTROW變量,計算出你已經做的方式,並測試它是否比選擇行更大:

Dim LastRow as Long 

LastRow = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row 
... 
If LastRow > Selection.Row Then 
    Range(Cells(Selection.Row, 3), Cells(Selection.Row, 17)).AutoFill Destination:=Range(Cells(Selection.Row, 3), "Q" & LastRow) 
EndIf 

順便說一句,如果你的「VBA搜索避免Select語句「,你會得到一些關於爲什麼這是一個好主意以及如何去做的信息。在這種情況下,我在代碼的開頭設置一個CellWithFormula變量:

Dim CellWithFormula as Excel.Range 
Set CellWithFormula = Activcell 
CellWithFormula.FormulaR1C1 = "=IF(RC5<'Data Entry'!R2C2,""*"","""")" 
Set CellWithFormula = CellWithFormula.Offset(0, 1) 

...等等。

+0

謝謝道格。這工作完美。你建議第二部分是爲了什麼?那有什麼幫助? – 2013-03-01 16:36:48

+0

@JamieWalker:第二部分對編寫優秀的Excel VBA代碼至關重要。選擇事物或激活事物會導致各種不必要的問題。 – 2013-03-01 17:01:38

+0

我很高興它的工作。除了其他問題,使用「選擇」可以減慢速度。就像我說的,快速的網絡搜索將是教育。最好在開始時設置一個對象,當你確切地知道它在哪裏(在這種情況下是CellWithFormula)並在之後引用它。 – 2013-03-01 17:28:56