VBA-Word, Tastenkombination setzen/aufheben

Moin!

Danke das Du meinen Hilferuf gehört hast!
Ich möchte beim Öffnen/Aktivieren einer Word-Datei erreichen das die Tastenkombination für [Strg + d] gesetzt und beim Deaktivieren der selben Datei wieder aufgehoben wird.
In Excel wäre das Setzen der Code [Application.OnKey „^{d}“, „Navigator_aktivieren“] und für das Aufheben [Application.OnKey „^{d}“] aber leider ist das beim Word-VBA anders und damit kenne ich mich nicht aus.
Hintergrund
Über ein Menü in Excel lassen sich mehrere Word-Dateien öffnen bzw. aktivieren wenn sie bereits geöffnet sind. In den Word-Dateien kommt man mit [Strg + d] wieder zurück in das Excelmenü. Wenn nur eine der entsprechenden Word-Datei geöffnet ist funktioniert das Hin und Zurück einwandfrei aber wenn mehr als eine geöffnet ist dann leider nicht mehr.

Hast Du eine Idee welcher Code dafür zuständig ist?
Im voraus vielen Dank!
Frank

Hallo Frank,

Ich möchte beim Öffnen/Aktivieren einer Word-Datei erreichen
das die Tastenkombination für [Strg + d] gesetzt und beim
Deaktivieren der selben Datei wieder aufgehoben wird.

kopiere den nachstehenden Code in „Thisdokoment“ der Doc.
Die Tastenkombi wirkt dann nur in dieser einen Doc.

Gruß
Reinhard

Private Sub Document\_Open()
With Application
 .CustomizationContext = ThisDocument
 .KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyControl, wdKeyD) \_
 , KeyCategory:=wdKeyCategoryCommand \_
 , Command:="Navigatortest"
 End With
End Sub

Hallo Reinhard,

was soll ich bloß ohne Dich machen, vielen Dank!

kopiere den nachstehenden Code in „Thisdokoment“ der Doc.

Habe ich gemacht, getestet und funktioniert auch bei mir.
Habe auch mal mittels Recorder für [Strg+d] etwas anderes machen lassen, also überschrieben. Gespeichert, neu aufgerufen und alles bestens.
Jetzt bitte ich Dich mir noch zwei Dinge zu verraten.

  1. Wie lautet der Code um die Tastenkombi zurück zu setzten, sodass für [Strg+d] wieder die normale Word-Funktion ausgeführt wird. Ich will damit verhindern Word dauerhaft zu verbiegen. Habe es mit wdKey (ohne D) und mit wdKey"" versucht, voll daneben.
  2. Wie lautet der Prozedurname analog Excel
    Private Sub Workbook_Activate(), ich hab es Versucht mit
    Private Sub Document_Activate() aber funktioniert nicht.

Bis dann
Frank

Hallo Frank,

kopiere den nachstehenden Code in „Thisdokoment“ der Doc.

Habe ich gemacht, getestet und funktioniert auch bei mir.
Habe auch mal mittels Recorder für [Strg+d] etwas anderes
machen lassen, also überschrieben. Gespeichert, neu aufgerufen
und alles bestens.

du hast ein makro aufgezeichnet, dabei hast du die Möglichkeit dieses neue makro einer Tastenkombi zuzuweisen. Dann hast du eins aufgezeichnet.
Dann in die Hülle des aufgezeichneten Makros deine Codezeilen eingefügt.
Meinst du das mit deiner Aussage?

In Word kann man auch nachträglich nicht wie ich per Vba-Code sondern manuell über Anpassen einem makro eine Tastenkombination zuweisen.

  1. Wie lautet der Code um die Tastenkombi zurück zu setzten,
    sodass für [Strg+d] wieder die normale Word-Funktion
    ausgeführt wird. Ich will damit verhindern Word dauerhaft zu
    verbiegen.

? Ich habe das kurz getestet. Strg+d wirkt nur in dem einen Doc, in anderen nicht.
Wieso soll da Word verbogen sein?

Habe es mit wdKey (ohne D) und mit wdKey""
versucht, voll daneben.

Ja, knapp daneben ist auch voll vorbei *lächel*

