【发布时间】: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与.“锚”。 -
保持
ScreenUpdatingTrue 看看会发生什么。 (您可以稍后在完成测试后将其关闭。)我会检查“挂断”是否发生在第 9 个文件或该特定文件上。您是否尝试过删除/替换第 9 个文件或仅为该文件运行宏? -
@BruceWayne wsDest 变量在上一行中定义为特定工作表,它是上一行中定义的变量工作簿 wbDest 的一部分。这似乎没问题,但我很好奇,如果定义 wbDest =workbooks.open() 方法会导致 excel 在每次使用 wsDest 并通过引用 wbDest 时尝试重新打开该工作簿,或者一旦它打开,它已经认识到现在作为那个工作簿的变量?
-
@AcsErno 我正在查看第 9 个文件,但目前还找不到任何内容。选项卡名称中包含 ( ) 字符是否有任何问题?我知道我之前在宏中遇到过问题,因为空格或不同的字符,但它适用于前几个文件。
标签: excel vba range copy-paste