Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将动态列从一个工作簿复制到另一个工作簿_Excel_Vba - Fatal编程技术网

Excel 将动态列从一个工作簿复制到另一个工作簿

Excel 将动态列从一个工作簿复制到另一个工作簿,excel,vba,Excel,Vba,我有一个数据集,作为估算小时数程序的输出,我在VBA中编写,以复制列中的值并将其粘贴到工作簿中,我在输入框中定义了工作簿的名称。问题是“估算小时数”输出表上列中的行数发生了变化,现在我的VBA中有硬编码的单元格。我想做的是创建一个列的动态副本,从单元格D13开始,将列向下复制到最后一个值,但由于最后一行包含一个总行,它会向上移动1个单元格 下面是我到目前为止的代码 Option Explicit Sub Copy_Method() Dim bookIn As String D

我有一个数据集,作为估算小时数程序的输出,我在VBA中编写,以复制列中的值并将其粘贴到工作簿中,我在输入框中定义了工作簿的名称。问题是“估算小时数”输出表上列中的行数发生了变化,现在我的VBA中有硬编码的单元格。我想做的是创建一个列的动态副本,从单元格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
如果还需要什么,请告诉我,
提前感谢。

正如肖恩在评论中指出的那样,您需要获得最后一行以使其成为动态范围。另一方面,如果只是在图纸之间传输值,那么最好避免使用复制和粘贴。您可以直接将目标单元格设置为与源数据相等,如下所示

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

有更优雅、更动态的方法来调整上述代码,但这足以证明不使用复制/粘贴(注意,复制/粘贴速度较慢,可能会增加错误风险)

Hi。这看起来很像这样的问题:非常感谢您的代码,但是,在测试之后,我不断得到一个运行时错误:destination=source行上的Application defined或object defined error(应用程序定义的或对象定义的错误)。我对代码进行了一些编辑,看看它是否仍然给您带来错误?不,这次没有,非常感谢!工作得很好!