每隔5秒logging另一个工作表VBA中的2个单元格中的值

问题:我已经为此搜寻了很多东西,似乎无法使其工作。 当按下“StartBtn”时,我有一个计时器正在运行:

Dim StopTimer As Boolean Dim SchdTime As Date Dim Etime As Date Dim currentcost As Integer Const OneSec As Date = 1 / 86400# Private Sub ResetBtn_Click() StopTimer = True Etime = 0 [TextBox21].Value = "00:00:00" End Sub Private Sub StartBtn_Click() StopTimer = False SchdTime = Now() [TextBox21].Value = Format(Etime, "hh:mm:ss") Application.OnTime SchdTime + OneSec, "Sheet1.NextTick" End Sub Private Sub StopBtn_Click() StopTimer = True Beep End Sub Sub NextTick() If StopTimer Then 'Don't reschedule update Else [TextBox21].Value = Format(Etime, "hh:mm:ss") SchdTime = SchdTime + OneSec Application.OnTime SchdTime, "Sheet1.NextTick" Etime = Etime + OneSec End If End Sub 

然后在另一个单元格(比如C16),我有一个手动input的值,即小时费率。 我有第三个单元计算总成本C16 *当前计时器值。

我想要做的就是在“StartBtn”点击当前时间和当前计算的另一个表单中每5秒logging一次。 这是我开始的:

 Sub increment() Dim x As String Dim n As Integer Dim Recordnext As Date n = 0 Record = [TextBox21].Value Recordnext = [TextBox21].Value + OneSec Range("B13").Value = Recordnext Do Until IsEmpty(B4) If [TextBox21].Value = Recordnext Then ActiveCell.Copy Application.Goto(ActiveWorkbook.Sheets("Sheet2").Range("A1").Offset(1, 0)) ActiveSheet.Paste Application.CutCopyMode = False n = n + 1 Recordnext = [TextBox21].Value + 5 * (OneSec) Exit Do End If ActiveCell.Offset(1, 0).Select Loop End Sub 

但它不起作用。 任何帮助,将不胜感激。

我试图简化你的计时器方法到实际需要的。

Sheet1代码表

 Option Explicit Private Sub ResetBtn_Click() bRun_Timer = False 'use the following if you want to remove the last time cycle TextBox21.Value = Format(0, "hh:mm:ss") End Sub Private Sub StartBtn_Click() bRun_Timer = True dTime_Start = Now TextBox21.Value = Format(Now - dTime_Start, "hh:mm:ss") Range("D16").ClearContents Call next_Increment End Sub 

Module1代码表

 Option Explicit Public bRun_Timer As Boolean Public Const iSecs As Integer = 3 'three seconds Public dTime_Start As Date Sub next_Increment() With Worksheets("Sheet1") .TextBox21.Value = Format(Now - dTime_Start, "hh:mm:ss") .Range("D16") = Sheet1.Range("C16") / 3600 * _ Second(TimeValue(Sheet1.TextBox21.Value)) '# of secs × rate/sec Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Resize(1, 2).Offset(1, 0) = _ Array(.TextBox21.Value, .Range("D16").Value) End With If bRun_Timer Then _ Application.OnTime Now + TimeSerial(0, 0, iSecs), "next_Increment" End Sub 

请注意,将数据传输到Sheet2的操作是直接传值.GoTo ,没有.GoToActiveCellSelect

我不清楚你在价值转移方面想做什么。 我已经在Sheet1上依次堆叠它们。

time_cycle_pricing

您可以通过将Option Explicit添加到所有代码表的顶部来获益。 这需要variables声明,如果你放错了一个公共variables,你会很快知道。


¹ 请参阅如何避免使用在Excel VBAmacros中select更多的方法来摆脱依靠select和激活来实现您的目标。

² 在VBE工具中设置需要variables声明 ►选项►编辑器属性页面将把Option Explicit语句放在每个新创build的代码表的顶部。 这将避免像拼写错误这样的愚蠢的编码错误,也会影响你在variables声明中使用正确的variablestypes。 在没有声明的情况下即时创build的variables都是变体/对象types。 使用Option Explicit被广泛认为是“最佳实践”。