Копировать колонку Dynami c из одной рабочей книги в другую - PullRequest
0 голосов
/ 22 января 2020

У меня есть набор данных, который в качестве вывода программы оценки часов я пишу в VBA, чтобы скопировать значения в столбце и вставить их в рабочую книгу, чье имя я определяю в поле ввода. Проблема заключается в количестве строк в столбце оценки изменений выходного листа часов, и сейчас мой VBA содержит жестко запрограммированные ячейки. Я хочу создать динамическую c копию столбца, где он начинается в ячейке D13, и скопировать столбец до последнего значения, за исключением того, что он перемещается на 1 ячейку вверх, поскольку последняя строка содержит итоговую строку.

Ниже приведен код, который у меня есть на данный момент

Option Explicit

Sub Copy_Method()

    Dim bookIn As String
    Dim bookOut As String
    Dim X As String

    'Take in data to copy from estimating hours program'
    bookIn = InputBox("Enter workbook name:", "Workbook name")

    'Take in wookbook name to save file to'
    X = InputBox("Set work book name:")


    Workbooks.Add

    'Save new workbook in folder'
    ActiveWorkbook.SaveAs Filename:="C:\Users\BradM\Desktop\RET_DATA_ACTUAL\" & X & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False


    With ActiveWorkbook

    'Insert Tooling'

    'Copy column (What I want to be dynamic, start copy at cell D13 to last row with data, then move up 1 row to account for the total row)'
    Workbooks(bookIn).Worksheets("Production Hours").Range("D13:D45").Copy _

    'PasteSpecial to paste values'
    Workbooks(X).Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues

    End With

    End Sub

Пожалуйста, дайте мне знать, если что-нибудь еще понадобится, Заранее спасибо.

1 Ответ

0 голосов
/ 22 января 2020

Как отметил Шон в комментариях, вам нужно получить последний ряд, чтобы сделать его динамическим c диапазоном. С другой стороны, если вы просто переносите значения между листами, лучше избегать копирования и вставки. Вы можете напрямую установить целевые ячейки, равные исходным данным, как показано ниже.

Sub Copy_Method()

    Dim wsInput As Worksheet
    Dim wsOutput As Worksheet

    Dim bookIn As String
    Dim bookOut As String
    Dim lastRow As Long
    Dim X As String

    'Take in data to copy from estimating hours program'
    bookIn = InputBox("Enter workbook name:", "Workbook name")

    'Take in wookbook name to save file to'
    X = InputBox("Set work book name:")

    'Save new workbook in folder'        [Note we have reduced the add and save as into a single line]
    Workbooks.Add.SaveAs Filename:="C:\Users\BradM\Desktop\RET_DATA_ACTUAL\" & X & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Set wsOutput = ActiveWorkbook.Sheets(1)

    Set wsInput = Application.Workbooks(bookIn).Worksheets("Production Hours")

    'Get last row'      [Note that we subtracted 1 from the lastrow value since you don't want totals]
    lastRow = wsInput.Cells(wsInput.Rows.Count, "D").End(xlUp).Row - 1

    'destination=source
    wsOutput.Range("A1:A" & lastRow - 12) = wsInput.Range("D13:D" & lastRow).value

End Sub

Существуют гораздо более элегантные и динамичные c способы настройки приведенного выше кода, но этого должно быть достаточно, чтобы продемонстрировать, что не используется копировать / вставить (примечание: копировать / вставить медленнее и может увеличить риск ошибок)

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