Определить, какая кнопка была нажата? - PullRequest
0 голосов
/ 13 июля 2009

Мне интересно, есть ли простой способ для макроса Word определить, какая кнопка была нажата? У меня есть шаблон документа с несколькими кнопками, которые все должны запускать макрос. Дело в том, что я хочу создать ОДИН макрос, который вызывается в каждой кнопке. Я не хочу тонны макросов для каждой кнопки.

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

Полный макрос уже готов, мне просто нужно знать эту последнюю вещь, если у кого-нибудь есть информация о том, как это сделать? :) Заранее спасибо!

ОБНОВЛЕНИЕ: это код на данный момент

Private Sub ImageButton1_Click () PicturePlaceholder ImageButton1 End Sub

Private Sub ImageButton2_Click () PicturePlaceholder ImageButton2 End Sub

Public Sub PicturePlaceholder(ByVal oButton As CommandButton)    
Dim oShape As Word.Shape
Dim Dlg As Office.FileDialog
Dim strFilePath As String
Dim oDoc As Document
Dim rgePlace As Range
Dim buttonHeight As String
Dim buttonWidth As String

Set Dlg = Application.FileDialog(msoFileDialogFilePicker)
Set oDoc = ActiveDocument


Set rgePlace = Selection.Range.Fields(1) _
.Result.Paragraphs(1).Range

Response = MsgBox("Do you want to delete the button/Picture?", vbYesNoCancel, "Do you want an image here?")
If Response = vbYes Then rgePlace.Fields(1).Delete
If Response = vbCancel Then Exit Sub
If Response = vbNo Then

With Dlg
.AllowMultiSelect = False
If .Show() <> 0 Then
strFilePath = .SelectedItems(1)
End If
End With

If strFilePath = "" Then Exit Sub
Set oShape = oDoc.Shapes.AddPicture(FileName:=strFilePath, _
LinkToFile:=False, SaveWithDocument:=True, _
Anchor:=rgePlace)
With oShape
.Height = oButton.Height
.Width = oButton.Width
End With

rgePlace.Fields(1).Delete


End If
End Sub

Ответы [ 5 ]

3 голосов
/ 14 июля 2009

ОК, значит, они CommandButton в документе.

В этом случае вы ничего не можете сделать - вам нужно иметь обработчики с именами Button1_Click, Button2_Click и т. Д. (Или какими бы ни были названия кнопок).

Однако вы можете сделать что-то вроде этого:

Private Sub Button1_Click(...)
    DoStuff Button1
End Sub

Private Sub Button2_Click(...)
    DoStuff Button2
End Sub

Private Sub DoStuff(ByVal oButton As CommandButton)
    ' All your shared code goes here
    MsgBox oButton.Caption
End Sub

См. Также эту техническую заметку о том, как создавать кнопки в коде.


РЕДАКТИРОВАТЬ : обновлено, чтобы передать ссылку CommandButton, чтобы общая функция могла получить доступ к свойствам кнопки.


РЕДАКТИРОВАТЬ 2 : обновлено для отображения полного кода с использованием InlineShapes. Обратите внимание, что это больше не передается объекту Button, поскольку ширина / высота кнопки может быть получена непосредственно из поля.

Private Sub CommandButton1_Click()
    PicturePlaceholder
End Sub

Private Sub CommandButton2_Click()
    PicturePlaceholder
End Sub

Public Sub PicturePlaceholder()

    ' Get the selected field, which must be a button field

    Dim oField As Field
    Set oField = Selection.Fields(1)

    Debug.Assert oField.Type = wdFieldOCX


    ' Ask the user what he wants to do

    Select Case MsgBox("Do you want to delete the button/Picture?", vbYesNoCancel, "Do you want an image here?")

        Case vbCancel
            Exit Sub

        Case vbYes
            oField.Delete
            Exit Sub

    End Select


    ' Get the filename of the picture to be inserted

    Dim strFilePath As String

    With Application.FileDialog(msoFileDialogFilePicker)

        .AllowMultiSelect = False

        If .Show() <> 0 Then
            strFilePath = .SelectedItems(1)
        End If

    End With

    If strFilePath = "" Then
        Exit Sub
    End If


    ' Figure out where to insert the picture, and what size to make it

    Dim oRange As Range
    Set oRange = oField.Result

    Dim sglWidth As Single
    sglWidth = oField.InlineShape.Width ' oButton.Width

    Dim sglHeight As Single
    sglHeight = oField.InlineShape.Height ' oButton.Height


    ' Delete the button field

    oField.Delete


    ' Insert and resize the picture

    Dim oInlineShape As Word.InlineShape
    Set oInlineShape = oRange.InlineShapes.AddPicture(FileName:=strFilePath, LinkToFile:=False, SaveWithDocument:=True, Range:=oRange)

    With oInlineShape
        .Width = sglWidth
        .Height = sglHeight
    End With

