2015-08-16 490 views
0

你好我是VBA的新手,我正在設計一個程序。它只是選擇Sheet2並從單元格A1複製一些東西。然後它從單元格A1中選擇Sheet1和偏移量並粘貼到新選擇的單元格中。代碼如下。ActiveSheet.paste帶偏移給出錯誤

Sub Test() 
    Worksheets("Sheet2").Activate 
    ActiveSheet.Range("A1").Activate 
    Selection.Copy 
    Worksheets("Sheet1").Activate 
    ActiveSheet.Range("A1").Activate 
    ActiveCell.Offset(1, 1).Activate 
    ActiveSheet.PasteSpecial 
End Sub 

奇怪的是,如果我更改線路.Offset(1,1)到.Offset(1)程序將正常工作。如果我沒有,我會得到運行時錯誤'1004'應用程序定義或對象定義的錯誤。

我知道有比使用選擇更好的方法,雖然這些對我很有趣,但我也想知道問題的原因。

謝謝你的幫助。

回答

0

你的代碼是不工作的原因是由於Range .Activate method的過度使用。這與.Range.Select不同,因爲它僅在選擇ActiveCell時生成不同的單元格。如果工作表的Selection object只包含您正在激活的單個單元格或一系列單元格,則是的,您將選擇一個單元格。如果它位於當前工作表的選定單元格內,則它只會將用戶控件轉移到該單元格。

在工作表上選擇單元格範圍。爲了這個例子C3:E8的目的。取決於您如何選擇單元格,C3很可能處於不同的顏色狀態,並且該工作表包含ActiveCell property。它會收到任何用戶輸入。

現在點擊Enter↵幾次。當你點擊回車鍵時,你會看到「焦點」(又名ActiveCell)。雖然C3:E8可能是工作表的Selection property,但工作表的ActiveCell property會隨着您點擊Enter鍵而發生變化。

如果您將未知數量的單元格粘貼到目標目標中,則應該在希望單元格所在位置的左上角選取一個單元格。除非情況和環境不是可靠的編程範例,否則將活動單元格範圍內的一個單元格作爲多個單元格的目標將無法工作。

簡而言之,如果您的單元格爲.Activate,那麼只有當您激活的單元格在當前選擇範圍之外時,纔會選擇單個單元格。如果你是.Select一個單元格,那麼它是唯一被選中的單元格,並且是該工作表格上的活動單元格。除非是單個單元,否則不能粘貼到與源不同的行×列大小的單元格範圍內。

你的代碼應該適用於一個簡單的修改。

Sub Test() 
    Worksheets("Sheet2").Activate 
    ActiveSheet.Range("A1").Activate 
    Selection.Copy 
    Worksheets("Sheet1").Activate 
    ActiveSheet.Range("A1").SELECT '<~~ this is changed to .Select 
    ActiveCell.Offset(1, 1).Activate 
    ActiveSheet.PasteSpecial 
End Sub 

然而,可能會有更好的辦法。直接複製和粘貼是首選,但如果你想要的只是Range.Value property,那麼直接的價值轉移是最好的。

'abbreviated Copy and Paste 
Sub Test2() 
    With Worksheets("Sheet2") 
     .Range("A1").Copy _ 
      Destination:=Worksheets("Sheet1").Range("A1").Offset(1, 1) 
    End With 
End Sub 

'direct value transfer 
Sub Test3() 
    With Worksheets("Sheet1").Range("A1").Offset(1, 1) 
     .Value = Worksheets("Sheet2").Range("A1").Value 
    End With 
End Sub 

如果您不需要傳輸單元格格式,則後者是首選。

How to avoid using Select in Excel VBA macros更多的方法從依靠選擇越來越遠,並激活,以實現自己的目標。

0

這是簡單的只是運行的精確副本像下面把副本作爲最後片

Sub Test() 
    Dim ws1 As Worksheet 
    Set ws1 = ThisWorkbook.Worksheets("Master") 
    ws1.Copy ThisWorkbook.Sheets(Sheets.Count) 
    End Sub 

** Copy an entire worksheet to a new worksheet in Excel 2010

您也可以使用下面 表(「工作表Sheet1」 ).Range( 「A1:B10」)複製目的地:=表( 「Sheet 2中」)範圍( 「E1」)

'Method 2 
    'Copy the data 
    Sheets("Sheet1").Range("A1:B10").Copy 
    'Activate the destination worksheet 
    Sheets("Sheet2").Activate 
    'Select the target range 
    Range("E1").Select 
    'Paste in the target destination 
    ActiveSheet.Paste 

    Application.CutCopyMode = False 

結束子

+0

我相信只有Sheet1!B2打算接收Sheet1!A1的內容和格式。除非OP忽略聲明[Range.CurrentRegion屬性](https://msdn.microsoft.com/en-us/library/office/ff196678.aspx),否則我不相信整個工作表。 – Jeeped

2

您可能會遇到的問題是,如果要執行粘貼操作,您應該選擇一個單元格,然後按照他們在下面概述的微軟指南進行操作。由於您是VBA的新手,最好避免使用.activate它的好習慣,在不選擇單元的情況下進行復制/粘貼。爲您的代碼的一個例子是:

Sub Test() Worksheets("Sheet2").Range("A1").Copy Worksheets("Sheet1").Range("A1").Offset(1,1).Paste End Sub

Microsoft

+0

嗨我試過這個示例代碼,它不起作用。第二行有一個問題,它給出錯誤「運行時錯誤'438':對象不支持這個屬性或方法」。有沒有我應該打開的設置或什麼? – Zasekle