【问题标题】:VBA - How do I speed up the time to copy and paste [duplicate]VBA - 如何加快复制和粘贴的时间[重复]
【发布时间】:2018-10-14 05:38:24
【问题描述】:

下面列出了完整的代码,我将数据透视表中的单元格 DB10 中的数据复制到清单表中的第 N 列 - 另请注意,清单表中的行是动态的,并且每周增长 3018 行。 ..这是减慢处理时间的部分(我对其进行了计时,运行代码时需要大约 8 分钟才能完成处理) 这部分是事情变慢的地方:

Sheets("PivotTables").Select
    Range("DB10").Select
    Selection.Copy
       Sheets("Checklists").Select
          Dim rng As Range
            NRowCount = Cells(Rows.Count, 1).End(xlUp).Offset(-3017).Row
              ARowCount = Cells(Rows.Count, 1).End(xlUp).Row
                For Each rng In Range("N" & NRowCount & ":N" & ARowCount)
                   rng.PasteSpecial xlPasteValues
                       Next rng

完整代码:

Sub WeeklyUpdate()
Application.ScreenUpdating = False
'
' WeeklyUpdate Macro
'

'


    Sheets("Checklists").Select
    Dim LR As Long

    LR = Range("A" & Rows.Count).End(xlUp).Row
    Range("A3:M" & LR).SpecialCells(xlCellTypeVisible).Select
'
    Selection.Copy
    Selection.End(xlDown).Select
    Selection.End(xlUp).Select
    Sheets("Checklists").Cells(Rows.Count, 1).End(xlUp).Offset(1).PasteSpecial 
    xlPasteValues
    Sheets("Checklists").AutoFilterMode = False
    Sheets("PivotTables").Select
    Range("DB10").Select
    Selection.Copy
    Sheets("Checklists").Select
    Dim rng As Range
    NRowCount = Cells(Rows.Count, 1).End(xlUp).Offset(-3017).Row
    ARowCount = Cells(Rows.Count, 1).End(xlUp).Row
    For Each rng In Range("N" & NRowCount & ":N" & ARowCount)
    rng.PasteSpecial xlPasteValues
    Next rng

    Sheets("Home").Select

    Application.ScreenUpdating = True

    End Sub

【问题讨论】:

  • 查看此链接,因为显示了另一种更快的方法。 excelitems.com/2010/12/optimize-vba-code-for-faster-macros.html
  • 另见stackoverflow.com/questions/23937262/…请使用搜索功能查找类似问题。粘贴值是这里的一个常见问题,您可以根据需要调整数十或数百种解决方案。干杯。
  • 感谢 David 和 Solar,我正在查看其他示例 - 我对 VBA 技能非常了解,所以通过我的搜索,答案可能多次出现在我面前,但我只是没有不能很好地理解代码以捕捉它。 -感谢您的链接。

标签: excel vba


【解决方案1】:

如果我理解正确,您只是将单元格DB10 中的值粘贴到N[NRowCount]:N[ARowCount] 范围内。

与其进行For 循环,不如尝试以下方式:

Range("N" & NRowCount & ":N" & ARowCount).Value = Range("DB10").Value

它消除了循环,应该是立即的。

您的最终代码大致如下所示:

...
Sheets("Checklists").AutoFilterMode = False
Sheets("Checklists").Range("N" & NRowCount & ":N" & ARowCount).Value = Sheets("PivotTables").Range("DB10").Value
Sheets("Home").Select

【讨论】:

  • 嗨约翰,谢谢你的回答,你是对的,我正在尝试将数据透视表中的单元格 DB10 中的内容复制到清单表上的 N 列中。我尝试了您提供的代码,但它在您提供的代码的第二行出错。
  • 第二行@Damon.Martin 是什么意思? - 我刚刚向您展示了它应该是什么样子,您唯一需要的就是.Value = .Value 行。我只是想向您展示它在您的代码中的位置 - 第二行和第四行来自您发布的原始代码。
  • 嗨 John,我说的是我添加的 .value = .value (替换了从 Sheets("PivotTables").Select Range("DB10").Select 开始的原始代码) Selection.Copy Sheets("Checklists").Select Dim rng As Range NRowCount = Cells(Rows.Count, 1).End(xlUp).Offset(0).Row ARowCount = Cells(Rows.Count, 1).End( xlUp).Row For Each rng In Range("N" & NRowCount & ":N" & ARowCount) rng.PasteSpecial xlPasteValues Next rng
  • @Damon.Martin,你有没有在其他地方定义 NRowCountARowCount
  • 不,我在其他任何地方都没有 NRowCount 和 ARowCount
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2021-01-03
相关资源
最近更新 更多