End Sub

РЕДАКТИРОВАТЬ 3 : Обновлено в соответствии с просьбой использовать Shapes вместо InlineShapes. (И CommandButton, и вставленная картинка теперь являются Shapes).


Private Sub CommandButton1_Click()
    PicturePlaceholder
End Sub

Private Sub CommandButton2_Click()
    PicturePlaceholder
End Sub

Public Sub PicturePlaceholder()

    ' Get the selected shape, which must be a button shape

    Debug.Assert Selection.Type = wdSelectionShape

    Dim oButtonShape As Shape
    Set oButtonShape = Selection.ShapeRange(1)


    ' Ask the user what he wants to do

    Select Case MsgBox("Do you want to delete the button/Picture?", vbYesNoCancel, "Do you want an image here?")

        Case vbCancel
            Exit Sub

        Case vbYes
            oButtonShape.Delete
            Exit Sub

    End Select


    ' Get the filename of the picture to be inserted

    Dim strFilePath As String

    With Application.FileDialog(msoFileDialogFilePicker)

        .AllowMultiSelect = False

        If .Show() <> 0 Then
            strFilePath = .SelectedItems(1)
        End If

    End With

    If strFilePath = "" Then
        Exit Sub
    End If


    ' Insert the picture at the same size/position

    Dim oPictureShape As Shape
    Set oPictureShape = ActiveDocument.Shapes.AddPicture _
        ( _
        FileName:=strFilePath, _
        LinkToFile:=False, _
        SaveWithDocument:=True, _
        Left:=oButtonShape.Left, _
        Top:=oButtonShape.Top, _
        Width:=oButtonShape.Width, _
        Height:=oButtonShape.Height, _
        Anchor:=oButtonShape.Anchor _
        )


    ' Copy across the button shape formatting

    oButtonShape.PickUp
    oPictureShape.Apply


    ' Copy across other layout details

    oPictureShape.LayoutInCell = oButtonShape.LayoutInCell

    oPictureShape.LockAnchor = oButtonShape.LockAnchor

    oPictureShape.RelativeHorizontalPosition = oButtonShape.RelativeHorizontalPosition
    oPictureShape.RelativeVerticalPosition = oButtonShape.RelativeVerticalPosition

    oPictureShape.WrapFormat.Type = oButtonShape.WrapFormat.Type
    oPictureShape.WrapFormat.Side = oButtonShape.WrapFormat.Side
    oPictureShape.WrapFormat.DistanceTop = oButtonShape.WrapFormat.DistanceTop
    oPictureShape.WrapFormat.DistanceLeft = oButtonShape.WrapFormat.DistanceLeft
    oPictureShape.WrapFormat.DistanceBottom = oButtonShape.WrapFormat.DistanceBottom
    oPictureShape.WrapFormat.DistanceRight = oButtonShape.WrapFormat.DistanceRight
    oPictureShape.WrapFormat.AllowOverlap = oButtonShape.WrapFormat.AllowOverlap


    ' Delete the button shape

    oButtonShape.Delete

End Sub
1 голос
/ 13 июля 2009

Полагаю, вы имеете в виду, что кнопка является кнопкой панели команд (она же кнопка на панели инструментов).

Если это так, вы можете использовать Application.CommandBars.ActionControl, чтобы получить ссылку на нажатую кнопку. Оттуда вы можете просмотреть заголовок, тег или что-то еще.

0 голосов
/ 30 апреля 2015

Размещение следующего в различных событиях click / got_focus / change кнопок ActiveX и текстовых полей работает для меня:

    MsgBox ThisDocument.ActiveWindow.Selection.Fields.Item(1).OLEFormat.Object.Name
0 голосов
/ 10 марта 2010

У вас может быть кнопка в Vba для передачи аргументов при вызове макроса, который принимает аргументы. Например, если у вас есть функция, называемая тестом функции (x как строка) тогда кнопка, которая вызывает макрос, будет иметь синтаксис onclick («sheetx! test», «что угодно»). Таким образом, вы можете использовать общий макрос для вызова. Надеюсь, это поможет вам.

0 голосов
/ 13 июля 2009

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

...