Создайте новые листы и скопируйте данные в соответствии с идентификатором в главном листе

#excel #vba

Вопрос:

У меня есть таблица с клиентами, которая имеет формат ниже и отформатирована как ListObject — Customer. На основе приведенной ниже таблицы следует создать новые листы в соответствии с количеством клиентов на вкладке «Клиенты».

Идентификатор клиента Имя клиента Описание Расположение
Клиент1 Неизвестный Джон тест1 США
Клиент2 Хизер Новак тест2 Великобритания
Клиент3 Эллисон Паркер испытание 3 ge

На основе приведенной выше таблицы следует создать 3 листа под названием — Customer1, Customer2 и Customer3. Эти новые листы являются копией шаблона, который выглядит следующим образом:

  • синие ячейки — это заголовки, которые являются частью листа шаблона
  • серые ячейки пусты, и данные с главного листа должны быть скопированы в соответствии с названием листа. Я добавил ссылки на ячейки (они всегда будут одинаковыми)

введите описание изображения здесь

Идеальный результат должен выглядеть так для всех листов:

введите описание изображения здесь

Мне удалось создать макрос, который создает листы и называет их соответствующим образом, но я не могу управлять передачей данных из всей строки в отдельные ячейки.

 Option Explicit

Sub SheetsFromTemplate()
Dim wsMASTER As Worksheet, wsTEMP As Worksheet
Dim shNAMES As Range, Nm As Range

With ThisWorkbook
    Set wsTEMP = .Sheets("Template")                                'sheet to be copied
    Set wsMASTER = .Sheets("Customers")              'sheet with names
    Set shNAMES = wsMASTER.Range("Customers[Customer ID]")  'range to find names to be checked
    
    Application.ScreenUpdating = False
    For Each Nm In shNAMES
            wsTEMP.Copy After:=.Sheets(.Sheets.Count)
            ActiveSheet.Name = CStr("Customer " amp; Nm.Text)
    Next Nm
    
   Application.ScreenUpdating = True                           'update screen one time at the end
End With

MsgBox "All sheets created"
End Sub
 

Можете ли вы посоветовать мне, как копировать и переносить данные соответствующим образом и динамически, пожалуйста?

Большое спасибо!

Ответ №1:

Назовите все серые поля в шаблоне в соответствии с их значениями в таблице. Замените интервалы между словами символом подчеркивания (например, Customer_ID). При присвоении имен ячейкам обязательно выбирайте шаблон, а не саму книгу.

Затем вы можете использовать следующий код:

 Sub SheetsFromTemplate()

Dim wsMASTER As Worksheet, wsTEMP As Worksheet, wsCustomer As Worksheet
Dim loMaster As ListObject

With ThisWorkbook
    Set wsTEMP = .Sheets("Template")                                'sheet to be copied
    Set wsMASTER = .Sheets("Customers")              'sheet with names
    
    Set loMaster = wsMASTER.ListObjects("Customer")
    
    Dim r As Range, Customer As String
    Dim lc As ListColumn
    
    Application.ScreenUpdating = False
    
    For Each r In loMaster.DataBodyRange.Rows
        Customer = r.Cells(1, 1)
        wsTEMP.Copy After:=.Sheets(.Sheets.Count)
        Set wsCustomer = ActiveSheet
        
        With wsCustomer
            .Name = Customer
            
            For Each lc In loMaster.ListColumns
                'Assumption: per each list column there is a named range on the sheet
                'empty spaces in column names are replaced by an underscore in range name
                .Range(Replace(lc.Name, " ", "_")) = Intersect(lc.DataBodyRange, r)
            Next
        End With
    Next
   Application.ScreenUpdating = True                           'update screen one time at the end
End With

MsgBox "All sheets created"
End Sub
 

Код перемещается по всем строкам объекта listobject (сначала для каждого)

Создает новый лист для каждой строки и называет его в соответствии с первой ячейкой.

Затем записывает значения в каждое серое поле, сопоставляя имя поля с именами столбцов списка. (по второму для каждого)

Соответствующее значение из таблицы клиентов можно найти, пересекая диапазон столбцов списка со строкой из первого для каждого цикла.