2012-10-24 69 views
10

我正在嘗試運行一個在多個工作表上執行功能的宏。比方說,我已經分配的工作表4.我列出我想要一步一步執行功能的宏按鈕:跨多個工作表的VBA宏

1)在工作表4選擇某些細胞並複製到相鄰的單元格中的工作表4
2 )刪除工作表3中單元格的範圍。
3)工作表2中的單元格的CUT範圍,然後將此單元格區域粘貼到工作表3中。
4)從單獨的工作簿獲取單元格區域並將其複製到工作表2中。知道這是一個完全不同的問題,因爲工作簿是自動發佈的,我將不得不找到一種鏈接這兩者的方法。)
5)更新位於Worksheet 4和Worksheet 3中的數據透視表。

我會很樂意幫助這個的前3個功能。我已經粘貼了下面的當前代碼。

Sub START() 

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim sh4 As Worksheet 

Set sh1 = ActiveWorkbook.Sheets("Brand") 
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek") 
Set sh3 = ActiveWorkbook.Sheets("PriorWeek") 
Set sh4 = ActiveWorkbook.Sheets("Pivot") 

sh4.Range("B29:B30").Select 
Selection.Copy 

sh4.Range("C29").Select 
ActiveSheet.Paste 

sh3.Range("A4:AC1000").Select 
Selection.Delete 

sh2.Range("A4:AC1000").Select 
Selection.Copy 

sh3.Range("A4").Select 
ActiveSheet.Paste 

End Sub 

它的工作原理...但是當我在執行特定功能的右表是它僅適用。

+1

而不是像'sh1','sh2'等不可讀的變量名稱,爲什麼不叫它們像'shtBrand'這樣的有用和透明的東西, shtCurrentWeek'等等。工作中的一個人做這個完全相同的'sh1''sh2'業務,當我們嘗試閱讀他的代碼時,它驅使每個人堅果。 –

+0

@ Jean-FrançoisCorbett是的,這實際上是一個好主意。我之所以沒有這樣做,是因爲在我的業務中,沒有人知道如何編碼。我試圖自動化的這項任務已經手動完成了大約2 - 3年。這很荒唐,但這是一個好主意!謝謝。 – kmiao91

回答

12

通過消除selectselectionactivesheet,你將能夠使這片獨立

Sub START() 

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim sh4 As Worksheet 

Set sh1 = ActiveWorkbook.Sheets("Brand") 
Set sh2 = ActiveWorkbook.Sheets("CurrentWeek") 
Set sh3 = ActiveWorkbook.Sheets("PriorWeek") 
Set sh4 = ActiveWorkbook.Sheets("Pivot") 

sh4.Range("B29:B30").Copy sh4.Range("C29") 

sh3.Range("A4:AC1000").Delete 

sh2.Range("A4:AC1000").Copy sh3.Range("A4") 

End Sub 
+0

我希望我可以upvote你。謝謝。 – kmiao91

+0

我相信你現在可以。 – nutsch

5

你是一個偉大的開始。只需稍微改進一點,你就會擁有它。

基本上,不需要.Select您的範圍(工作表,工作簿等),至少在這種情況下。您可以直接使用它們,並使用Copy提供將被複制到的目的地。

見下面的代碼:

Sub START() 

Dim sh1 As Worksheet 
Dim sh2 As Worksheet 
Dim sh3 As Worksheet 
Dim sh4 As Worksheet 
Dim wkb As Workbook 

Set wkb = Workbooks("wkbName") '-> best to call workbooks by name, as opposed to "ActiveWorkbook", also best to set it to object 

With wkb '-> now we can work with this object directly and succinctly 

    Set sh1 = .Sheets("Brand") 
    Set sh2 = .Sheets("CurrentWeek") 
    Set sh3 = .Sheets("PriorWeek") 
    Set sh4 = .Sheets("Pivot") 

    sh4.Range("B29:B30").Copy sh4.Range("C29") 

    'sh3.Range("A4:AC1000").Delete -> you don't need this if you are overwritting it 

    sh2.Range("A4:AC1000").Copy sh3.Range("A4") 

End With 

End Sub 
+0

爲什麼有必要殺死變量? – mattboy

+1

@Mattboy - >最好的做法是將它們從內存中取出。對於這個小小的代碼,這不是什麼大問題,但是當你有大的代碼項目時,它可以提供幫助。 –

+0

無論如何,他們會在你退出時被殺,但正如斯科特所說,當你真正需要時,這不是一個壞習慣。 – nutsch

-2
Sub START() 

Sheet("Pivot").Range("B29:B30").Copy Sheet("Pivot").Range("C29") 
Sheet("CurrentWeek").Range("A4:AC1000").Copy Sheet("PriorWeek").Range("A4") 

End Sub 
+4

-1發佈基本上已被接受的答案的片段是什麼? –

0

表(「名1 「).range(」B29:B30「)。複製目標:=工作表(」名稱2「)。範圍(」C29「)

將從一個表複製到另一個表,假設表名是name1和name2

相關問題