Макрос VBA на нескольких листах
Я пытаюсь запустить один макрос, который выполняет функции на нескольких листах. Предположим, я назначил кнопку макроса на листе 4. Я перечислил функции, которые я хочу, чтобы он выполнял шаг за шагом:
1) Выберите определенные ячейки на листе 4 и скопируйте в соседние ячейки на листе 4.
2) удалить диапазон ячеек на листе 3.
3) Вырежьте диапазон ячеек на листе 2, затем вставьте этот диапазон ячеек в лист 3.
4) Берем диапазон ячеек отделите книгу и скопируйте в рабочий лист 2. (Я знаю, что это совершенно другая проблема, поскольку книга автоматически публикуется, и мне нужно будет найти способ связать их.)
5) обновление сводных таблиц, расположенных в пределах листа 4 и листа 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
это работает... но он работает только тогда, когда я нахожусь в правильном листе для выполнения определенной функции.
4 ответов
на удалении select
на selection
и activesheet
, вы сможете сделать этот лист-независимая
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
вы отправляетесь в большое начало. Еще немного утонченности, и вы получите это.
в принципе, не нужно .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
листы ("name1").диапазон ("B29:B30").копировать назначение:=листы ("name2").диапазон("С29")
будет копировать с одного листа на другой, предполагая, что имена листов name1 и name2
Sub START()
Sheet("Pivot").Range("B29:B30").Copy Sheet("Pivot").Range("C29")
Sheet("CurrentWeek").Range("A4:AC1000").Copy Sheet("PriorWeek").Range("A4")
End Sub