Ich habe jetzt nicht gesucht, aber im I-Net wird oft gesagt daß bei MSDN eine Liste der wdKey steht.
Du kannst da nicht beliebig „wdkey“ mit irgendwas erfundenem dahinter benutzen.
Du kannst nur die in der Liste festgelegten wdkey benutzen.

Also
wdkeycontrol für die Taste Ctrl bzw. Strg
wdkeyAlt für die Alttaste
wdkeyD für die D-taste, also das kleine d
usw.

Achja, wie man mittels der gezeigten Prozedur Srtg#d wieder zurücksetzt, k.A. :smile:
Aber sehe auch keinen grund in dem Fall.

  1. Wie lautet der Prozedurname analog Excel
    Private Sub Workbook_Activate(), ich hab es Versucht mit
    Private Sub Document_Activate() aber funktioniert nicht.

Das sind Ereignisprozeduren. Excel, Word kennen nur ihre vorgegeben Ereignisse.
Word kennt bei Thisdocument nur open, new, close.
Gehe mal im Editor entweder in Thisdocument oder DieseArbeitsmappe.
Wähle oberhalb des Modulfeldes je nachdem Workbook oder Document aus.
Rechts davon kannst du dann die Ereignisse auswählen.
Das was du jeweils siehst sind die eingebauten Ereignisprozeduren.
Mehr kannste da nicht machen.

Wenn du nun eine Prozedur haben möchtest, wahrscheinlich zwei, die automatisch abläuft/startet wenn du ein Document aktivierst bzw. deaktivierst so müßte man sich das basteln.
Wenn das geht, glaub ja, weiß grad nicht genau, aber nehme es an daß man das hinkriegt.
Aber noch sehe ich für dich da keinen Bedarf.
Meine Prozedur macht das doch.

Gruß
Reinhard

Hallo Reinhard,

Habe auch mal mittels Recorder für [Strg+d] etwas anderes
machen lassen, also überschrieben. Gespeichert, neu aufgerufen
und alles bestens.

du hast ein makro aufgezeichnet, dabei hast du die Möglichkeit
dieses neue makro einer Tastenkombi zuzuweisen. Dann hast du
eins aufgezeichnet.

Ja und Tastenkombi [Strg+d] zugewiesen, die zuvor für zurück zur Exceldatei galt.

Dann in die Hülle des aufgezeichneten Makros deine Codezeilen
eingefügt.
Meinst du das mit deiner Aussage?

Nein, habe nur mit dem Recorder das Wort „Hallo“ schreiben lassen.
Das wurde dann mit [Strg+d] auch ausgeführt also nicht mehr zurück zur Exceldatei. Dann Worddatei gespeichert und geschlossen.
Danach über Excelmenü wieder aufgerufen und siehe da, mit [Strg+d] wurde wieder wie gewünscht das Excelmenü aufgerufen.
Das war nur eine Erfolgsmeldung über das Funktionieren Deiner Prozedur, mehr wollte ich Dir damit nicht berichten.

  1. Wie lautet der Code um die Tastenkombi zurück zu setzten,
    sodass für [Strg+d] wieder die normale Word-Funktion
    ausgeführt wird. Ich will damit verhindern Word dauerhaft zu
    verbiegen.

? Ich habe das kurz getestet. Strg+d wirkt nur in dem einen
Doc, in anderen nicht.
Wieso soll da Word verbogen sein?

OK, Du hast recht, ich hatte wohl etwas ungewolltes in der Normal.dot,
die habe ich gelöscht und jetzt sehe ich auch das da nichts verbogen wird.

Ich habe jetzt nicht gesucht, aber im I-Net wird oft gesagt
daß bei MSDN eine Liste der wdKey steht.
Du kannst da nicht beliebig „wdkey“ mit irgendwas erfundenem
dahinter benutzen.
Du kannst nur die in der Liste festgelegten wdkey benutzen.

Das ist mir im Prinzip klar aber bevor ich Fragen stelle versuche ich immer erst mal selbst eine Lösung zu finden. Wenn ich in Excel Cells(1,1) = „Moin“ anweise wird das mit Cells(1,1) = „“ rückgängig gemacht. Analog versuchte ich es in Word.

