2017-02-02 26 views
0

Я создал кнопку activex для трекера. Мне было поручено построить на работе, кнопка activex отлично работала, но там были бесконечные проблемы совместимости и разрешения, когда я его отправил. Решил сделать вместо него макрос. Предполагается, что это простая кнопка, которая при нажатии на нее вводит текущее время и дату в активную ячейку. Это работает, проблема в том, что он больше не плавает, как у меня, когда он был кнопкой activex, он не следует за активной ячейкой на странице. Кроме того, поскольку он неактивен, он не моделирует нажатие кнопки, которую я пытался ввести в код, и все, что выглядит, но нет депрессии, когда я нажимаю на нее. Вот что я до сих пор.Получил кнопку в Excel, которая работала как элемент управления ActiveX, пришлось переключиться на фигуру, теперь она не работает 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

У вас есть возможность установить форму на странице? Перейдите на вкладку разработчика и нажмите кнопку формы вместо кнопки activex. Щелкните правой кнопкой мыши, чтобы установить свойства, и вы можете позволить ему перемещаться с ячейками или нет. И вы можете щелкнуть правой кнопкой мыши, чтобы выбрать суб, когда он щелкнут. –

+0

Я пробовал это, но это не работало. Команда, в которой я попала, чтобы получить рекомендацию для формы с поддержкой макроса, говорит, что может вызвать множество тех же проблем, с которыми я столкнулся с кнопкой activex. Независимо от того, я хотел бы знать, как заставить эту работу работать с макросами, включая верхнюю часть кода, которая должна позволить кнопке показывать нажатую кнопку при нажатии – Cdhippen

+0

Мне нравится использовать всплывающее окно правой кнопки мыши для запуска специальных функций. У Ron DeBruin есть отличный источник кода для этого. http://www.rondebruin.nl/win/s6/win002.htm. Вы добавляете свою функцию в обычное контекстное меню правой кнопкой мыши, назовите ее как «Вставить дату», затем щелкните правой кнопкой мыши по любой ячейке и ярлык появится во всплывающем окне. Единственным недостатком является то, что вы должны убедиться, что рабочая книга удаляет его при закрытии. Простой код onClose сделает это. –

ответ

0

Объекты формы не имеют методов, аналогичных объекту ActiveX. Они также существуют только в книге Excel, а не внутри VB, поэтому вы не можете просто ссылаться на них, создавая метод с тем же именем, что и объект. Вы можете объединить эти два подтипа в один, затем назначьте это под кнопку, щелкнув правой кнопкой мыши по нему и используя параметр «Назначить макрос ...», чтобы установить для этого юга.

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 

Что касается получения его следовать за листом, вам необходимо получить действительную ссылку на объект формы первой (этот код должен быть внутри модуля для листа вашей кнопки находится в). 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

Спасибо!Я попробую это, когда я получу завтра – Cdhippen

+0

Когда я пробую этот метод, все выглядит хорошо для меня, кроме следующей части листа, теперь у меня есть макрос, назначенный на «ButtonClick» вместо «RectangleRoundedCorners1», и когда я компилирую это, я получаю сообщение об ошибке: «Sub или функция не определена» по адресу: Set shbutton = Shapes («rectangleRoundedCorners1») ссылки на слово «Shapes» – Cdhippen

+0

Я также попытался добавить второй макрос под названием rectangleroundedcorners1 вручную, но это только создает sub с этим именем и не связывает его с объектом. Я думаю, что проблема в том, что я не уверен, как связать этот второй бит кода с объектом. – Cdhippen

0

Изменение в форме происходит настолько быстро, что человеческий глаз почти не видно его. Я поставил цикл for, чтобы изменения были видимыми достаточно долго, чтобы пользователь оценил нажатие клавиши.

Вставьте следующий код в обычный модуль, а не в ваш рабочий лист. Удалите весь код вашего рабочего листа, связанный с этой формой.

Затем щелкните правой кнопкой мыши по вашей фигуре и выберите «Присвоить макрос» - этому в обычном модуле. Я не знаю, как заставить его оставаться на месте, когда пользователь прокручивается, но, по крайней мере, это устранит вашу визуальную проблему.

Я также добавил изменение даты в ячейку A1.

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 

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

  • Нет связанных вопросов^_^