2012-10-24 24 views
10

Birden çok çalışma sayfasında işlevleri gerçekleştiren tek bir makroyu çalıştırmaya çalışıyorum. Diyelim ki ben o adım adım gerçekleştirmek istediğiniz işlevleri listeledik çalışma 4. makro düğmesini atamış diyelim:)VBA Makro

1 çalışma 4'te belirli hücreleri seçin ve çalışma sayfasındaki komşu hücrelere kopyalamak 4.
2 3) çalışma sayfasındaki hücrelerin aralığını silme 3 0- 3) Çalışma sayfasındaki hücrelerin CUT aralığını 2 sonra çalışma sayfası 3'e yapıştırın.
4) Ayrı bir çalışma kitabından hücrelerin aralığını alın ve çalışma sayfası 2'ye kopyalayın. Çalışma kitabının otomatik olarak yayınlanmasından dolayı bu tamamen farklı bir sorun olduğunu ve ikisini bağlamanın bir yolunu bulmam gerektiğini biliyorum.)
5) Çalışma Sayfası 4 ve Çalışma Sayfası 3'te bulunan pivot tablolarını güncelleyin.

Bunun ilk 3 işlevi hakkında yardım isterim. Mevcut kodumu aşağıya yapıştırdım.

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 

Çalışıyor ... ancak yalnızca belirli bir işlevi gerçekleştirmek için doğru çalışma sayfasında olduğumda çalışıyor.

+1

'sh1', sh2' gibi okunamayan değişken adlar yerine, onlara neden" shtBrand "gibi yararlı ve şeffaf bir şey demezler? shtCurrentWeek' vb İş yerindeki bir adam bu 'sh1' sh2' işinin aynısını yapar ve kodlarını okumaya çalıştığımızda herkesin çıldırmasına neden olur. –

+0

@ Jean-FrançoisCorbett Evet, aslında bu iyi bir fikir. Bunu ilk başta yapmadığım gerekçesi benim işimde, kimsenin nasıl kodlanacağını bilmemesi. Otomatikleştirmeye çalıştığım bu görev, yaklaşık 2-3 yıl boyunca manuel olarak yapıldı. Bu saçma, ama bu harika bir fikir! Teşekkür ederim. – kmiao91

cevap

12

select, selection ve activesheet kaldırarak, bu sayfayı bağımsız

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

Keşke seni kabul edebilirim. TEŞEKKÜR EDERİM. – kmiao91

+0

Artık yapabileceğine inanıyorum. – nutsch

5

Harika bir başlangıç ​​için yola koyuldunuz. Sadece biraz daha arınma ve sahip olacaksınız.

Temel olarak, en azından bu durumda .Select aralığınıza (sayfalar, çalışma kitapları vb.) Gerek yoktur. Doğrudan bunlarla çalışabilir ve Copy numaralı telefonu kullanarak kopyalanacakları yeri temin edebilirsiniz. Aşağıda

bakınız kodu:

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

Değişkenleri öldürmek neden gereklidir? – mattboy

+1

@Mattboy -> onları bellekten çıkarmak için en iyi yöntemdir. Bu küçük kod için, büyük bir anlaşma değil, ama büyük kod projeleriniz olduğunda yardımcı olabilir. –

+0

Yine de alttan çıktığınızda öldürülüyorlar, ama Scott'ın dediği gibi, aslında ona ihtiyacın olduğunda sahip olmak kötü bir alışkanlık değil. – 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 Önceden kabul edilen cevabın bir parçası olan şeylerin gönderilmesindeki nokta nedir? –

0

sayfaları ("isim1 yapmak mümkün olacak ") .range (" B29: B30 ") kopya Hedef: = sayfalar (" ad2 ") aralığı (" C29 ")

Sayfa adları ad1 ve name2 olduğu varsayılarak birinden diğerine kopyalanır.