2016-07-31 1 views
1

Я хочу поместить прозрачную метку поверх листа в Excel, чтобы я мог использовать событие MouseMove метки для «рисования ячеек» (также изменив их цвет заливки и т. Д.) Щелчком мыши/перетаскиванием/и т. д. - так как я не могу сделать это в самих камерах.Как сделать ярлык Excel ActiveX прозрачным ... во время выполнения?

Теперь все работает отлично, за исключением того, что я не могу сделать ярлык прозрачным во время выполнения (ака в VBA) ... в то время как, делая то же самое в режиме разработки, работает так, как ожидалось. В частности, у меня есть код (более или менее):

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 

Так, в словах, я сначала удалить ярлык с именем «MapLabel», а затем воссоздать его (приведенный выше код переходит в «INIT» Sub). Все строки кода, кроме отмеченного, дают желаемый результат. Маркированный один делает, устанавливает свойство BackStyle метки на fmBackStyleTransparent ... но он не действительно делает метку прозрачной. Это разочаровывает, потому что это тот же подход, который работает безупречно во время разработки!

У вас есть решение этой проблемы? Я читал о решении подобных проблем, объявляя метку как MsForms.Label или как Control, но объект листа не имеет этих свойств, плюс, есть гораздо больше свойств ярлыков, которые можно установить с помощью OLEObject, чем с помощью MsForms .Label или Control.

+0

Почему вы его удаляете и воссоздаете? как тест он отлично работает для меня с лейблом ACTIVEX, во время выполнения он изменяется от прозрачного до непрозрачного с помощью 'Private Sub Worksheet_SelectionChange (ByVal Target As Range) Если Label1.BackStyle = fmBackStyleOpaque Тогда Label1.BackStyle = fmBackStyleTransparent Else Label1.BackStyle = fmBackStyleOpaque End If End Sub ' –

+0

@StevenMartin Я удалить его в случае, если какой-либо из его свойств было изменено пользователем в последний раз при работе с книгой. Эти свойства необходимы для того, что я хочу достичь (например, прозрачность, положение и т. Д.). Воссоздать его, чтобы я мог использовать его снова, очевидно. Что касается вашего теста, вы не сможете получить доступ к событию SelectionChange для ячеек, поскольку эта метка будет охватывать указанные ячейки (чтобы я мог использовать MouseMove, событие MouseDown _ в пространстве_ этих ячеек (а не в самих ячейках) ... если вы знаете, что я имею в виду. –

+0

@StevenMartin О, и еще одно: как я сказал в своем сообщении, свойство Backstyle метки ** уже есть ** fmBackStyleTransparent. Просто это ярлык не прозрачен, поскольку свойство указывает, что это должно быть. –

ответ

0

Все, что вам нужно сделать после этой строки:

MapLabel.Object.BackStyle = fmBackStyleTransparent

положить эту линию:

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

Я надеюсь, что помог.

P.S. Если вам нужно объяснение, я отредактирую свой ответ.

+0

Я проверил это на упрощенном примере в моем вопросе и это сработало, но только когда не нажимайте на поверхность этикетки. Тем не менее, в моем фактическом коде у меня была проблема, которая была решена с самого начала, с помощью Private Sub MapLabel_Click() Sheet2.MapLabel.Visible = False Sheet2.MapLabel.Visible = True End Sub, поэтому я буду отмечать это как ответ, поскольку он делает именно то, что я хотел. Единственное неудобство в том, что ответ пришел немного поздно, но потом, лучше позже, чем никогда. Спасибо. –

+0

Прежде всего, приветствую вас. Да, вы правы, когда вы нажимаете на объект, вы теряете прозрачность. И ваше решение - лучший способ обновить объект. –

-1

У меня была такая же проблема, как у вас, но в Word. Решение для меня было сделать следующее:

В режиме конструктора:

  1. правой кнопкой мыши на объекте
  2. Перейдите Switch to automatic form/Image>Wrapping>In front of the text
  3. Добавить пустое изображение на наклейке
+0

Спасибо, что поделились своим решением - возможно, это помогает другим. К сожалению, в моем случае проблема возникла в Excel и при попытке сделать это программно, в коде. Как я уже говорил выше, при работе в режиме дизайна - даже в Excel - он работает безупречно. Не в коде, хотя ... –

+0

Да, я пытался это сделать, извините .. он не работает в Excel. Свойства для текстового поля OLEObject не имеют возможности установить фоновое изображение: c (я сделал прозрачный png в GIMP, но нет места, где его можно загрузить в форму) – Reverus

Смежные вопросы