2009-07-13 9 views
0

Ich frage mich, ob es einen einfachen Weg für ein Word-Makro gibt zu bestimmen, welche Taste gerade gedrückt wurde? Ich habe eine Dokumentvorlage mit mehreren Schaltflächen, die alle ein Makro auslösen sollten. Die Sache ist, ich möchte ein Makro erstellen, das in jeder Taste aufgerufen wird. Ich will nicht Tonnen von Makros für jeden Knopf.Bestimmen Sie, welche Taste gedrückt wurde?

Nun, dieses Makro, wenn die Taste gedrückt wird, fügt ein Bild ein und die Größe dieses Bildes wird basierend auf der Größe der Tasten ausgewählt. Das heißt, das endet als Bildplatzhalter. Aber ich möchte das Makro dynamisch schreiben, so dass der gleiche Code für jede Schaltfläche funktioniert, ohne mehr als nur das Makro aufzurufen.

Das vollständige Makro ist bereits fertig, ich muss nur noch eine letzte Sache wissen, wenn jemand Informationen darüber hat, wie dies zu erreichen ist? :) Danke im Voraus!

UPDATE: Dies ist der Code zur Zeit

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 

Antwort

3

OK, also sind sie CommandButton s im Dokument.

In diesem Fall gibt es nichts, was Sie tun können - Sie müssen Handler Button1_Click, Button2_Click usw. (oder was auch immer die Tastennamen sind) haben.

Allerdings können Sie etwas tun:

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 

Siehe auch this tech note, wie Sie Ihre Tasten in Code erstellen.


EDIT: aktualisiert CommandButton Referenz zu übergeben, so dass die gemeinsam genutzte Funktion auf die Schaltfläche Eigenschaften zugreifen kann.


EDIT 2: aktualisiert vollständige Code mit Inline zu zeigen. Beachten Sie, dass das Button-Objekt nicht mehr übergeben wird, da die Breite/Höhe der Schaltfläche direkt aus dem Feld abgerufen werden kann.

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 

EDIT 3: Aktualisierte als Shapes angefordert eher zu verwenden als Inline.(Sowohl der CommandButton als auch das eingefügte Bild sind jetzt 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 
+0

Ok danke! :) Aber wie extrahiere ich den Namen des Buttons aus dem geteilten Code? Zum Beispiel, die einzige Sache, die ich benötige, ist, die Höhe und Breite der geklickten Schaltfläche zu extrahieren. –

+0

Ich habe die Antwort bearbeitet, um zu zeigen, wie Sie die Schaltfläche als Parameter an die gemeinsame Funktion übergeben und somit auf ihre Eigenschaften zugreifen können. –

+0

Wow, das funktioniert ganz gut! :) Aber könnten Sie einen kurzen Blick auf den Code werfen, den ich im ersten Post aktualisiert habe? Ich sehe, dass mein Code Bilder als oShapes einfügt, so dass sie viel einfacher bewegt werden können. Aber die Schaltfläche ist tatsächlich inline, also ist die Position, in der das Bild endet, die genaue Position der Schaltfläche. Ist es möglich, den Code leicht zu ändern, damit die Schaltflächen auch oShapes sind? Probieren Sie den Code aus und sehen Sie selbst, es funktioniert, aber das Bild endet oben auf dem Text im Dokument, da es oShape und nicht inLine-Form ist, wie die Schaltfläche war, bevor es gelöscht wurde. –

0

Sie könnten Ihr Basismakro in ein separates Unterverzeichnis setzen und dann das Makro aus jedem Klick der Schaltfläche gerade aufrufen t, übergibt als Parameter die gewünschte Größe. Dann ist der einzige Code, den Sie in den Schaltflächen haben, der Aufruf des Basis-Sub.

1

Ich nehme an, Sie meinen, dass die Schaltfläche eine Befehlsleistenschaltfläche ist (auch als Symbolleistenschaltfläche bezeichnet).

Wenn ja, können Sie Application.CommandBars.ActionControl verwenden, um einen Verweis auf die Schaltfläche zu erhalten, auf die geklickt wurde. Von dort können Sie die Beschriftung, das Tag oder was auch immer überprüfen.

+0

Hallo, ok so habe ich versucht, diese aber es scheint nicht zu funktionieren. Ich verstand nicht, warum ich keine Infos zurück aus dem Makro bekommen haben, so habe ich versucht, diesen Code: Öffentliche Unter PicturePlaceholder() Wenn Application.CommandBars.ActionControl ist Nothing Then Msgbox „Makro wurde nicht gestartet von einer Schaltfläche“, vbInformation Else Msgbox‚Makro von einer Schaltfläche‘, vbInformation & Application.CommandBars.ActionControl.Caption End if und dann rief ich dieses Makro aus jeder Taste im Dokument gestartet wurde. Aber trotzdem scheint ActionControl jedes Mal "Nichts" zu sein. Warum ist das? Oh, und das sind Knöpfe im Dokument. –

+1

Dies sind keine Symbolleisten-Schaltflächen, sondern Befehlsschaltflächen, die über den Entwurfsmodus eingefügt werden. –

0

Sie auf eine Schaltfläche in Vba haben Argumente zu übergeben, wenn es um das Makro die Argumente nimmt aufruft. Für zB: Wenn Sie eine Funktion haben, die als Funktionstest (x als String) aufgerufen wird, dann wird die Schaltfläche, die das Makro aufruft, eine Syntax wie onclick ("blech x! Test", "was auch immer") haben. Auf diese Weise können Sie entweder ein generisches Makro aufrufen lassen. Hoffe das hilft dir.

0

die folgenden in den verschiedenen Klick Platzierung/got_focus/Änderungsereignisse von ActiveX-Buttons und Textbox für mich funktioniert:

MsgBox ThisDocument.ActiveWindow.Selection.Fields.Item(1).OLEFormat.Object.Name