2015-06-18 126 views
0

我想循環瀏覽Worksheet1中的A列並找到第一個具有指定文本「Oil Production」的單元格。這個單元格是我希望複製到Worksheet2的陣列中的第一個單元格。這個單元格和數組的大小會隨時變化,因此我使用的代碼。然後將它粘貼到Worksheet2中的單元格B7中,該單元將永遠不會更改。我們無法粘貼Excel範圍,因爲複製區域和粘貼區域的大小不一樣

這是我的公式。我得到的錯誤在行ActiveSheet.Paste

Sub Test() 
    Application.ScreenUpdating = False 
    For Each Cell In Sheets("Sheet1").Range("A:A") 
     If Cell.Value = "Oil Production" Then 
      ActiveSheet.Cells.Select 
      Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, ActiveCell.End(xlToRight).Column)).Select 
      Selection.Copy 
      Sheets("Sheet2").Select 
      Range("B7").Select 
      ActiveSheet.Paste 
     End If 
    Next 
End Sub 
+0

改變'ActiveSheet.Cells的範圍內進行的。選擇'到'Cell.Select'將解決您的直接問題。也就是說,這段代碼在許多層面上都存在缺陷:禁用'Application.ScreenUpdating = False'來進行調試會讓你看到你的問題;循環遍歷整個列A是不必要和緩慢的;使用'選擇'是不必要的,緩慢和脆弱[請參閱如何](http://stackoverflow.com/a/10717999/445425) –

+0

感謝您的鏈接和意見 – Steve85

回答

-1

調整區域:

Sub Test() 
Dim MyRowCount As Long, MyColCount As Long 
Application.ScreenUpdating = False 
For Each Cell In Sheets("Sheet1").Range("A1:A" & Range("A" & Rows.count).end(xlup).row) 'This make it poll the used data rather than the whole column 
    If Cell.Value = "Oil Production" Then 
     ActiveSheet.Cells.Select 
     With Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, ActiveCell.End(xlToRight).column)) 
      .Copy 
      MyRowCount = .Rows.Count 
      MyColCount = .Columns.Count 
     End With 
     Sheets("Sheet2").Select 
     Range("B7").Resize(MyRowCount, MyColCount).PasteSpecial xlPasteAll 
     'Do you need to flick back to Sheet1 after pasting? 
    End If 
Next 
End Sub 

我也拿出了一堆選擇的爲您服務。

Range("A1").Select 
Selection.Paste 

可以寫成

Range("A1").PasteSpecial XLPasteAll 

你可以砍掉大部分選擇這種方式,你可以看到,我也跟你要複製

+0

只是一個後續問題。當A1中沒有數據時,該代碼看起來效果不佳。或者當列中有空單元格時。調整大小(MyRowCount,MyColCount).PasteSpecial xlPasteAll – Steve85

+0

只要將一個if MyRowCount <> 0和MyColCount <> 0,然後在粘貼和結束之後,如果之後,如果這些是沒有設置爲正值,那麼顯然沒有數據要粘貼。 –

+0

優秀!謝謝 – Steve85