在特定时间将值记录到单元格

时间:2015-02-14 12:22:36

标签: excel-vba vba excel

我想在一个确切的时间从一个单元格(H5)中提取一个数字。我的工作表连接到一个网站,工作表(和单元格H5)每秒更新。我在单元格(D2)中有一个倒数计时器,当此计时器等于事件开始前2分钟,然后我想提取单元格中的值(H5)并将其放入新单元格(AA1)中,我希望该值保留在那里,因为单元格(H5)中的值将在几秒钟后再次更改。

OP评论的附录:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address <> "$D$2" Then Exit Sub
  Application.EnableEvents = False
  Range("AA1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  Range("AA1").Value = Range("H5").Value 
  Application.EnableEvents = True 
End Sub

2 个答案:

答案 0 :(得分:0)

恕我直言,任何愚蠢的倒计时器都应该尽可能不引人注目。您提供的代码是工作表的Worksheet_Change事件宏,它尝试处理包含计时器倒计时显示的单元格中的值更改。倒计时达到两分钟标记的任何事情都应在倒计时程序内;在工程中添加另一个流程只能a)消耗更多资源,b)增加更多冲突可能性。我就是这样做的。

首先,我喜欢立即控制任何计时器例程。通常,我在工作表上选择一个单元格,我可以双击打开和关闭计时器。在此示例中,我将选择A1并为单元格使用自定义数字格式[Color10]\RU\N\NI\N\G;[Color13]\EV\E\NT!;[Color9]w\aiti\n\g;

在工作表的代码表(右键单击工作表名称标签►查看代码)中粘贴以下内容。

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Address(0, 0) = "A1" Then
        Cancel = True
        On Error GoTo SafeExit
        Application.EnableEvents = False
        Target.Value2 = Abs(Int(Not CBool(Target.Value2)))
        bINTIMER = CBool(Target.Value2)
        If bINTIMER Then
            Me.Range("D2") = TimeSerial(0, 2, 10)
            Application.OnTime earliesttime:=Now + TimeSerial(0, 0, 1), _
              procedure:="Countdown", latesttime:=Now + TimeSerial(0, 0, 2), schedule:=True
            bRANH5XFER = False
        Else
            Me.Range("D2") = TimeSerial(0, 0, 0)
        End If
    End If
SafeExit:
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "D2" Then
        Debug.Print Format(Target.Value, "[hh]:mm:ss")
    End If
End Sub

Worksheet_BeforeDoubleClick双击A1打开和关闭计时器。自定义数字格式建议当前状态。公开声明的变量(bINTIMER,在下一步中定义)用于确定计时器是否处于活动状态。

Worksheet_Change事件子仅用于证明它不参与计时器过程,除非手动更改D2中的值。它在此示例中没有用处,可以删除或修改用于其他目的。

在VBE中的模块表( Alt + I M )中粘贴以下内容。

Option Explicit

Public bINTIMER As Boolean
Public bRANH5XFER As Boolean

Public Sub CountDown()
    If bINTIMER Then
        Application.EnableEvents = False
        With Sheets("Sheet1")
            If .Range("D2").Value < TimeSerial(0, 0, 2) Then
                .Range("A1") = -1
                .Range("D2") = 0
                MsgBox "Countdown is zero." & Chr(10) & "Run your event."
                .Range("A1") = 0
            Else
                .Range("D2") = .Range("D2").Value - TimeSerial(0, 0, 1)
                Application.OnTime earliesttime:=Now + TimeSerial(0, 0, 1), _
                  procedure:="Countdown", latesttime:=Now + TimeSerial(0, 0, 2), schedule:=True
                If Not bRANH5XFER And .Range("D2").Value < TimeSerial(0, 2, 0) Then
                    .Range("H5").Copy
                    .Range("AA1").Insert Shift:=xlDown
                    Application.CutCopyMode = False
                    bRANH5XFER = Not bRANH5XFER
                ElseIf Not CBool(Second(.Range("D2").Value) Mod 3) Then
                    .Range("H5") = CLng(Rnd() * 99)
                End If
            End If
        End With
        Application.EnableEvents = True
    End If
End Sub

这是倒计时例行程序。它处理两分钟标记和倒计时到零。我添加了一些代码,每三秒钟将一个随机数放入H5。在倒数计时器内关闭事件处理,因为我希望在处理倒计时时发生最少量的外部影响。我留下了一个倒计时到零的消息框,这样你就可以知道在哪里运行'事件'。

这是倒计时到零时会发生什么的一个例子。

Countdown Timer

我已经在我的公共DropBox here上提供了该示例二进制宏启用的工作簿。我现在不知道它会如何留在那里。

Application_OnTime_Timer_w_Secondary_Event.xlsb

答案 1 :(得分:0)

我自己排序了答案,最后我很安静,不需要大行代码。我在N60中设置了一个if staement,然后运行以下代码

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
If Range("N60").Value = 1 Then
Range("C62").Value = Range("H5").Value
Else   
End If
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub

感谢您的帮助