Word VBA SendKeys ersetzen - oder: 3x Entf auslösen

cumulonimbus8

Fleet Admiral
Registriert
Apr. 2012
Beiträge
18.394
Moin!

Googel liefert vieles - und nichts funktioniert. Auch nicht
Code:
'SendKeysEx(ByVal Text As String)
'#################################
Private Declare Sub keybd_event Lib "User32" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Declare Function VkKeyScan Lib "User32" _
Alias "VkKeyScanA" ( _
ByVal Char As Byte) As Integer
Private Declare Function MapVirtualKey Lib "User32" _
Alias "MapVirtualKeyA" ( _
ByVal Code As Long, _
ByVal MapType As Long) As Long
Private Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Enum VirtualKeyCode
VK_BAK = &H8
VK_TAB = &H9
VK_CLEAR = &HC
VK_RETURN = &HD
VK_SHIFT = &H10
VK_CONTROL = &H11
VK_MENU = &H12
VK_PAUSE = &H13
VK_CAPITAL = &H14
VK_ESCAPE = &H1B
VK_PRIOR = &H21
VK_NEXT = &H22
VK_END = &H23
VK_HOME = &H24
VK_LEFT = &H25
VK_UP = &H26
VK_RIGHT = &H27
VK_DOWN = &H28
VK_SELECT = &H29
VK_SNAPSHOT = &H2C  'NEU! Windows-Taste (Sicher???)
VK_INSERT = &H2D
VK_DELETE = &H2E
VK_HELP = &H2F
VK_F1 = &H70
VK_F2 = &H71
VK_F3 = &H72
VK_F4 = &H73
VK_F5 = &H74
VK_F6 = &H75
VK_F7 = &H76
VK_F8 = &H77
VK_F9 = &H78
VK_F10 = &H79
VK_F11 = &H7A
VK_F12 = &H7B
VK_F13 = &H7C
VK_F14 = &H7D
VK_F15 = &H7E
VK_F16 = &H7F
VK_NUMLOCK = &H90
VK_SCROLL = &H91
VK_WIN = &H5B     'NEU! Windows-Taste
VK_APPS = &H5D    'NEU! Taste für Kontextmenü
End Enum
'Text durch Simulieren von Tastenanschlägen an das aktive Control senden
Public Sub SendKeysEx(ByVal Text As String)
Dim VK As VirtualKeyCode
Dim Char As String
Dim I As Integer
Dim Shift As Boolean
Dim Alt As Boolean
Dim Ctrl As Boolean
Dim Scan As Long
Dim Extended As Long
'Jedes Zeichen einzeln senden
For I = 1 To Len(Text)
   'aktuelles Zeichen extrahieren
  Char = Mid$(Text, I, 1)
  'Sonderzeichen?
  Shift = False
  Alt = False
  Ctrl = False
  If Char = "{" Then
   If UCase$(Mid$(Text, I + 1, 9)) = "BACKSPACE" Then
    VK = VK_BAK
    I = I + 9
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "BS" Then
    VK = VK_BAK
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "BKSP" Then
    VK = VK_BAK
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 5)) = "BREAK" Then
    VK = VK_PAUSE
    I = I + 6
   ElseIf UCase$(Mid$(Text, I + 1, 8)) = "CAPSLOCK" Then
    VK = VK_CAPITAL
    I = I + 9
   ElseIf UCase$(Mid$(Text, I + 1, 6)) = "DELETE" Then
    VK = VK_DELETE
    I = I + 7
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "DEL" Then
    VK = VK_DELETE
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "DOWN" Then
    VK = VK_DOWN
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "UP" Then
    VK = VK_UP
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "LEFT" Then
    VK = VK_LEFT
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 5)) = "RIGHT" Then
    VK = VK_RIGHT
    I = I + 6
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "END" Then
    VK = VK_END
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 5)) = "ENTER" Then
    VK = VK_RETURN
    I = I + 6
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "HOME" Then
    VK = VK_HOME
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "ESC" Then
    VK = VK_ESCAPE
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "HELP" Then
    VK = VK_HELP
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 6)) = "INSERT" Then
    VK = VK_INSERT
    I = I + 7
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "INS" Then
    VK = VK_INSERT
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 7)) = "NUMLOCK" Then
    VK = VK_NUMLOCK
    I = I + 8
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "PGUP" Then
    VK = VK_PRIOR
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "PGDN" Then
    VK = VK_NEXT
    I = I + 5
   ElseIf UCase$(Mid$(Text, I + 1, 10)) = "SCROLLLOCK" Then
    VK = VK_SCROLL
    I = I + 11
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "TAB" Then
    VK = VK_TAB
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F1" Then
    VK = VK_F1
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F2" Then
    VK = VK_F2
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F3" Then
    VK = VK_F3
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F4" Then
    VK = VK_F4
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F5" Then
    VK = VK_F5
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F6" Then
    VK = VK_F6
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F7" Then
    VK = VK_F7
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F8" Then
    VK = VK_F8
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 2)) = "F9" Then
    VK = VK_F9
    I = I + 3
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F10" Then
    VK = VK_F10
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F11" Then
    VK = VK_F11
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F12" Then
    VK = VK_F12
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F13" Then
    VK = VK_F13
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F14" Then
    VK = VK_F14
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F15" Then
    VK = VK_F15
    I = I + 4
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "F16" Then
    VK = VK_F16
    I = I + 4
   'NEU! Windows-Taste
   ElseIf UCase$(Mid$(Text, I + 1, 3)) = "WIN" Then
    VK = VK_WIN
    I = I + 4
   'NEU! Kontextmenü
   ElseIf UCase$(Mid$(Text, I + 1, 4)) = "APPS" Then
    VK = VK_APPS
    I = I + 5
   'NEU! PrintScreen-Taste (DRUCK)
   ElseIf UCase$(Mid$(Text, I + 1, 5)) = "PRINT" Then
    VK = VK_SNAPSHOT
    I = I + 6
   End If
  ElseIf Char = "+" Then
   'Umschalttaste
   VK = VK_SHIFT
  ElseIf Char = "%" Then
   'ALT
   VK = VK_MENU
  ElseIf Char = "^" Then
   'STRG
   VK = VK_CONTROL
  Else
   'Virtual KeyCode ermitteln...
   VK = VkKeyScan(Asc(Char))
  End If
  Scan = MapVirtualKey(VK, 2)
  Extended = 0
  If Scan = 0 Then Extended = KEYEVENTF_EXTENDEDKEY
  Scan = MapVirtualKey(VK, 0)
  If VK <> VK_SHIFT Then
   'Großbuchstabe...?
   Shift = (VK And &H100)
   Ctrl = (VK And &H200)
   Alt = (VK And &H400)
   VK = (VK And &HFF)
  End If
  'niederdrücken und wieder loslassen
  If Shift Then keybd_event VK_SHIFT, 0, 0, 0
  If Ctrl Then keybd_event VK_CONTROL, 0, 0, 0
  If Alt Then keybd_event VK_MENU, 0, 0, 0
  keybd_event VK, Scan, Extended, 0
  keybd_event VK, Scan, KEYEVENTF_KEYUP Or Extended, 0
  'Shift (Umsch)-Taste wieder loslassen
  If Shift Then keybd_event VK_SHIFT, 0, KEYEVENTF_KEYUP, 0
  If Ctrl Then keybd_event VK_CONTROL, 0, KEYEVENTF_KEYUP, 0
  If Alt Then keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0