Achja, wie man mittels der gezeigten Prozedur Srtg#d wieder
zurücksetzt, k.A. :smile:
Aber sehe auch keinen grund in dem Fall.

Vielleicht gleich:

  • Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 1], die wird angezeigt und mit Strg+d kehre ich zum Excelmenü zurück, wunderbar!
  • Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 2], die wird angezeigt und mit Strg+d kehre ich zum Excelmenü zurück, super!
  • Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 1]und es wird die Worddatei 2 aufgerufen, schade!
    Daher suche ich nach einer Möglichkeit beim Verlassen einer Worddatei Strg+d zu deaktivieren/zurückzusetzen. Daher Fragte ich …
  1. Wie lautet der Prozedurname analog Excel
    Private Sub Workbook_Activate(), ich hab es Versucht mit
    Private Sub Document_Activate() aber funktioniert nicht.

Das sind Ereignisprozeduren. Excel, Word kennen nur ihre
vorgegeben Ereignisse.
Word kennt bei Thisdocument nur open, new, close.

Jammerschade!

Gehe mal im Editor entweder in Thisdocument oder
DieseArbeitsmappe.
Wähle oberhalb des Modulfeldes je nachdem Workbook oder
Document aus.
Rechts davon kannst du dann die Ereignisse auswählen.
Das was du jeweils siehst sind die eingebauten
Ereignisprozeduren.
Mehr kannste da nicht machen.

Danke, das kannte ich noch nicht.
Man, da ist Excel aber toll ausgestattet und Word ein Waisenknabe!

Wenn du nun eine Prozedur haben möchtest, wahrscheinlich zwei,
die automatisch abläuft/startet wenn du ein Document
aktivierst bzw. deaktivierst so müßte man sich das basteln.
Wenn das geht, glaub ja, weiß grad nicht genau, aber nehme es
an daß man das hinkriegt.

Schön wäre es schon aber ich möchte andererseits nicht der Anlass sein Dir zu viel aufzubürden.
Ich verstehe nicht das man da nichts im Internet findet. Ich kann nicht glauben das ich der Einzige bin der nach so etwas sucht. Für Excel im Zusammenspiel mit Word gibt es schließlich haufenweise Fragen und antworten. Ich las mal „es gibt keine Frage die nicht schon mal gestellt wurde“ und das konnte ich bisher gut nachvollziehen.

Viele Grüße
Frank

Problem gelöst mit trial and error :smile:
Hallo Reinhard,

ich berichtete von dem Problem…

- Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 1], die wird angezeigt
 und mit Strg+d kehre ich zum Excelmenü zurück, wunderbar!
- Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 2], die wird angezeigt
 und mit Strg+d kehre ich zum Excelmenü zurück, super!
- Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 1] und es wird die
 Worddatei 2 aufgerufen, schade!

Daher suche ich nach einer Möglichkeit beim Verlassen einer Worddatei [Strg+d] zu deaktivieren/zurückzusetzen

