2016-07-31 51 views
1

Ich möchte ein transparentes Etikett auf einem Blatt in Excel, so dass ich das MouseMove-Ereignis des Etiketts nutzen kann, um "Zellen" (aka ändern ihre Füllfarbe und so weiter) per Mausklick/ziehen/etc. - da kann ich das an den Zellen per se nicht machen.Wie mache ich ein Excel-ActiveX-Label transparent ... zur Laufzeit?

Jetzt funktioniert alles gut, außer dass ich das Label nicht zur Laufzeit transparent machen kann (aka in VBA) ... während genau das gleiche im Design Mode funktioniert wie erwartet. Insbesondere habe ich den Code (mehr oder weniger):

Dim MapLabel As OLEObject 
On Error Resume Next 
Sheet2.OLEObjects("MapLabel").Delete 
Set MapLabel = Sheet2.OLEObjects.Add("Forms.Label.1") 
MapLabel.name = "MapLabel" 
MapLabel.Placement = xlMoveAndSize 
MapLabel.Object.Caption = "" 
' Problem line below 
MapLabel.Object.BackStyle = fmBackStyleTransparent 
' Problem line above 
MapLabel.Left = Sheet2.cells(2, 6).Left 
MapLabel.Top = Sheet2.cells(2, 6).Top 
MapLabel.Width = Sheet2.cells(2,6).Width * 10 
MapLabel.Height = Sheet2.cells(2,6).Height * 10 

Also, in Worten, ich zum ersten Mal das Label löschen namens 'MapLabel', dann erstellen Sie es (der obige Code geht in einen "init" Sub). Alle Codezeilen, außer der markierten, ergeben das gewünschte Ergebnis. Die markierte tut setzen Sie die BackStyle-Eigenschaft des Etiketts auf fmBackStyleTransparent ... aber es nicht tatsächlich machen das Etikett transparent. Das ist frustrierend, denn es ist derselbe Ansatz, der zur Designzeit einwandfrei funktioniert!

Haben Sie eine Lösung? Ich lese über das Lösen ähnlicher Probleme, indem ich das Label als MsFormsLabel oder als Control deklariere, aber das Sheet-Objekt hat diese Eigenschaften nicht, außerdem gibt es weit mehr Label-Eigenschaften, die mit dem OLEObject als mit Hilfe von MsForms gesetzt werden können .Label oder Kontrolle.

+0

Warum löschen Sie es und erstellen es neu? als Test funktioniert es für mich mit einem ActiveX-Label, zur Laufzeit aus transparent wechselt zu undurchsichtig mit 'Private Sub Worksheet_SelectionChange (ByVal Target As Range) Fein Wenn Label1.BackStyle = fmBackStyleOpaque Dann Label1.BackStyle = fmBackStyleTransparent Sonst Label1.Backstyle = fmBackStyleOpaque End If End Sub ' –

+0

@StevenMartin ich es bei jeder seiner Eigenschaften bin Löschen durch den Benutzer das letzte Mal bei der Arbeit mit der Arbeitsmappe geändert. Diese Eigenschaften sind wesentlich für das, was ich erreichen möchte (z. B. Transparenz, Position usw.). Ich mache es neu, damit ich es wieder benutzen kann. In Bezug auf Ihren Test können Sie nicht auf das SelectionChange-Ereignis der Zellen zugreifen, da das Label die genannten Zellen abdeckt (so dass ich MouseMove, MouseDown-Ereignis _auf dem Raum_ dieser Zellen verwenden kann (nicht die Zellen an sich) ... wenn du weißt, was ich meine –

+0

@StevenMartin Oh, und noch eins: wie ich in meinem Post gesagt habe, ist die Backstyle-Eigenschaft des Labels ** bereits ** fmBackStyleTransparent. Es ist nur, dass das Label nicht transparent ist, Wie die Eigenschaft zeigt, sollte es sein –

Antwort

0

Alles, was Sie nach dieser Zeile tun müssen:

MapLabel.Object.BackStyle = fmBackStyleTransparent

setzen Sie diese Zeile:

ActiveSheet.Shapes (MapLabel.Name) .Fill.Transparency = 1

Ich hoffe, ich geholfen.

P.S. Wenn Sie eine Erklärung benötigen, werde ich meine Antwort bearbeiten.

+0

Ich testete dies auf das vereinfachte Beispiel in meiner Frage und es funktionierte, aber nur, wenn man nicht auf die Oberfläche des Etiketts klickte. In meinem tatsächlichen Code hatte ich dieses Problem jedoch bereits von Anfang an gelöst, mit einem Private Sub MapLabel_Click() Sheet2.MapLabel.Visible = Falsch Sheet2.MapLabel.Visible = True End Sub, so werde ich markieren dies als Antwort, da es genau das tut, was ich wollte. Der einzige Nachteil ist, dass die Antwort etwas spät kam, aber später besser als nie. Vielen Dank. –

+0

Zunächst einmal alles, was Sie begrüßen. Ja, Sie haben Recht, wenn Sie auf das Objekt klicken, verlieren Sie die Transparenz. Und Ihre Lösung ist der beste Weg, um das Objekt zu aktualisieren. –

-1

Ich hatte das gleiche Problem wie Sie aber in Word. Die Lösung war für mich folgendes zu tun:

Im Design-Modus:

  1. Rechtsklick auf das Objekt
  2. Navigieren Sie zu Switch to automatic form/Image>Wrapping>In front of the text
  3. In ein leeres Bild zu Ihrem Label
+0

Vielen Dank für Ihre Lösung - vielleicht hilft es anderen. In meinem Fall ist das Problem leider in Excel aufgetreten, und wenn es versucht wurde, es programmatisch im Code zu tun. Wie ich bereits sagte, funktioniert es im Design-Modus - sogar in Excel - einwandfrei. Nicht in Code obwohl ... –

+0

Ja, ich habe versucht, dies zu tun, tut mir leid .. es funktioniert nicht in Excel. Die Eigenschaften für das Textfeld OLEObject hat nicht die Option, ein Hintergrundbild zu setzen: c (Ich habe ein transparentes PNG in GIMP, aber es gibt keine wo es in das Formular laden) – Reverus