宏:打开文件夹中的最新文件并复制粘贴到最后一个单元格下方

问题描述

如何在 Excel VBA 中合并这两部分代码

Part 1:

Sub copypastelastrow()

    Dim MyPath As String
    Dim MyFile As String
    Dim LatestFile As String
    Dim LatestDate As Date
    Dim LMD As Date
    Dim LMD As Variant
    Dim wscopy As Worksheet
    Dim wsDest As Worksheet
    Dim lcopyLastRow As Long
    Dim lDestLastRow As Long

    MyPath = "C:\Users\andrew\Desktop\newdoc"

    If Right(MyPath,1) <> "\" Then MyPath = MyPath & "\"
    MyFile = Dir(MyPath & "*.xlsx",vbnormal)
    If Len(MyFile) = 0 Then
        MsgBox "No files were found...",vbExclamation
        Exit Sub
    End If
    do while Len(MyFile) > 0

        LMD = FileDateTime(MyPath & MyFile)    
        If LMD > LatestDate Then
            LatestFile = MyFile
           LatestDate = LMD
        End If
        MyFile = Dir
    Loop
    Workbooks.Open MyPath & LatestFile

我不明白如何将打开的工作簿设置为活动工作簿并复制粘贴到最后一行下方。我认为错误在第 2 部分:对象变量或未设置块变量!


第 2 部分:

  Set wscopy = Workbooks("Workbooks.Open MyPath & LatestFile").Worksheets("sheet1")
  Set wsDest = Workbooks("Workbook2").Worksheets("sheet1")
  
  lcopyLastRow = wscopy.Cells(wscopy.Rows.Count,"B").End(xlUp).Row
  lDestLastRow = wsDest.Cells(wsDest.Rows.Count,"B").End(xlUp).Offset(1).Row
  
   wscopy.Range("S3:T" & lcopyLastRow).copy
    wsDest.Range("B" & lDestLastRow).PasteSpecial Paste:=xlPasteValues

解决方法

参考工作簿

  • 当您打开工作簿时,它会变成 ActiveWorkbook

    Workbooks.Open MyPath & LatestFile
    Set wsCopy = ActiveWorkbook.Worksheets("Sheet1")
    

    或在一行中:

    Set wsCopy  = Workbooks.Open(MyPath & LastestFile).Worksheets("Sheet1")
    

    要稍后关闭工作簿,您将使用:

    wsCopy.Parent.Close SaveChanges:=False ' usually because it's only read from.
    
  • 使用变量:

    Workbooks.Open MyPath & LatestFile
    Dim wb As Workbook: Set wb = ActiveWorkbook
    Set wsCopy = wb.Worksheets("Sheet1")  
    

    或:

    Dim wb As Workbook
    Set wb = Workbooks.Open(MyPath & LatestFile)
    Set wsCopy = wb.Worksheets("Sheet1")  
    

    要稍后关闭工作簿,您将使用:

    wsCopy.Parent.Close SaveChanges:=False ' usually because it's only read from.
    

    wb.Close SaveChanges:=False ' usually because it's only read from.