【问题标题】:Excel VBA Copy/Paste Between Range of WorkbooksExcel VBA 在工作簿范围之间复制/粘贴
【发布时间】:2018-06-22 19:11:20
【问题描述】:

我以前经常在 VBA 中编码,但已经有几年了,我很困惑。以下代码有一个问题,对于它正在打开/复制的前 9 个文件,它似乎工作正常(虽然非常慢),然后我收到一个宏错误,并导致需要重新启动的 excel 挂起。我从 luke_t 在这个论坛上大量借用/修改了一篇较早的帖子,以达到这一点。据我所知,第9个文件没有区别,因为它们都是基于标准模板的,但错误可能在那里?

    Sub copy_rng()
Dim wb As Workbook, wbDest As Workbook, ws As Worksheet, wsDest As Worksheet, wsSrc As Worksheet
Dim wbNames() As Variant
Dim destPath As String
Dim fullpath As String
Dim outputrow As Variant, i As Byte

Set wb = ThisWorkbook
Set ws = wb.Sheets("Casing")
Set wsSrc = wb.Sheets("Casing")
wbNames = ws.Range("b5:b" & lrow(2, ws))

destPath = "C:\Users\...\Daily Reports\"
outputrow = 5

Application.ScreenUpdating = False

For i = 1 To UBound(wbNames, 1)

    fullpath = destPath & wbNames(i, 1)
    MsgBox i & " " & fullpath
    'Stop

    Set wbDest = Workbooks.Open(destPath & wbNames(i, 1))
    Set wsDest = wbDest.Sheets("Field Report (Internal)")

    With wsDest
        .Range(Cells(27, 17), Cells(27, 19)).Copy
    End With
    wsSrc.Cells(outputrow, 10).PasteSpecial xlPasteValues

    With wsDest
        .Range(Cells(28, 17), Cells(28, 19)).Copy
    End With
    wsSrc.Cells(outputrow, 13).PasteSpecial xlPasteValues

    With wsDest
        .Range(Cells(29, 17), Cells(29, 19)).Copy
    End With
    wsSrc.Cells(outputrow, 16).PasteSpecial xlPasteValues

    Application.CutCopyMode = False

    wbDest.Close False

    outputrow = outputrow + 1

Next i

Application.ScreenUpdating = True
    End Sub

    Function lrow(ByVal col_num As Integer, sheet_name As Worksheet) As Long
lrow = sheet_name.Cells(Rows.Count, col_num).End(xlUp).Row
    End Function

【问题讨论】:

  • 快速说明 - 当您使用 Cells() 时,您还必须确保指定工作表。您有With wsDest // .Range(Cells(), Cells()).Copy,但您没有链接到Cells() 的工作表。确保将这些链接到 wsDest. “锚”。
  • 保持ScreenUpdating True 看看会发生什么。 (您可以稍后在完成测试后将其关闭。)我会检查“挂断”是否发生在第 9 个文件或该特定文件上。您是否尝试过删除/替换第 9 个文件或仅为该文件运行宏?
  • @BruceWayne wsDest 变量在上一行中定义为特定工作表,它是上一行中定义的变量工作簿 wbDest 的一部分。这似乎没问题,但我很好奇,如果定义 wbDest =workbooks.open() 方法会导致 excel 在每次使用 wsDest 并通过引用 wbDest 时尝试重新打开该工作簿,或者一旦它打开,它已经认识到现在作为那个工作簿的变量?
  • @AcsErno 我正在查看第 9 个文件,但目前还找不到任何内容。选项卡名称中包含 ( ) 字符是否有任何问题?我知道我之前在宏中遇到过问题,因为空格或不同的字符,但它适用于前几个文件。

标签: excel vba range copy-paste


【解决方案1】:

好的,终于想通了。清理代码以使其更清晰,但我相信我的问题不在于具体的代码,而是因为我还没有为我试图提取的一些基于日期的信息创建文件,即我有将来创建文件的日期,并且不会检查这些文件是否存在。我没有添加错误检查,而是暂时删除了未来的日期参考,因为这样更快。

Sub copy_rng()
Dim wb As Workbook, wbToOpen As Workbook, ws As Worksheet, wsSource As Worksheet
Dim wbNames() As Variant
Dim filePath As String
Dim outputrow As Variant, i As Byte
Dim srcOneRange As Range, srcTwoRange As Range, srcThreeRange As Range

Set wb = ThisWorkbook
Set ws = wb.Sheets("Casing")
wbNames = ws.Range("b5:b" & lrow(2, ws))

filePath = "C:\Users\...\Daily Reports\" 'set path to your path
outputrow = 5

For i = 1 To UBound(wbNames, 1)
    Application.ScreenUpdating = False

    Set wbToOpen = Workbooks.Open(filePath & wbNames(i, 1))
    Set wsSource = wbToOpen.Sheets("Field Report (Internal)")

    Set srcOneRange = wsSource.Range("q27:s27")
    Set srcTwoRange = wsSource.Range("q28:s28")
    Set srcThreeRange = wsSource.Range("q29:s29")

    ws.Activate

    With ws
        .Range(Cells(outputrow, 10), Cells(outputrow, 12)).Value = srcOneRange.Cells.Value
        .Range(Cells(outputrow, 13), Cells(outputrow, 15)).Value = srcTwoRange.Cells.Value
        .Range(Cells(outputrow, 16), Cells(outputrow, 18)).Value = srcThreeRange.Cells.Value
    End With


    wbToOpen.Close False

    outputrow = outputrow + 1

    Application.ScreenUpdating = True

    DoEvents
    ActiveWindow.SmallScroll down:=1

    Application.WindowState = Application.WindowState

Next i

Application.ScreenUpdating = True

End Sub

【讨论】:

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