Ich lernte durch Dich das es in Word-VBA keine Event`s für Aktivierung und Deaktivierung gibt. Und das mit Tricks zu machen gestaltet sich bestimmt schwierig, sonst hättest Du Dich schon gemeldet, wie ich Dich kenne.
Nun habe ich in Deiner Entwicklung folgendes eingebaut, siehe unten #####…

Sub Reinhard\_Datei\_öffnen\_oder\_aktivieren()
 Application.ScreenUpdating = False
 Dim Offen As Boolean
 Const sPathFile As String = "C:\Test.doc" ' 0 Then Set appWord = CreateObject("Word.Application")
 On Error GoTo 0
 appWord.Visible = True
 With appWord
 For Each Doc In .Documents
 If Doc.Name = Mid(sPathFile, InStrRev(sPathFile, "\") + 1) Then
 Offen = True
 Exit For
 End If
 Next Doc
 If Not Offen Then .Documents.Open sPathFile
 '######## neu #########
 Datei = Right(sPathFile, 13) 'Extraktion Dateiname aus sPathFile
 .Documents(Datei).Activate
 '######################
 .Activate
 End With
 Application.ScreenUpdating = True
End Sub

… und jetzt klappt es, hurra!

Falls Du inzwischen schon verbissen gekämpft haben solltest an dem Ersatz für die nicht vorhandenen Events im Word VBA, so wäre es natürlich immer noch auch für mich hochinteressant zu wissen ob das geht oder nicht aber für meine Anwendung wäre es nicht mehr nötig.

Du kannst entscheiden ob Du das noch weiter verfolgen willst oder nicht und lasse es mich bitte wissen, vielen Dank im voraus.

Bis dann
Frank

Ereignismakro bei De- Aktivierung eines Dokuments
Hallo Frank,

ich berichtete von dem Problem…

  • Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 1],
    die wird angezeigt
    und mit Strg+d kehre ich zum Excelmenü zurück, wunderbar!
  • Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 2],
    die wird angezeigt
    und mit Strg+d kehre ich zum Excelmenü zurück, super!
  • Ich klicke im Excelmenü auf die Schaltfläche [Worddatei 1]
    und es wird die
    Worddatei 2 aufgerufen, schade!

kann ich nicht nachvollziehen, was genau meinst du mit Excel Menu?
Lade doch mal die Excel-Mappe hoch, wichtig sind die vorhandenen Makros und ggfs. Aufrufschaltflächen.
Zelleninhalte sind uninteressant *denk*
Desgleichen mit Worddatei 1.
Hochladen mit fileupload o.ä., s. FAQ:2606

Daher suche ich nach einer Möglichkeit beim Verlassen einer
Worddatei [Strg+d] zu deaktivieren/zurückzusetzen

Das verstehe ich immer noch nicht. Beim Verlassen des Dokuments wird doch Strg+d ungültig, es wirkt nur in dem einen Dokument wo der Code steht.
Egal, das nachstehende Klassenmodul reagiert auf De- oder Aktivierung des Fensters von Word-Dokumenten.

Im VB-Editor, Einfügen—Klassenmodul, dortrein diesen Code:

Option Explicit

Public WithEvents oApp As Word.Application

Private Sub oApp_WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
If Doc.Name = ThisDocument.Name Then Call Ein
End Sub

Private Sub oApp_WindowDeactivate(ByVal Doc As Document, ByVal Wn As Window)
If Doc.Name = ThisDocument.Name Then Call Aus
End Sub

In ein Standardmodul, Modul1 o.ä.:

Option Explicit
Public x As New Klasse1

Sub Navigatortest()
MsgBox „Huhu“
End Sub

Sub Ein()
With Application
 .CustomizationContext = ThisDocument
 .KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyControl, wdKeyD) \_
 , KeyCategory:=wdKeyCategoryCommand \_
 , Command:="Navigatortest"
End With
End Sub

Sub Aus()
With Application
 .CustomizationContext = ThisDocument
 .KeyBindings.ClearAll
End With
End Sub

In das Modul „ThisDocument“:

Option Explicit

Private Sub Document_Open()
Set x.oApp = Word.Application
Call Ein
End Sub

Gruß
Reinhard

Hallo Reinhard,

Nur kurze Rückinfo, ich habe gerade andere (berufliche) Prioritäten wahr zu nehmen, ich antworte später ausführlicher.

… das nachstehende Klassenmodul reagiert auf De- oder
Aktivierung des Fensters von Word-Dokumenten.

Wenn Du das wirklich hin bekommen hast, falle ich vom Glauben ab!
Muss ich unbedingt bei mir testen aber wie gesagt später, wahrscheinlich erst morgen gegen Abend.

Bis dann und Grüße
Frank

Hallo Reinhard,

Lade doch mal die Excel-Mappe hoch, wichtig sind die
vorhandenen Makros und ggfs. Aufrufschaltflächen.

Habe ich gemacht (sie unten) aber nur zum Verständnis meiner Problematiken denn, wie Du gemerkt hast, ist das Erklären absolut nicht meine Stärke.
Z.Zt., wie ich schon berichtete, habe ich keine Probleme mehr mit meinem Projekt. Du wirst sicherlich als Profi vieles entdecken was redundant ist und besser/schlanker gemacht werden könnte aber mir reicht das so, was läuft fasse ich i.d.R. nicht mehr an nach dem Motto „besser geht es immer und fertig ist eine Software nie“.
Ich melde mich wieder wenn ich Dein „Ereignismakro bei De- Aktivierung eines Dokuments“ bei mir getestet habe.

Bis dann
Frank

home.versanet.de/~fr-brueggemann/Datei_Navigator.zip
(Bitte kopieren und als Adresse im Browser einfügen, habe ich als Link hier nicht hin bekommen)

Hallo Reinhard,

wie Du das geschafft hast, SUPER, funktioniert bestens!
Das habe ich schon oft beim VB-Word vermisst und kann es dank Deiner genialen Ausarbeitung ab jetzt verwenden.
Zwei Fragen habe ich noch, darum habe ich ein Muster, nach Deiner Anweisung erstellt, verlinkt, siehe unten.

  1. Wozu dient die Prozedur „Navigatortest“, nur zum Test und ich könnte sie löschen oder?
    Allerdings wird sie von der Prozedur „Sub Ein“ mit „Command:=„Navigatortest““ angesprochen.
  2. Was dann beim Aktivieren und deaktivieren passieren soll habe ich unter den Prozeduren „Sub Ein“ beziehungsweise „Sub Aus“ eingebaut, richtig so?

Nochmals vielen Dank!
Frank
Ereignismakro_Reinhard

Hallo Frank,

Das habe ich schon oft beim VB-Word vermisst und kann es dank
Deiner genialen Ausarbeitung ab jetzt verwenden.

gehe mal im VB-Editor in das Klassenmodul Klasse1. Wähle obendrüber
oApp aus. Dann siehst du rechts davon in der Auswahlbox die anderen Ereignisse die dir angeboten werden. Vielleicht hast du davon auch schon was vermisst.

Achja, immer wenn du im Code des Klassenmoduls etwas änderst so mußt du es Word neu bekannt machen.
In dem Fall einfach im Modul Thosdocument den Cursor in den Code des Open-Ereignisses stellen und F5 drücken.

Zwei Fragen habe ich noch, darum habe ich ein Muster, nach
Deiner Anweisung erstellt, verlinkt, siehe unten.

  1. Wozu dient die Prozedur „Navigatortest“, nur zum Test und
    ich könnte sie löschen oder?

Richtig, nur zum Testen.

Allerdings wird sie von der Prozedur „Sub Ein“ mit
„Command:=„Navigatortest““ angesprochen.

? Die Prozedur in der Sub EIN entspricht in Excel im pseudocode
OnKey Strg+d, „Navigatortest“
Und du willst ja daß bei Strg+d ein bestimmtes makro ausgeführt wird, ergo mußt du da den Namen angeben.
Ob der nun „Navigatortest“ heißt oder anders ist egal, es muß eine Sub mit dem namen existieren.

  1. Was dann beim Aktivieren und deaktivieren passieren soll
    habe ich unter den Prozeduren „Sub Ein“ beziehungsweise „Sub
    Aus“ eingebaut, richtig so?

Korrekt.

Ereignismakro_Reinhard

Schaue ich mir noch an.

Gruß
Reinhard

Moin Reinhard,

gehe mal im VB-Editor in das Klassenmodul Klasse1. Wähle obendrüber :oApp aus. Dann siehst du rechts davon in der Auswahlbox die anderen :Ereignisse die dir angeboten werden. Vielleicht hast du davon auch schon was vermisst.

Aber jede Menge, da sind sie ja, meine lieb gewonnenen Ereignis Prozeduren die ich in Excel benutze und in Word vermisste!
Die Schatzkiste, die Du aufgemacht hast, hat jetzt einen vielfachen Mehrwert bekommen!

Allerdings wird sie von der Prozedur „Sub Ein“ mit
„Command:=„Navigatortest““ angesprochen.

? Die Prozedur in der Sub EIN entspricht in Excel im
pseudocode OnKey Strg+d, „Navigatortest“ Und du willst ja daß bei :Strg+d ein bestimmtes makro :ausgeführt wird, ergo mußt du da den :Namen angeben. Ob der nun „Navigatortest“ heißt oder anders ist :egal, es muß eine Sub mit dem namen existieren.

Entschuldigung, ich bin schon ein alter Knacker.

Ich wünsche schon mal vorbeugend schöne Feiertage in gedenken an den Palästinenser, der vor gut 2000 Jahren geboren wurden!
Frank