2017-05-09 2 views
0

Ich bin derzeit in der Lage, den Bereich eines ActiveX-Spinner ("Device1") basierend auf dem aktuellen Datum und Uhrzeit zu ändern. Zeit, die die Zeilennummer und das Datum bestimmt, die die Spaltennummer bestimmen. Zellen (B3: H3) geben Daten mit der Today() -Funktion zurück und Cell (A3) gibt die aktuelle Zeit alle 10 Sekunden zurück. Ich habe die Offset() - Funktion verwendet, aber ich merke jetzt, dass der Drehfeldwert jedes Mal auf 0 zurückgesetzt werden muss, wenn sich die Variable fDate oder fTime geändert hat. Dies sind die Subs, mit denen ich gerade arbeite. Idealerweise würde ich gerne Sub SpinnerReset() nur aufrufen können, wenn fDate und fTime sich von ihren vorherigen Werten geändert haben, um zu vermeiden, dass der Wert alle 10 Sekunden zurückgesetzt wird.Ausführen von Makros mit einer Änderung an einer Variablen

Vielleicht eine Möglichkeit, vorherige Werte beizubehalten und zu vergleichen, wenn nicht gleich? Ich bin mir nicht sicher, ob das möglich ist.

Sub Device1_Change() 
Dim fDate, fTime As Integer 
'Change fDate based on day' 
    If Range("B3") = Date Then fDate = 0 
    If Range("C3") = Date Then fDate = 16 
    If Range("D3") = Date Then fDate = 32 
    If Range("E3") = Date Then fDate = 48 
    If Range("F3") = Date Then fDate = 64 
    If Range("G3") = Date Then fDate = 80 
    If Range("H3") = Date Then fDate = 96 
'Change fTime based on TimeStamp' 
    If Range("A3") > TimeValue("09:59:59") And Range("A3") < TimeValue("11:00:00") Then fTime = 0 
    If Range("A3") > TimeValue("10:59:59") And Range("A3") < TimeValue("12:00:00") Then fTime = 1 
    If Range("A3") > TimeValue("11:59:59") And Range("A3") < TimeValue("13:00:00") Then fTime = 2 
    If Range("A3") > TimeValue("12:59:59") And Range("A3") < TimeValue("14:00:00") Then fTime = 3 
    If Range("A3") > TimeValue("13:59:59") And Range("A3") < TimeValue("15:00:00") Then fTime = 4 
    If Range("A3") > TimeValue("14:59:59") And Range("A3") < TimeValue("16:00:00") Then fTime = 5 
    If Range("A3") > TimeValue("15:59:59") And Range("A3") < TimeValue("17:00:00") Then fTime = 6 
    If Range("A3") > TimeValue("16:59:59") And Range("A3") < TimeValue("18:00:00") Then fTime = 7 
    If Range("A3") > TimeValue("17:59:59") And Range("A3") < TimeValue("19:00:00") Then fTime = 8 
    If Range("A3") > TimeValue("18:59:59") And Range("A3") < TimeValue("20:00:00") Then fTime = 9 
    If Range("A3") > TimeValue("19:59:59") And Range("A3") < TimeValue("21:00:00") Then fTime = 10 
    If Range("A3") > TimeValue("20:59:59") And Range("A3") < TimeValue("22:00:00") Then fTime = 11 
    If Range("A3") > TimeValue("21:59:59") And Range("A3") < TimeValue("23:00:00") Then fTime = 12 

'Select cell for spinner' 
Worksheets("Count").Range("C4").Offset(fTime, fDate).Value = Device1.Value 
End Sub 

Sub SpinnerReset() 
Device1.Value = 0 
End Sub 
+0

Woher wissen Sie, wann 'fDate' oder' fTime' sich geändert hat? Möchten Sie sehen, ob sich eine Zelle in "B3: H3" ändert und "fDate" aktualisiert? – BruceWayne

+0

Das aktuelle Format mit fDate und fTime funktioniert einwandfrei. Die Zelle, die vom Spinner beeinflusst wird, ändert sich mit der Aktualisierung auf die aktuelle Uhrzeit und das aktuelle Datum, aber das Hauptproblem ist, dass sobald eine neue Zelle ausgeführt wird, der Spinner immer noch den vorherigen Wert trägt. Ich möchte, dass der Wert des Drehfelds zurückgesetzt wird, sobald sich die Zelle geändert hat. Wenn Sie ein einfacheres Format kennen, um die betroffene Zelle zu ändern, bin ich offen für Ideen. – AvidAdventurer

+0

Welche Zellen ändern sich und wenn sie sich ändern, möchten Sie, dass das Makro erneut ausgeführt wird? – BruceWayne

Antwort

0

Um auf meinen Kommentar näherzugehen, würde Ihr Code so aussehen wie unten. Bitte beachten Sie, dass ich gerade einen Blattnamen (Speicher) und eine Zelle (A1) erstellt habe. Es könnte alles sein, was Sie wollen, und Sie könnten dieses Blatt versteckt halten, wenn Sie es bevorzugen.

EDIT: Condensed den fDate und fTime Code, und enthielt auch die Stunde, in der Speicherzelle.

Private Sub Device1_Change() 

    Dim fDate As Long, fTime As Long 

    'Change the sheet and cell to wherever you store the date 
    'Note that the date will be stored as an Excel datecode 
    With Sheets("Storage").Range("A1") 
     If .Value <> Format(Now, "dd/mm/yy hh") Then 
      SpinnerReset 
      .Value = Format(Now, "dd/mm/yy hh") 
     End If 
    End With 

    fDate = Evaluate("16*(MATCH(TODAY(),B3:H3,0)-1)") 
    fTime = Evaluate("FLOOR(A3,1/24)*24-10") 

    Sheets("Count").Range("C4").Offset(fTime, fDate).Value = Me.Device1.Value 

End Sub 
+0

Ich sehe, wohin du damit gehst. Ich denke, Sie haben Recht, ich muss möglicherweise Updates für "fDate" und "fTime" in einem separaten Unterprogramm ausführen, wenn sie für das Aufrufen von 'Sub SpinnerReset()' verantwortlich sein werden. Ich bin mir nicht sicher, wie das aussehen würde. – AvidAdventurer

+0

@AvidAdventurer 'fDate' und' fTime' würden sich nicht ändern, ich habe es einfach nicht eingegeben. Es würde an die Stelle gesetzt werden "Rest des Codes hier" – tigeravatar

+0

@AvidAdventurer Ich kondensierte Ihre "fDate" und "fTime" Zuweisungscode und auch die Stunde in der Speicherzelle. Siehe bearbeitete Antwort. – tigeravatar

Verwandte Themen