2017-02-02 3 views
0

Ich erstellte eine ActiveX-Schaltfläche für einen Tracker Ich wurde mit dem Bau bei der Arbeit beauftragt, ActiveX-Taste funktionierte großartig, aber da waren endlose Kompatibilität und Erlaubnisprobleme, als ich es aussandte. Beschlossen, es stattdessen zu einer Makro-fähigen Form zu machen. Es sollte eine einfache Schaltfläche sein, die, wenn Sie darauf klicken, die aktuelle Uhrzeit und das Datum in die aktive Zelle eingibt. Das funktioniert, das Problem ist, dass es nicht mehr so ​​schwebt, wie ich es hatte, als es eine Activex-Taste war, es folgt nicht der aktiven Zelle auf der Seite. Auch - da es nicht activex ist, simuliert es nicht einen Knopfklick, den ich versuchte zu kodieren, und alles sieht richtig aus, aber es gibt keine Depression, wenn ich darauf klicke. Hier ist, was ich bisher habe.Ich habe eine Schaltfläche in Excel, die als ActiveX-Steuerelement funktionierte, musste in Form wechseln, jetzt funktioniert es nicht 100%

Sub RectangleRoundedCorners1() 
Dim vTopType As Variant 
Dim iTopInset As Integer 
Dim iTopDepth As Integer 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     vTopType = .BevelTopType 
     iTopInset = .BevelTopInset 
     iTopDepth = .BevelTopDepth 
    End With 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     .BevelTopType = msoBevelSoftRound 
     .BevelTopInset = 12 
     .BevelTopDepth = 4 
    End With 
    Application.ScreenUpdating = True 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     .BevelTopType = vTopType 
     .BevelTopInset = iTopInset 
     .BevelTopDepth = iTopDepth 
    End With 
End Sub 

Sub RectangleRoundedCorners1_Click() 
    ActiveCell.Value = Now() 
    ActiveCell.NumberFormat = "MM/DD/YY hh:mm:ss" 
End Sub 

Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) 
    With Cells(Windows(1).ScrollRow, Windows(1).ScrollColumn) 
     RectangleRoundedCorners1.Top = .Top + 10 
     RectangleRoundedCorners1.Left = .Left + 825 

    End With 
End Sub 
+0

Haben Sie die Möglichkeit, eine Formularschaltfläche auf der Seite zu platzieren? Gehen Sie zum Einfügen auf der Registerkarte Entwickler und wählen Sie die Schaltfläche Formular anstelle von Activex. Klicken Sie mit der rechten Maustaste auf die Schaltfläche, um die Eigenschaften festzulegen, und Sie können festlegen, ob sie sich mit Zellen bewegen soll oder nicht. Und Sie können mit der rechten Maustaste klicken, um ein Sub auszuwählen, wenn darauf geklickt wird. –

+0

Ich habe das versucht, aber es hat nicht funktioniert, Das Team, das ich getroffen habe, um die Empfehlung für eine Makro-fähige Form zu erhalten, sagte, dass viele der gleichen Probleme verursachen können, die ich mit der activex-Schaltfläche hatte. Unabhängig davon würde ich gerne wissen, wie das funktioniert für die Makro-fähigen Formen, einschließlich der oberen Teil des Codes, die die Schaltfläche eine gedrückte Schaltfläche zeigen sollte, wenn Sie darauf klicken – Cdhippen

+0

Ich möchte ein Popup mit der rechten Maustaste verwenden Menü, um spezielle Funktionen zu starten. Ron DeBruin hat dafür eine hervorragende Codequelle. http://www.rondebruin.nl/win/s6/win002.htm Sie fügen Ihre Funktion dem regulären Recht-Klick-Pop-up-Menü hinzu, beschriften Sie etwas wie "Datum einfügen" - dann klicken Sie mit der rechten Maustaste auf eine Zelle und Ihre Label wird auf dem Pop-up sein. Der einzige Nachteil ist, dass Sie sicherstellen müssen, dass die Arbeitsmappe sie beim Schließen entfernt. Ein einfacher onClose-Code wird das tun. –

Antwort

0

Shape-Objekte haben nicht die gleichen Methoden wie ein ActiveX-Objekt. Sie sind auch nur in der Excel-Arbeitsmappe vorhanden, nicht in VB. Sie können also nicht einfach auf sie verweisen, indem Sie eine Methode mit demselben Namen wie das Objekt erstellen. Sie können diese beiden Subs zu einem zusammenführen und dann das Sub-Objekt dem Button zuweisen, indem Sie mit der rechten Maustaste darauf klicken und die "Assign Macro ..." Option verwenden, um dieses Sub zu setzen.

