我想在一个确切的时间从一个单元格(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
答案 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。在倒数计时器内关闭事件处理,因为我希望在处理倒计时时发生最少量的外部影响。我留下了一个倒计时到零的消息框,这样你就可以知道在哪里运行'事件'。
这是倒计时到零时会发生什么的一个例子。
我已经在我的公共DropBox here上提供了该示例二进制宏启用的工作簿。我现在不知道它会如何留在那里。
答案 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
感谢您的帮助