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个不同任务的任务时间(开始时间和最终持续时间)。那太好了,但是我需要提高工具的可用性。因此,我希望有一个带有按钮的工作表来启动/停止每个宏,但我需要宏仍然在各个工作表上运行。我希望这更清楚一点。