Sub ButtonClick() 
Dim vTopType As Variant 
Dim iTopInset As Integer 
Dim iTopDepth As Integer 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     vTopType = .BevelTopType 
     iTopInset = .BevelTopInset 
     iTopDepth = .BevelTopDepth 
    End With 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     .BevelTopType = msoBevelSoftRound 
     .BevelTopInset = 12 
     .BevelTopDepth = 4 
    End With 
    Application.ScreenUpdating = True 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     .BevelTopType = vTopType 
     .BevelTopInset = iTopInset 
     .BevelTopDepth = iTopDepth 
    End With 

    ActiveCell.Value = Now() 
    ActiveCell.NumberFormat = "MM/DD/YY hh:mm:ss" 
End Sub 

Was das immer es um das Blatt zu folgen, müssen Sie zunächst eine gültige Referenz auf das Form-Objekt zu erhalten (dieser Code muss innerhalb des Moduls für das Arbeitsblatt Ihrer Schaltfläche ist in sein). enter image description here

Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) 

Dim shButton As Shape 

Set shButton = Shapes("RectangleRoundedCorners1") 

With Cells(Windows(1).ScrollRow, Windows(1).ScrollColumn) 
    shButton.Top = .Top + 10 
    shButton.Left = .Left + 825 
End With 

End Sub 
+0

Danke!Ich werde das versuchen, wenn ich morgen reinkomme – Cdhippen

+0

Wenn ich diese Methode versuche, sieht alles gut für mich aus, außer dem folgenden Blatt-Teil, ich habe jetzt das Makro zugewiesen "ButtonClick" anstelle von "RectangleRoundedCorners1" und wenn ich kompiliere es, bekomme ich eine Fehlermeldung: „Sub oder Funktion nicht definiert“ an: Set shbutton = Formen („rectangleRoundedCorners1“) verweist das Wort „Shapes“ – Cdhippen

+0

ich habe auch versucht manuell ein zweites Makro namens Hinzufügen rectangleroundedcorners1 aber, dass gerade erstellt ein Sub mit diesem Namen und verbindet es nicht mit dem Objekt. Ich denke, das Problem ist, dass ich nicht sicher bin, wie man das zweite Bit des Codes mit dem Objekt verbindet. – Cdhippen

0

Die Veränderung der Form geschieht so schnell, dass das menschliche Auge kaum sehen kann. Ich setze eine for-Schleife, um die Änderung lange genug sichtbar zu halten, damit der Benutzer den Schlüsselklick zu schätzen weiß.

Fügen Sie den folgenden Code in ein reguläres Modul ein, nicht in Ihr Arbeitsblattmodul. Löschen Sie den gesamten Arbeitsblattmodulcode, der sich auf diese Form bezieht.

Dann klicken Sie mit der rechten Maustaste auf Ihre Form und "Makro zuweisen" - zu diesem im regulären Modul. Ich weiß nicht, wie man es an Ort und Stelle hält, wenn der Benutzer scrollt, aber zumindest wird dies Ihr visuelles Problem beheben.

Ich habe auch die Datumsänderung Zelle A1 hinzugefügt.

Sub RectangleRoundedCorners1() 
Dim vTopType As Variant 
Dim iTopInset As Integer 
Dim iTopDepth As Integer 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     vTopType = .BevelTopType 
     iTopInset = .BevelTopInset 
     iTopDepth = .BevelTopDepth 
    End With 

For i = 1 To 70 
' This change happens too quickly for the eye to see 
' Put a small for loop so the visual change can be seen 
    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     .BevelTopType = msoBevelSoftRound 
     .BevelTopInset = 12 
     .BevelTopDepth = 4 
     .Visible = True 
    End With 
    Application.ScreenUpdating = True 
    ActiveSheet.Shapes(Application.Caller).ThreeD.Visible = True 
Next i 

    With ActiveSheet.Shapes(Application.Caller).ThreeD 
     .BevelTopType = vTopType 
     .BevelTopInset = iTopInset 
     .BevelTopDepth = iTopDepth 
    End With 


    ActiveSheet.Range("A1").Value = Format(Now(), "mmm dd, yyyy") 

End Sub 
Verwandte Themen