2017-01-23 103 views
0

這是我在Sheet1樣品,(從B至F號只是= Sheet2的!B2這種公式)VBA,拖累公式那裏有空白單元格

A   B C D E F 
11/12/2016 300 4 4 3 85 
12/12/2016 23 4 4 2 87 
13/12/2016 21 4 4 2 79 
14/12/2016 67 4 4 4 76 

我試圖插入下面的A列是未來7天的日期(已經達到了II),並將公式從B欄拖到F處。我不能使用RANGE B1:F7,因爲我將在7天后追加新的數據,所以我需要動態範圍。

這裏是我的嘗試,但是我在上INRANGE concatentation返回環路(錯誤=範圍OB object_global失敗):

Sub test() 
    Dim r As Range Set r = Intersect(ActiveSheet.UsedRange, Range("A:A")).Cells.SpecialCells(xlCellTypeBlanks) 
    r(1).Formula = "=Today()" 
    r(2).Formula = "=Today()+1" 
    r(3).Formula = "=Today()+2" 
    r(4).Formula = "=Today()+4" 
    r(5).Formula = "=Today()+5" 
    r(6).Formula = "=Today()+6" 
    Dim inRange As Range 
    Set inRange = Sheets("Sheet1").Range("B" & i & ":" & "F" & i) 
    For i = 1 To 7 
     Sheets("Sheet1").Range("B1:F1").Select 
     Selection.AutoFill Destination:=Range(inRange), Type:=xlFillDefault 

    Next i 
End Sub 

感謝

回答

0

我不會用這樣的:

Set r = Intersect(ActiveSheet.UsedRange, Range("A:A")).Cells.SpecialCells(xlCellTypeBlanks) 

因爲如果路口沒有返回細胞,它會引發錯誤。如果這個表是Sheet1中唯一的範圍,那麼爲了提高性能和文件大小,可能會刪除一些行。

如果範圍(B1,F1)的公式不改變,我想這樣的代碼是:

Sub test() 
    Dim r As Excel.Range 
    Dim i As Integer 

    'I wouldn't use this 
    'Set r = Intersect(ActiveSheet.UsedRange, Range("A:A")).Cells.SpecialCells(xlCellTypeBlanks) 

    'Instead: 
    Range("A1").End(xlDown).Offset(1, 0).Activate 
    ActiveCell.Formula = "=Today()" 
    For i = 0 To 6 
     If i = 0 Then 
      ActiveCell.Formula = "=Today()" 
     Else 
      ActiveCell.Formula = "=Today()+" & i 
     End If 
     ActiveCell.Offset(1, 0).Activate 
    Next i 
    Range("B1:F1").Copy Intersect(ActiveSheet.UsedRange, Range("B:F")).Cells.SpecialCells(xlCellTypeBlanks) 
End Sub 
+1

感謝,它確實work.However我想明白你爲什麼建議不要使用這個:Set r = Intersect(ActiveSheet.UsedRange,Range(「A:A」))。Cells.SpecialCells(xlCellTypeBlanks)。謝謝! – Vincenzo

+0

@Vincenzo當我測試該代碼行時,我複製了您提供的表格,因此UsedRange中沒有空白單元格。這導致VBA發出錯誤,因爲它無法在交集中找到任何xlCellTypeBlanks。因此,如果您有任何空白單元格低於該範圍,則應該刪除那些行(如果有很多)(Ctrl + End查找使用範圍中的最後一個單元格)。如果有許多空白行,並且您消除了它們,文件大小將會減少,並且性能會更好(計算時間更少)。 –

0

也許不是世界上最好的代碼,但很快,因爲它避免了環路(假設我理解的問題):

Sub testit(cell as range, numberOfRows as long) 
    range(cell, cell.Offset(numberOfRows)).formula = "=Today() + row() - " & cell.Row 
End Sub 

編輯:關於第二個想法,我想我誤解了。這是否更好?

Sub testit() 
    Dim k as range 
    Set k = Range("B2").CurrentRegion.columns(1).SpecialCells(xlCellTypeBlanks) 
    k.formula = "=Today() + row() - " & k.cells(1,1).Row 
End Sub 

記住要複製並粘貼爲值,假設您希望數據保持這種方式。否則,它也將是動態的!