2017-08-24 142 views
0

我在簡化將數據複製並粘貼到各種表單中的宏時遇到了困難。VBA - 簡化的複製和粘貼宏

'Put the date and time across the top 
    Dim rngDT As Range 
    Set rngDT = Worksheets("Data").Range("A2:B2") 
    Worksheets("Data").Range(rngDT, rngDT.End(xlDown)).Copy 
    Worksheets("Reporting").Range("C5").Offset((x - 1) * 12, 0).PasteSpecial _ 
    Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True 

'Copy and transpose the names from the names page 
    Worksheets("Point Names").Range("B1:B3").Offset(x, 0).Copy _ 
    (Worksheets("Reporting").Range("B7").Offset((x - 1) * 12, 0))  

'Copy and transpose the data 
    Dim dataRng As Range 
    Set dataRng = Worksheets("Data").Range("C1:E1").Offset(1, 3 * x - 3) '.Range("A1:C1") 
    Worksheets("Data").Range(dataRng, dataRng.End(xlDown)).Copy 
    Worksheets("Reporting").Range("C7").Offset((x - 1) * 12, 0).PasteSpecial _ 
    Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True 
    'Sheets("Data").Select 
    'Range("A1").Select 
    'ActiveCell.Offset(1, x + 1).Range("A1:C1").Select 
    'Range(Selection, Selection.End(xlDown)).Select 
    'Selection.Copy 
    'Sheets("Reporting").Select 
    'Range("C7").Offset((x - 1) * 12, 0).Select 
    'Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ 
     False, Transpose:=True 

同樣爲了參考,在本例中環路For x = 1 To NumPoints其中NumPoints = 33。謝謝你在前進,任何幫助將不勝感激

+0

什麼是「選擇」? – sourceCode

+0

@sourceCode顯然是他選擇之前一行的範圍? –

回答

2

的第一個代碼塊可以降低到類似以下內容:

'Put the date and time across the top 
Dim rngStart As Range 
Set rngStart = Worksheets("Data").Range("A2:B2") 

Worksheets("Data").Range(rngStart, rngStart.End(xlDown)).Copy 
Worksheets("Reporting").Range("C5").Offset((x - 1) * 12, 0).PasteSpecial Paste:=xlPasteAll, _ 
    Operation:=xlNone, SkipBlanks:=False, Transpose:=True 

代碼的其他部分可以以同樣的方式降低,給它一試。
總是儘量避免使用.SelectSelection.,這是不好的做法。

請注意,我用Worksheets代替Sheets因爲Worksheets對象僅包含的工作表,但Sheets對象還包含表和圖表等。我建議總是使用Worksheets超過Sheets除非你真的需要Sheets,在大多數情況下,你不需要。


還要確保RangeColumnsRowsCells等通過有效的命名工作表前綴。如果不是VBA,則認爲你的意思是ActiveSheet。這意味着:

Range(rngStart, rngStart.End(xlDown)).Copy 

是完全相同

ActiveSheet.Range(rngStart, rngStart.End(xlDown)).Copy 

但是ActiveSheet不是已定義的片材。因此,活動表可能是正確的,但也有可能不是。所以你得到一個隨機工作/非工作代碼。

因此總是用一個定義的工作表像

Worksheets("Data").Range(rngStart, rngStart.End(xlDown)).Copy 

決不讓VBA承擔的工作表。


編輯到您的評論。這將是這樣的:

Dim dataRng As Range 
Set dataRng = Worksheets("Data").Range("A1").Offset(1, x + 1).Range("A1:C1") 
Worksheets("Data").Range(dataRng, dataRng.End(xlDown)).Copy 
Worksheets("Reporting").Range("C7").Offset((x - 1) * 12, 0).PasteSpecial Paste:=xlPasteAll, _ 
    Operation:=xlNone, SkipBlanks:=False, Transpose:=True 
+0

感謝您的建議,但工作表(「數據」)需要'工作表'。範圍(rngStart,rngStart.End(xlDown))。複製' –

+1

@ACohen是的!如果您省略了爲範圍命名工作表,那麼VBA會假定它是「ActiveSheet」,可能是錯誤的。看到我的答案編輯。 –

+0

你能檢查我編輯的代碼嗎?我遇到了最後一塊文字的問題 –