VBA脚本不正确复制()正确

时间:2018-01-31 00:00:38

标签: excel vba excel-vba

我从不在Excel / VBA中编程,所以感谢任何帮助。

我的脚本基本上可以工作,除了它似乎是粘贴上次复制的数据而不是当前数据。

首先,我正在设置一个Timer,因此它每天运行两次(列出的时间用于测试)

Private Sub Workbook_Open()
  Application.OnTime TimeValue("16:49:00"), "MyMacro"
  Application.OnTime TimeValue("16:45:00"), "MyMacro"
End Sub

然后,以下脚本将Sheet1上的一系列单元格复制并将其值(以删除公式)粘贴到Sheet2中的下一个空行。

我试图在脚本末尾使用命令Application.CutCopyMode = False清除剪贴板,但是当它不起作用时,我会在开始时添加另一个。

Sub MyMacro()
  Application.CutCopyMode = False
  Sheets("Sheet1").Range("A2:R14").Copy
  Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp)(2).PasteSpecial _
      Paste:=xlPasteValues
  Application.CutCopyMode = False
End Sub

当它在16:49运行时,16:45的数据被粘贴到Sheet2中,而不是新数据。

修改

OnTime似乎对问题没有任何影响。它只发生在(F5)自己运行My_Macro代码。

我在运行Peter提供的代码时遇到了同样的问题。我认为这意味着它不是剪贴板问题?

Option Explicit

Public Sub MyMacro()
Dim srcSheet As Worksheet
Dim srcData As Range
Set srcSheet = ThisWorkbook.Sheets("Sheet1")
Set srcData = srcSheet.Range("A2:R14")

Dim dstSheet As Worksheet
Dim dstData As Range
Set dstSheet = ThisWorkbook.Sheets("Sheet2")

'--- this makes sure the destination range is the same size as
'    the source range
Set dstData = dstSheet.Range("A2").Resize(srcData.Rows.Count, srcData.Columns.Count)

'--- this is where the copy happens...
'    each of these ranges are not a single cell, but an area
'    so it copies all of the data from the source to the destination
dstData.Value = srcData.Value

End Sub

编辑2

更正...因此,看起来,其他数据列实际上正在被正确复制。 我有一个公式为NOW()的列,为复制的数据提供TimeStamp。它是NOW()的列,在每次运行脚本时都没有更新。 TimeStamp列时间是上一次,但其他数据正在变化。由于某种原因,NOW()列未正确复制?

例如:

Sheet1 (原创)

TimeStamp说10:06

B栏说“30”

Sheet2 (副本)

TimeStamp说10:06

B栏说“30”

脚本在10:10再次运行 ---------------

Sheet1 (原创)

TimeStamp说10:10

B栏说“36”

Sheet2 (副本)

TimeStamp说10: 06

B栏说“36”

2 个答案:

答案 0 :(得分:1)

不要试图复制/粘贴,只需像这样直接复制范围:

Option Explicit

Public Sub MyMacro()
    Dim srcSheet As Worksheet
    Dim srcData As Range
    Set srcSheet = ThisWorkbook.Sheets("Sheet1")
    Set srcData = srcSheet.Range("e13:H20")

    Dim dstSheet As Worksheet
    Dim dstData As Range
    Set dstSheet = ThisWorkbook.Sheets("Sheet2")

    '--- this makes sure the destination range is the same size as
    '    the source range
    Set dstData = dstSheet.Range("A1").Resize(srcData.Rows.Count, srcData.Columns.Count)

    '--- this is where the copy happens...
    '    each of these ranges are not a single cell, but an area
    '    so it copies all of the data from the source to the destination
    dstData.Value = srcData.Value

End Sub

此技术与复制/粘贴之间的主要区别在于复制/粘贴使用剪贴板并复制数据和格式,而上面的代码示例仅复制数据。

答案 1 :(得分:1)

Application.CalculateFullRebuild将强制完整计算所有公式并重建工作簿中的所有依赖项。
对于你需要的东西,这可能有点矫枉过正;还有Application.CalculateApplication.CalculateFull

What is the difference between Application.Calculate and Application.CalculateFull?