2009-06-25 11 views
4

Ich habe ein Vorlagedokument, das mehrere Abschnitte und einige Tabellen enthält. Die Sache ist, ich versuche, eine Drop-Down-Liste innerhalb der Zellen in der Tabelle einzufügen. Und damit eine Dropdown-Liste funktioniert, muss das Dokument geschützt werden. Aber wenn ich den gesamten Bereich, in dem sich die Tabelle befindet, beschütze, ist die gesamte Tabelle geschützt.Word VBA - wenn der Cursor in Zelle/Lesezeichen ist - Code

Also fragte ich mich, ob es eine Möglichkeit gibt, einen Makrocode auszuführen, WENN der Benutzer auf die Dropdown-Liste klickt? Der Code würde dann das Dokument schützen, wodurch das Steuerelement tatsächlich funktioniert, und dann eine Auswahl treffen. Wenn der Benutzer außerhalb des Feldes klickt, sollte das Dokument ungeschützt werden.

Ist das möglich?

Antwort

0

Anstatt eine Dropdown-Box aus der Formularsymbolleiste zu verwenden, können Sie eine ComboBox aus der Symbolleiste verwenden. Dann könnten Sie das Click-Ereignis ComboBox verwenden. Sie können auch Code an das GotFocus/LostFocus-Ereignis anhängen, wenn der Benutzer außerhalb von ComboBox klickt.

+0

Nun, die Sache ist, dies ist eine Vorlage für einen Bericht und das Dropdown-Menü soll den Benutzer die Stufe der Konfidenz wählen lassen. Und was immer der Benutzer wählt, sollte als einfacher Text im Dokument enden. Und die Drop-Down-Liste sollte auch beim Drucken nicht sichtbar sein. –

5

Es gibt tatsächlich ein WindowSelectionChange-Ereignis in Word VBA, das Sie verwenden können. Es wird in der Word VBA-Hilfedatei unter "Verwenden von Ereignissen mit dem Anwendungsobjekt" beschrieben.

Der Trick ist, Ihre Anwendung auf eine Variable in einem Klassenmodul zuweisen (ich habe den Namen Mine EventClassModule) mit dem Withevent Stichwort:

Public WithEvents App As Word.Application 

Dann in Ihrem normalen Öffnen des Dokuments Ereignisse, Sie die initialisieren Variable auf die aktuelle Anwendung:

Dim oEvents As New EventClassModule 
Private Sub Document_Open() 
    Set oEvents.App = Word.Application 
End Sub 

Zurück im EventClassModule, verwenden Sie das Window Ereignis zu überprüfen, ob eine Tabelle ausgewählt ist:

Private Sub App_WindowSelectionChange(ByVal Sel As Selection) 
    If Sel.Information(wdWithInTable) And ThisDocument.ProtectionType = wdNoProtection Then 
     ThisDocument.Protect wdAllowOnlyFormFields 
    ElseIf ThisDocument.ProtectionType <> wdNoProtection Then 
     ThisDocument.Unprotect 
    End If 
End Sub 

Dieser Code wird immer dann aufgerufen, wenn der Cursor den Standort ändert. Ich habe es getestet und es ist ein wenig knifflig (das Objekt oEvents neigt aus irgendeinem Grund dazu, nicht initialisiert zu werden), aber hoffentlich wird dies der Anfang für Ihre Lösung sein.

+0

Nicht sicher, ob ich richtig verstanden habe. Wo soll die "Öffentliche WithEvents App als Word.Application" sein? Ich habe den Code in der Mitte in das Document_Open-Ereignis eingefügt. Und ich habe ein EventClassModule mit dem unteren Code erstellt, wie Sie angegeben haben. Aber die erste Zeile? Wo soll es hingestellt werden? Und eine andere Sache, ist es möglich, den Code nur auszulösen, wenn der Cursor ein bestimmtes Lesezeichen wählt? Weil die Dropdown-Felder tatsächlich einen Lesezeichen-Namen "Dropdown1" und "Dropdown2" haben. Nur diese sollten (vorzugsweise) den Code auslösen, um das Dokument zu schützen. :) –

+0

Ziemlich sicher, dass ich das richtig gemacht habe, aber die WindowSelectionChange scheint überhaupt nicht zu schießen. Das ist wirklich eine Schande. –

+1

Die "Öffentliche WithEvents App als Word.Application" geht an der Spitze des Klassenmoduls EventClassModule - es ist eine Membervariable der Klasse. So instanziieren Sie im Document_Open-Ereignis die Klasse und setzen die Elementvariable auf die aktuelle Anwendung. (Ich weiß nicht, warum sie so kompliziert sind) – Emily

Verwandte Themen