我从不在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”
答案 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.Calculate和Application.CalculateFull。
What is the difference between Application.Calculate and Application.CalculateFull?