Next I
End Sub
dieses.

Den netten Bug NumLock auszuschalten erwähne ich nur am Rande. Unterbau ist W10 (Home wie Pro) und mir in die Hände gefallene W2010 und 2016 (gibt noch mehr die ich gerade nicht erwische) haben dieses Problem.

SendKeys wird gar nicht erst ausgeführt, in WORD. Mache ichs in VBA bekommt der Code die gedrückten Tasten ab..!

Was ich möchte ist einfach an der Cursorposition, festgelegt nach Einfügen eines Seitenumbruchs [anschließend, nach weiteren Maßnahmen die dieses Umbruchs bedürfen], 3-mal ENTF auszulösen. Ganz bescheiden. Den Umbruch wieder entfernen und 2 Zeilenschaltungen.

Mit was kann ich Word dazu bringen das zu machen? Wenn es ginge einen Range «ab hier» mit 3 Zeichen Länge zu erzueugen und diesen dann zu leeren wäre das wenigstes ein Ansatz.

CN8
 
Ich fände es spannend zu wissen wie die Gesamtaktion aussieht. Wofür ist dieser Umbruch nötig, was wird denn womit gemacht, und wieso bleiben dann Leerzeilen die man entfernen muss. Basiert das auf einer Vorlage, etc...
Meist gehts ja doch bisschen anders in hübscher.
 
Ich bekomme etwas auf den Tisch das so ist wie es ist.

Tabellen aus einem Statistikprogramm {und zwar einige viele, immerhin seitenweise} über denen eine Zeilenschaltung (Leerzeile) ist - die muss übrigens bleiben, Irrtum vom Amt - und eine unerklärbare Zeilenschatung in der ersten Tabelle, Kopfzelle, oberhalb des Texts darin.

Der Umbruch ist nötig um Abschnitte zu separieren die Quer- und Hochformat sein werden, nebst angepasster Kopf- und Fußzeile.
VBA rafft es nicht ohne diesen Umbruch. Im Moment wurde ein Inhaltsverzeichnis erstellt (hochkant, mit Abschnittwechsel), darunter unser Umbruch und dann die Tabellen (Quelle des IVs, quer).

Der Rest ist leider Geschichte… Hier die erschreckend simple Lösung:

----Seitenumbruch----

↕ (zwischen den Seiten)


______
|

|Text

Selection.InsertBreak Type:=wdSectionBreakNextPage
Selection.Delete
'was den Umbruch killt, ja, ich kapiere es auch nicht…
dummy = Selection.Move(Unit:=wdCharacter, Count:=1) 'über den ¶ weg rein in die Tabelle
Selection.Delete 'den unnötigen ¶


Das ist immer das Problem, dass das Einfachste, Selection.Delete, einem von Google nicht geliefert wird obwohl man nach so was sucht.
Das Schlagloch ist übrigens die Tabelle. Mit Selection.Move 3 Zeichen vorwärts und dann drei Type.Backspace kommt man aus der Tabelle nicht raus, mit einfach 3 Delete nicht rein. {Das hätte SendKeys gekonnt.} Also der Klimmzug mit Move der den ¶ über der Tabelle übergeht weil er für diese Zählung nicht als Zeichen existiert. {Sonst wären zuvor 2 Delete fällig gewesen, mich ich die Tabelle moven hätte ich dennoch müssen.}

CN8
 
Zurück
Oben