Как в VBA выбрать пару листов и скопировать их в новый wb?

#excel #macros #vba

#excel #макросы #vba

Вопрос:

«Новичок здесь, так что спасибо за ваше терпение!
У меня есть рабочая книга с несколькими листами, и мне нужно:

1) Выберите пары листов (индекс и индекс 1)

2) Скопируйте их в новую книгу

3) Переименуйте листы с любой меткой в ячейке, на которую ссылается ссылка (например, A1)

4) Затем повторите для каждой пары листов в книге (десятки пар)

Поскольку я очень новичок в vba (взял только один класс), меня легко запутать. Единственная часть, которая у меня пока есть, — это ссылка на ячейку A1 для переименования листа в любую текстовую строку, которая находится в этой ячейке. Я не могу понять остальное. Я думаю, это как-то связано с worksheet.index или worksheets (index) и каким-то циклом, в котором индекс добавляет 2 и активирует этот лист и следующий перед копированием: листы 1 и 2, затем листы 3 и 4 и т.д.

 Private Sub Worksheet_Calculate() 
 Dim s As String 
 s = "sheet 1" 
 If Range("A1").Value <> "" Then 
     s = Range("A1").Value 
 End If 
 ActiveSheet.Name = s 
 End Sub 
  

Насколько я понимаю, ячейка A1 должна быть проверена, чтобы убедиться, что она не равна null, потому что вы не можете назвать лист с нулевым значением. Использование и синтаксис остальной части на данный момент мне совершенно непонятны, но я действительно хочу учиться и в конечном итоге стать участником этого сообщества. Я новичок в своей работе и работаю только неполный рабочий день, поэтому предоставление решения моему боссу может означать, что я становлюсь постоянным. Поэтому БОЛЬШОЕ, БОЛЬШОЕ СПАСИБО!!!

Комментарии:

1. Эти проиндексированные листы называются согласованно? Вам нужно будет написать некоторый код, который перебирает все доступные листы в книге — или открывает книгу с листами — определяет рабочий лист с содержимым, в которое вы хотите скопировать. Если эти листы не будут названы согласованным образом, у вас могут возникнуть проблемы.

2. Да, все листы называются последовательно с номером основного счета: xx-xxxx-xxxx-xx. Нет ли какой-нибудь команды (метода?), Которая будет выбирать листы на основе их ИНДЕКСНОГО номера (1,2,3 и т.д.)?

3. Вам нужно будет создать его, однако, если есть согласованность с именами листов, вы можете это сделать

Ответ №1:

 Option Explicit

Private Sub Worksheet_Calculate()
Dim s As String
Dim ws As Worksheet
Dim wsi As Worksheet

Set wsi = Sheets("Sheet4")' You need to create a name for the sheet to paste into

For Each ws In ActiveWorkbook.Worksheets
If Not IsEmpty(ws.Range("A1")) and ws.name = "INDEXCOPY" Then
     ws.Name = ws.Range("A1").Value
     ws.Range("A1:" amp; ws.Range("A1").SpecialCells(xlCellTypeLastCell).Address).Copy _
     Destination:=wsi.Range("A1")
End If
Next ws
End Sub
  

Этот код поможет вам начать, однако вам нужен способ отличить индексный лист, с которого вы хотите скопировать, от индексного листа, на который вы хотите скопировать. Вам нужно будет добавить дополнительный оператор if then, см. Комментарий выше. Я бы посмотрел здесь — http://www.rondebruin.nl/win/s3/win006.htm

Комментарии:

1. Большое спасибо, @Lowpar! Я немного подумаю об этом и посмотрю, что я смогу выяснить. Я также проверю предоставленную вами ссылку. Просто чтобы убедиться, что я понимаю, что делает код…

2. Set wsi = Sheets(«Sheet4») копирует лист ВМЕСТО ‘Sheet4’ или назовет его ‘Sheet4’? Кроме того, я не понимаю ws.name = АРГУМЕНТ INDEXCOPY. Это просто берет первый лист? Модуль говорит, что диапазон от A1 до последней ячейки (xlCellTypeLastCell). Адрес) и .скопируйте его, помещает в рабочий лист wsi, начиная с диапазона («A1»), правильно? Как также скопировать лист INDEX = 2 одновременно в ТОТ ЖЕ новый wb, что и лист1. Итак, это действительно для каждой ПАРЫ, если это возможно. Затем СЛЕДУЮЩИЙ скопирует листы 3 и 4 в НОВЫЙ wb; Листы 5 и 6 в НОВЫЙ и т. Д.

3. Я проводил исследования, но на данный момент не готов публиковать какие-либо ответы или дальнейшие комментарии из-за того, что их легко запутать (особенно пытаясь разобраться в ИНДЕКСНОЙ части). Ha!

4. Не могли бы вы опубликовать свой текущий код, может быть, я мог бы помочь, и вы могли бы отредактировать ответ после

5. Я постараюсь разобраться в тех частях, которые есть, посмотреть, какие части работают, а затем опубликовать. На данный момент этот вопрос отодвинут на второй план из-за более насущных проблем. Возможно, мне придется пройти еще один цикл ручной обработки, прежде чем я это выясню. Пожалуйста, следите за обновлениями!