2016-04-12 10 views
1

複数の同じワークシートにタイマーマクロがあります。私のユーザーは自分のタスク時間を計測し、各ワークシートは異なるタスクを表します。それぞれのワークシートにリンクされている時間を開始および停止するマクロを持つ要約シートを用意して、各タスクのタイマーを開始するためにユーザーがシート間を行き来する必要がないようにする必要があります。手伝ってくれますか。ここで私が使用しているタイマーコードです。各ワークシートでうまく動作しますが、特定のワークシートでこのコードをアクティブにするためのサマリーワークシート上のボタンのコーディング方法はわかりません。複数のワークシート上のマクロ:他のシート上のマクロを制御するための集計ワークシートが必要

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の

+0

ここにデータシートの画像があります: – TWalker

+0

いいえ...画像を追加できません。しかし、私は8つの異なるタスク(開始時間と最終的な持続時間)のためのタスク時間を記録する8データシートを持っています。それは素晴らしいですが、私はツールの使いやすさを改善する必要があります。ですから、各マクロを開始/停止するためのボタンを備えたワークシートを1つ持っていますが、個々のワークシート上で実行するにはマクロが必要です。私はそれが少しはっきりしていることを願っています。 – TWalker

答えて

0

私はあなたが各ワークシートであなたのタイマールーチンを呼び出す必要がわからない:ここではコードです。あなたは本当に時間を割り当てるワークシートのルーチンと知識が必要です。

1つの方法は、UserFormにボタンの種類のコントロールパネルを使用することです。

enter image description here

次にあなたがUserFormコード内のクリックイベントのすべてを処理したい:それは、この(例として、わずか3ワークシート)のようになります。この例では、ワークシートのコレクションを作成し、各アイテムにボタンの名前である文字列キーでアクセスします。スケルトンコードは次のようになります

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 
関連する問題