Копирование данных с одного листа на другой лист с помощью вставки и вставки строк - PullRequest
0 голосов
/ 19 апреля 2019

Итак, я новичок в Excel VBA и мне дан проект, который требует копирования данных с листа 1 в новую рабочую книгу. Проблемы с копированием, вставкой и вставкой новых строк. (Есть две подпрограммы, но вторая подпрограмма примерно такая же, и она требуется, пожалуйста, прости), Спасибо.

Sub CopyInfo()
    On Error GoTo Err_Execute

    wb1.Sheets("dataform").Range("L2:N2").Copy
    wb2.Sheets(shtname).Range("A2:C27").Rows("1:1").Insert Shift:=xlDown
    wb2.Sheets(shtname).Range("A2:C28").PasteSpecial (xlPasteValues)


    wb1.Sheets("dataform").Range("B2:B28").Copy
    wb2.Sheets(shtname).Range("D2").Insert Shift:=xlDown

    wb1.Sheets("dataform").Range("D2:D28").Copy
    wb2.Sheets(shtname).Range("F2").Insert Shift:=xlDown

    update

    wb1.Sheets("Setlist").Range("G2").Copy
    wb2.Sheets(shtname).Range("E2:E27").Rows("1:27").Insert Shift:=xlDown
    wb2.Sheets(shtname).Range("E2:E28").Paste1Special

   wb2.Sheets(shtname).Columns().AutoFit

Err_Execute:
    If Err.Number = 0 Then MsgBox "All have been copied!" Else _
    MsgBox Err.Description

End Sub


Sub update()

    wb1.Sheets("dataform").Range("D2:D28").Copy
    wb1.Sheets("dataform").Range("E2:E28").PasteSpecial
    wb1.Sheets("dataform").Range("F2:F28").PasteSpecial

    wb1.Sheets("dataform").Range("F2:F28").Copy
    wb2.Sheets(shtname).Range("G2").Insert Shift:=xlDown
End Sub

Программа требует от текущей рабочей тетради 1 копии в другую рабочую книгу. Первые листы 1 рабочей книги будут иметь новую надстройку строк, и код автоматически обновит ее. Так как в настоящее время, если на текущем листе 1 рабочей книги добавляются новые строки, я должен вручную обновить код.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019
Sub CopyInfo()
    On Error GoTo Err_Execute

    dataform.Range("L2:N2").Copy
    wb2.Sheets(shtname).Range("A2").Rows("1:27").Insert Shift:=xlDown
    wb2.Sheets(shtname).Range("A2:C28").PasteSpecial (xlPasteValues)

    dataform.Range("LocationName").Copy
    wb2.Sheets(shtname).Range("D2").Insert Shift:=xlDown

    dataform.Range("Reading").Copy
    wb2.Sheets(shtname).Range("F2").Insert Shift:=xlDown

    update

    wb1.Sheets("Setlist").Range("D2").Copy

    wb2.Sheets(shtname).Range("E2").Rows("1:27").Insert Shift:=xlDown

   wb2.Sheets(shtname).Columns().AutoFit

Err_Execute:
    If Err.Number = 0 Then MsgBox "All have been copied!" Else _
    MsgBox Err.Description

End Sub

Sub update()   

    dataform.Range("Reading").Copy
    dataform.Range("PreviousReading, Usage").PasteSpecial

    dataform.Range("Usage").Copy
    wb2.Sheets(shtname).Range("G2").Insert Shift:=xlDown
End Sub

(Есть больше кодов, но я просто добавляю половину из них, извините за путаницу. Если есть полезные ссылки, которые могут помочь. Очень признателен.)

0 голосов
/ 20 апреля 2019

Хорошо, так что есть несколько шагов, чтобы получить желаемый результат.

  1. Я предполагаю, что ваша вторая книга еще не открыта, поэтому вам нужно сначала открыть ее в VBA, прежде чем можно будет копировать диапазоны. В SO и Google есть множество ответов, которые покажут вам, как это сделать.

  2. Поскольку вы будете добавлять строки к исходному рабочему листу, вам нужен способ включить это в свой код. Есть несколько вариантов, как это сделать.

    Вы можете создать таблицу и использовать Dim As ListObject для объявления, а затем установить ее в VBA. Таким образом, когда новые строки добавляются в таблицу, они будут автоматически включены. Второй способ - использовать динамический именованный диапазон (см. «Диспетчер имен» на вкладке «Формулы»), который включает новые строки при их добавлении.

  3. Возможно, наиболее важной частью является упрощение кода путем объявления ваших переменных и объектов.

В настоящее время вы пишете wb1.Sheets("dataform") постоянно. Вместо этого используйте Dim DataForm as Worksheet и Set Dataform = wb1.Sheets("dataform"). Таким образом, при использовании адреса вашего листа вы можете просто написать Dataform.Range("A1:A1"). Смотрите ниже пример.

    Dim Source As Workbook
    Set Source = ThisWorkbook
    Dim Dataform As Worksheet
    Set Dataform = Source.Sheets("Dataform")

    Dataform.Range("L2:N2").Copy 'See how you can just adress the sheet by name

Теперь, если вы также объявите свои диапазоны как таблицы / именованные диапазоны, это сделает код еще проще для обработки. Поскольку вы также всегда добавляете строку во время каждой операции, гораздо более эффективным способом было бы использовать for each loop, чтобы просмотреть все ваши именованные диапазоны / таблицы, скопировать их, вставить новую строку в лист назначения и затем вставить.

Надеюсь, это было какое-то вдохновение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...