【问题标题】:Error after Application.DisplayAlerts = FalseApplication.DisplayAlerts = False 后出错
【发布时间】:2020-03-01 14:49:21
【问题描述】:

我正在尝试从前一天的文件中复制特定单元格,并将它们作为文本粘贴到当前工作簿中的同一位置。

我只希望在星期四完成。

Sub OpenFile()

If Weekday(Now()) = vbThursday Then

    FileYear = Year(Date)
    FileDate = Format(Date, "yymmdd")
    FilePath = "I:\Example\2020\" & Format(Now() - 1, "yymmdd") & " " & _
      "Sequentieanalyse werkblad.xlsm"

    Workbooks.Open (FilePath)

    Range("P48:Z57").Select
    Selection.Copy
    ActiveWorkbook.Close False

    Sheets("Monsterlijst").Select
    Range("P48:Z57").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False

End If

End Sub

当我运行我的代码时,我收到一个消息框,提示剪贴板上有很多信息,我必须选择是、否或中止,然后是运行时错误 1004,其中一个选项。
当我使用Application.DisplayAlerts = False 时,我还会收到运行时错误 1004。

删除 ActiveWorkbook.Close False 时没有错误消息,但我的信息将粘贴回我正在复制的工作簿中,而不是当前工作簿中。
我还希望关闭前一天的文件以防止混淆。

复制部分确实有效,因为如果我取消错误消息,我可以手动粘贴它。

如果星期四是银行假日,我将如何调整代码以在星期五而不是星期四运行?

【问题讨论】:

  • 复制,然后粘贴,然后关闭。不要Select 同时做任何事情。将 Workbooks.Open (FilePath) 的结果保存到变量 (As Workbook) 中以将其用作源工作簿。使用ThisWorkbook 作为目标工作簿。
  • 至于第二个问题,这是一个完全不同的问题,应该在自己的问题上发布。

标签: excel vba


【解决方案1】:

您的代码效率极低。请牢记@GSerg 评论并阅读如何避免使用 select。

您在这里特别面临的问题是您在将复制的单元格粘贴到任何地方之前关闭了工作簿,从而导致您的错误。这可以通过将Paste 操作移到Close 操作上方来完全防止:

Option Explicit

Sub OpenFile()
Dim ref As Workbook
Dim filepath As String

If Weekday(Now()) = vbThursday Then

filepath = "I:\Example\2020\" & Format(Now() - 1, "yymmdd") & " " & "Sequentieanalyse werkblad.xlsm"

Set ref = Workbooks.Open(filepath)

Range("P48:Z57").Copy
ThisWorkbook.Sheets("Monsterlijst").Range("P48:Z57").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

ref.Close False
End If

End Sub

(代码也优化以避免使用选择)

【讨论】:

  • @BigBen 校对可以挽救生命,我应该更频繁地这样做:P
  • 作为替代方案,您可以先将数据存储在数组中,然后将数组写入所需的输出范围。避免了几个潜在问题并使调试工作更轻松。
  • 感谢大家的快速回复。我肯定会检查我的其他代码,看看我是否更频繁地使用“选择”并且也可以在那里替换它。它仍然给了我一个关于剪贴板的消息框,但我添加了一个“Application.CutCopyMode = False”,现在一切正常!
  • Range("P48:Z57").Copy 仍然依赖于隐式活动工作表(Workbooks.Open 使打开的工作簿处于活动状态)。最好ref.Worksheets("name").Range("P48:Z57").Copy
  • @GSerg 同意,如果需要第一张表,ref.Sheet1 也可以。但在不知道需要哪张纸的情况下,我不能把它放在答案中。
猜你喜欢
  • 2019-10-25
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2021-08-13
相关资源
最近更新 更多