2012-10-24 32 views
10

Próbuję uruchomić pojedyncze makro, które wykonuje funkcje na wielu arkuszach. Powiedzmy, że przypisano przycisku makra na arkuszu 4. Mam wymienione funkcje chcę go wykonać krok po kroku:Makro VBA w wielu arkuszach roboczych

1) Wybierz pewne komórki w arkuszu, 4 i skopiować do sąsiednich komórek w arkuszu 4.
2) usuń zakres komórek w arkuszu kalkulacyjnym 3.
3) Skróć zakres komórek w arkuszu 2, a następnie wklej ten zakres komórek do arkusza roboczego 3.
4) Weź zakres komórek z oddzielnego skoroszytu i skopiuj do arkusza roboczego 2. (I wiem, że jest to zupełnie inny problem, ponieważ skoroszyt jest automatycznie publikowany i będę musiał znaleźć sposób na połączenie dwóch.)
5) Aktualizuj tabele przestawne znajdujące się w Arkuszu 4 i arkuszu roboczym 3.

Bardzo chciałbym pomóc w pierwszych 3 funkcjach tego. Wkleiłem mój obecny kod poniżej.

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 

to działa ... ale to działa tylko wtedy, gdy jestem we właściwym arkuszu do wykonywania określonej funkcji.

+1

Zamiast nieczytelnych nazw zmiennych, takich jak 'sh1',' sh2' itd., Dlaczego nie nazwać ich czymś użytecznym i przezroczystym jak 'shtBrand',' shtCurrentWeek' itd. Jeden facet w pracy robi dokładnie to samo 'sh1'' sh2' i to powoduje, że wszyscy oszaleli, kiedy próbujemy odczytać jego kod. –

+0

@ Jean-FrançoisCorbett Tak, to naprawdę dobry pomysł. Rozumowanie, którego początkowo nie robiłem, polega na tym, że w moim biznesie nikt nie wie, jak kodować. To zadanie, które próbuję zautomatyzować, zostało już ręcznie wykonane przez około 2-3 lata. To absurd, ale to świetny pomysł! Dziękuję Ci. – kmiao91

Odpowiedz

12

Usuwając select Z selection i activesheet, będzie w stanie dokonać tego arkusza niezależne

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

Żałuję, że nie mogłem cię upomnieć. DZIĘKUJĘ CI. – kmiao91

+0

Wierzę, że możesz teraz. – nutsch

5

Jesteś na świetnym początku. Tylko trochę więcej wyrafinowania i będziesz go miał.

Zasadniczo, nie ma potrzeby, aby .Select swoje zakresy (arkusze, zeszyty itp.), Przynajmniej w tym przypadku. Możesz pracować bezpośrednio z nimi i korzystając z Copy podać miejsce docelowe, w którym zostaną skopiowane.

patrz kod poniżej:

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

Dlaczego konieczne jest zabicie zmiennych? – mattboy

+1

@Mattboy -> najlepszą praktyką jest usunięcie ich z pamięci. Dla tego małego kawałka kodu, nie jest to wielka sprawa, ale może pomóc, gdy masz duże projekty kodu. –

+0

Zostają zabici, gdy wychodzisz z okrętu podwodnego, ale jak powiedział Scott, nie jest to zły nawyk, kiedy naprawdę tego potrzebujesz. – 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 Jaki jest sens publikowania tego, co jest zasadniczo fragmentem już zaakceptowanej odpowiedzi? –

0

arkuszy ("NAME1 ") .range (" B29: B30 ") kopiowanie Miejsce docelowe: = arkusze (" nazwa2 "). zakres (" C29 ")

Powoduje kopiowanie z jednego arkusza na drugi przy założeniu, że nazwa arkusza to nazwa1 i nazwa2

Powiązane problemy