【问题标题】:Copy/SpecialPaste Range from multiple closed workbooks to master workbook从多个关闭的工作簿复制/特殊粘贴范围到主工作簿
【发布时间】:2019-02-18 15:35:03
【问题描述】:

我正在尝试从桌面文件夹中的每个已关闭工作簿中复制 Range(A14:N26) 并将它们粘贴到当前工作表(这是我的主工作表)中。该代码确实抓取了正确范围的数据,但在粘贴部分却遇到了困难。 它应该特别粘贴代码,因为单元格中有公式,我只想复制单元格中可见的内容。 (注:有些公式的结果是单词,有些公式的结果是数字)

Option Explicit

Sub CopySheetFromFileOnDesktop()

Dim wkbDest As Workbook
Dim wksDest As Worksheet
Dim wkbSource As Workbook
Dim wksSource As Worksheet
Dim MyPath As String
Dim MyFile As String
Dim SheetIndex As Integer



Application.ScreenUpdating = False

Set wkbDest = ThisWorkbook
Set wksDest = wkbDest.Worksheets("Master Sheet")

SheetIndex = 1

MyPath = "C:\Users\.."

If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"

MyFile = Dir(MyPath & "*.xlsm")


Do While Len(MyFile) > 0
    Set wkbSource = Workbooks.Open(MyPath & MyFile)
    Set wksSource = wkbSource.Worksheets("Sheet containing the info")
    If WorksheetFunction.CountA(wkbSource.Sheets("Sheet containing the 
info").Range("A14:L26")) <> 0 Then
   'lRow = .Range("L" & Rows.Count).End(xlUp).Row 'UNSURE HOW TO LAST ROW
    wkbSource.Sheets("Sheet containing the info").Range("A14:L26").Copy
    wkbDest.Range("A:L" & Rows.Count).End(xlUp)(2).PasteSpecial _ 
    Paste:=xlPasteValues 'PASTESPECIAL SEEMS TO BE THE PROBLEM

    wkbSource.Close savechanges:=False

    Application.CutCopyMode = False

    Else
    End If
Loop

Application.ScreenUpdating = True

MsgBox "Completed...", vbInformation


End Sub

运行宏时会显示此错误:运行时错误 438:对象不支持属性或方法。调试器会突出显示我定义粘贴复制范围的位置

【问题讨论】:

  • @SolarMike 谢谢,但这个问题也没有解决
  • 你可以在这里找到一些线索:stackoverflow.com/q/50776026/4961700
  • 就像@Asger 下面说的,wkbDest.Range("A:L" &amp; Rows... 可能是您遇到问题的地方。您可以通过设置前一个最后一行或调整大小来修复它。 lRow = wkbDest.Range("A" &amp; Rows.Count).End(xlUp).rowwkbDest.Range("A"&amp; lRow).Resize(12, 12).PasteSpecial Paste:=xlPasteValues

标签: excel vba


【解决方案1】:

包含目标范围的代码行需要优化:

  • 您错误地使用 wkbDest 而不是 wksDest
  • Range("A:L" &amp; 1000) 无法处理部分行
  • 如果您使用不带前导点的 Rows.Count,则假定为 ActiveSheet

第一次尝试

wksDest.Cells(wksDest.Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 12).PasteSpecial _
   Paste:=xlPasteValues

目的地构建如下:

  • 在第 1 列中查找最后使用的单元格(例如 A100)
  • 将其偏移到下一行(例如 A101)
  • 将其调整为 1 行 12 列的新维度(例如 A101:L101)

第二次尝试:

如果粘贴,只需要寻址目标的第一个单元格。所以以下也应该有效:

wksDest.Cells(wksDest.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial _
   Paste:=xlPasteValues

推荐:

如果你定义相同大小的源和目标范围,你可以只分配它们的值(类似于 PastSpecial 的值,但更快):

wksDest.Cells(wksDest.Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 12).Value = _
    wksSource.Range("A14:L26").Value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多