Vba 多个工作表上的宏:需要摘要工作表来控制其他工作表上的宏
我在多个相同的工作表上有一个计时器宏。我的用户将计时他们的任务时间,每个工作表代表不同的任务。我需要有一个汇总表,其中包含链接到每个工作表的启动和停止时间的宏,这样我的用户就不必在工作表之间来回切换来启动每个任务的计时器。你能帮忙吗。这是我正在使用的计时器代码。它在每个工作表上都能很好地工作,但我不知道如何对摘要工作表上的按钮进行编码,以便在特定工作表上激活此代码。代码如下:Vba 多个工作表上的宏:需要摘要工作表来控制其他工作表上的宏,vba,excel,timer,Vba,Excel,Timer,我在多个相同的工作表上有一个计时器宏。我的用户将计时他们的任务时间,每个工作表代表不同的任务。我需要有一个汇总表,其中包含链接到每个工作表的启动和停止时间的宏,这样我的用户就不必在工作表之间来回切换来启动每个任务的计时器。你能帮忙吗。这是我正在使用的计时器代码。它在每个工作表上都能很好地工作,但我不知道如何对摘要工作表上的按钮进行编码,以便在特定工作表上激活此代码。代码如下: Sub startStopTimer() If Range("j4") = "Start" Then Ran
Sub startStopTimer()
If Range("j4") = "Start" Then
Range("$b$8").Offset(Range("j6") + 1).Value = Now
Range("j4") = "Stop"
Else
Range("$b$8").Offset(Range("j6"), 1).Value = Now - Range("$b$8").Offset(Range("j6"))
Range("$j$4") = "Start"
End If
End Sub我不确定您是否需要在每个工作表中调用计时器例程。实际上,您只需要一个例行程序和关于分配时间的工作表的知识 一种方法是在
UserForm
上使用一种按钮控制面板。它可能看起来像这样(仅以3张工作表为例):
然后处理UserForm
代码中的所有单击事件。在本例中,我创建了一个工作表集合,每个项目都由一个字符串键访问,该键是按钮的名称。基本代码是:
Option Explicit
Private Const START_COLOUR As Long = &HFF00&
Private Const START_TEXT As String = "Start"
Private Const STOP_COLOUR As Long = &HFF&
Private Const STOP_TEXT As String = "Stop"
Private mSheets As Collection
Private Sub btnClock1_Click()
StartStopButton btnClock1
End Sub
Private Sub btnClock2_Click()
StartStopButton btnClock2
End Sub
Private Sub btnClock3_Click()
StartStopButton btnClock3
End Sub
Private Sub StartStopButton(btn As CommandButton, Optional initialise As Variant)
Dim ws As Worksheet
Dim v As Variant
Dim startTime As Date
Set ws = mSheets(btn.Name)
ws.Activate
If Not IsMissing(initialise) Then
'Initialise the button and sheet
SetProperties btn, CBool(initialise)
ws.Range("A1").Value = "Not yet actioned"
ws.Range("B1:D1").ClearContents
Else
If btn.BackColor = START_COLOUR Then
'Set clock running
SetProperties btn, True
ws.Range("A1").Value = "Running"
ws.Range("B1").Value = Now
ws.Range("C1:D1").ClearContents
Else
'Stop clock and calculate difference
SetProperties btn, False
ws.Range("A1").Value = "Stopped"
ws.Range("C1").Value = Now
v = ws.Range("B1").Value
If Not IsEmpty(v) And IsDate(v) Then
'For DateDiff, choose whichever unit you want, I've used seconds ("s")
ws.Range("D1").Value = DateDiff("s", v, Now)
End If
End If
End If
End Sub
Private Sub SetProperties(btn As CommandButton, running As Boolean)
With btn
If running Then
.Caption = STOP_TEXT
.BackColor = STOP_COLOUR
Else
.Caption = START_TEXT
.BackColor = START_COLOUR
End If
End With
End Sub
Private Sub UserForm_Initialize()
Dim ws As Worksheet
'Assign all worksheets to collection
Set mSheets = New Collection
Set ws = ThisWorkbook.Worksheets("Sheet1")
mSheets.Add ws, btnClock1.Name
Set ws = ThisWorkbook.Worksheets("Sheet2")
mSheets.Add ws, btnClock2.Name
Set ws = ThisWorkbook.Worksheets("Sheet3")
mSheets.Add ws, btnClock3.Name
'Set all buttons to start
StartStopButton btnClock1, False
StartStopButton btnClock2, False
StartStopButton btnClock3, False
End Sub
我不确定您是否需要在每个工作表中调用计时器例程。实际上,您只需要一个例行程序和关于分配时间的工作表的知识 一种方法是在
UserForm
上使用一种按钮控制面板。它可能看起来像这样(仅以3张工作表为例):
然后处理UserForm
代码中的所有单击事件。在本例中,我创建了一个工作表集合,每个项目都由一个字符串键访问,该键是按钮的名称。基本代码是:
Option Explicit
Private Const START_COLOUR As Long = &HFF00&
Private Const START_TEXT As String = "Start"
Private Const STOP_COLOUR As Long = &HFF&
Private Const STOP_TEXT As String = "Stop"
Private mSheets As Collection
Private Sub btnClock1_Click()
StartStopButton btnClock1
End Sub
Private Sub btnClock2_Click()
StartStopButton btnClock2
End Sub
Private Sub btnClock3_Click()
StartStopButton btnClock3
End Sub
Private Sub StartStopButton(btn As CommandButton, Optional initialise As Variant)
Dim ws As Worksheet
Dim v As Variant
Dim startTime As Date
Set ws = mSheets(btn.Name)
ws.Activate
If Not IsMissing(initialise) Then
'Initialise the button and sheet
SetProperties btn, CBool(initialise)
ws.Range("A1").Value = "Not yet actioned"
ws.Range("B1:D1").ClearContents
Else
If btn.BackColor = START_COLOUR Then
'Set clock running
SetProperties btn, True
ws.Range("A1").Value = "Running"
ws.Range("B1").Value = Now
ws.Range("C1:D1").ClearContents
Else
'Stop clock and calculate difference
SetProperties btn, False
ws.Range("A1").Value = "Stopped"
ws.Range("C1").Value = Now
v = ws.Range("B1").Value
If Not IsEmpty(v) And IsDate(v) Then
'For DateDiff, choose whichever unit you want, I've used seconds ("s")
ws.Range("D1").Value = DateDiff("s", v, Now)
End If
End If
End If
End Sub
Private Sub SetProperties(btn As CommandButton, running As Boolean)
With btn
If running Then
.Caption = STOP_TEXT
.BackColor = STOP_COLOUR
Else
.Caption = START_TEXT
.BackColor = START_COLOUR
End If
End With
End Sub
Private Sub UserForm_Initialize()
Dim ws As Worksheet
'Assign all worksheets to collection
Set mSheets = New Collection
Set ws = ThisWorkbook.Worksheets("Sheet1")
mSheets.Add ws, btnClock1.Name
Set ws = ThisWorkbook.Worksheets("Sheet2")
mSheets.Add ws, btnClock2.Name
Set ws = ThisWorkbook.Worksheets("Sheet3")
mSheets.Add ws, btnClock3.Name
'Set all buttons to start
StartStopButton btnClock1, False
StartStopButton btnClock2, False
StartStopButton btnClock3, False
End Sub
这是数据表的图片:好的……无法添加图片。但是我有8个数据表记录了8个不同任务的任务时间(开始时间和最终持续时间)。那太好了,但是我需要提高工具的可用性。因此,我希望有一个带有按钮的工作表来启动/停止每个宏,但我需要宏仍然在各个工作表上运行。我希望这更清楚一点。这是数据表的图片:好的……不能添加图片。但是我有8个数据表记录了8个不同任务的任务时间(开始时间和最终持续时间)。那太好了,但是我需要提高工具的可用性。因此,我希望有一个带有按钮的工作表来启动/停止每个宏,但我需要宏仍然在各个工作表上运行。我希望这更清楚一点。