Formulare und VBA
Kontrollkästchen und Textformularfelder automatisch ausfüllen
Hallo im IT-Forum,
bin gerade dabei, ein Word-Formular zu erstellen. In dem gibt es haufenweise Kontrollkästchen und Textformularfelder, die auch ineinander greifen sollen. D.h.:
1. Wird in ein Textfeld etwas eingegeben, soll es beim Verlassen (des Textfeldes via Tab-Taste) automatisch den eingegebenen Text in ein weiteres Textfeld innerhalb des Dokuments schreiben (sind einfach doppelte Einträge im Dokument)
2. Wird ein bestimmtes Kontrollkästchen aktiviert, sollen automatisch weitere Kästchen mitaktiviert werden.
Hab schon einige Lösungsansätze versucht, aber noch nichts gefunden, das funktioniert.
Leider sind meine VBA-Kenntnisse derzeit noch etwas bescheiden.
Kann mich jemand bei meinem Problem unterstützen?
Gruss, thommy75
Hallo im IT-Forum,
bin gerade dabei, ein Word-Formular zu erstellen. In dem gibt es haufenweise Kontrollkästchen und Textformularfelder, die auch ineinander greifen sollen. D.h.:
1. Wird in ein Textfeld etwas eingegeben, soll es beim Verlassen (des Textfeldes via Tab-Taste) automatisch den eingegebenen Text in ein weiteres Textfeld innerhalb des Dokuments schreiben (sind einfach doppelte Einträge im Dokument)
2. Wird ein bestimmtes Kontrollkästchen aktiviert, sollen automatisch weitere Kästchen mitaktiviert werden.
Hab schon einige Lösungsansätze versucht, aber noch nichts gefunden, das funktioniert.
Leider sind meine VBA-Kenntnisse derzeit noch etwas bescheiden.
Kann mich jemand bei meinem Problem unterstützen?
Gruss, thommy75
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 79721
Url: https://administrator.de/contentid/79721
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo Thommy,
das ist eigentlich sehr einfach.
In den Optionen für die Formularfelder vergibst Du erst einmal eindeutige Namen für die Felder.
Im Mittleren Bereich findest Du die Einträge für "Makro ausführen bei"
"Ereignis" --> das ist das Makro, das Ausgeführt werden soll, wenn in das Formularfeld hineingegangen wird.
"Beenden" --> das ist das Makro, das Ausgeführt werden soll, wenn das Formularfeld verlassen wird.
Bevor Du hier ein Makro zuordnen kannst, musst Du es natürlich erst einmaö im VisualBasic Editor von Word in diesem Dokument erstellen.
Normale Textfelder spricht man mit:
ActiveDocument.FormFields("<Hier der Name des Formularfelds>").Result an.
Z.b. Nach Verlassen des Feldes "FELD1" soll die EIngabe in "FELD2" geschriben werden:
Public Sub Feld1() 'Der Name des Makros sollte sprechend sein!
ActiveDocument.FormFields("FELD2").Result = ActiveDocument.FormFields("FELD1").Result
end sub
Dem Formularfeld1 "FELD1" weist Du dann das Makro Feld1 für Beenden zu.
Kontrollkästchen sprichst Du am besten mit:
ActiveDocument.FormFields("<Kontrollkästchen-name").Checkbox.value
an, da hier aus irgend einem Grund Result nicht immer Funktioniert.
Bei Textfeldern hast Du leider die Beschränkung von 255 Zeichen beim kopieren.
Hier musst Du dann den Feldinhalt über das Clipboard in das andere Feld kopieren.
Gruß
Ralf
das ist eigentlich sehr einfach.
In den Optionen für die Formularfelder vergibst Du erst einmal eindeutige Namen für die Felder.
Im Mittleren Bereich findest Du die Einträge für "Makro ausführen bei"
"Ereignis" --> das ist das Makro, das Ausgeführt werden soll, wenn in das Formularfeld hineingegangen wird.
"Beenden" --> das ist das Makro, das Ausgeführt werden soll, wenn das Formularfeld verlassen wird.
Bevor Du hier ein Makro zuordnen kannst, musst Du es natürlich erst einmaö im VisualBasic Editor von Word in diesem Dokument erstellen.
Normale Textfelder spricht man mit:
ActiveDocument.FormFields("<Hier der Name des Formularfelds>").Result an.
Z.b. Nach Verlassen des Feldes "FELD1" soll die EIngabe in "FELD2" geschriben werden:
Public Sub Feld1() 'Der Name des Makros sollte sprechend sein!
ActiveDocument.FormFields("FELD2").Result = ActiveDocument.FormFields("FELD1").Result
end sub
Dem Formularfeld1 "FELD1" weist Du dann das Makro Feld1 für Beenden zu.
Kontrollkästchen sprichst Du am besten mit:
ActiveDocument.FormFields("<Kontrollkästchen-name").Checkbox.value
an, da hier aus irgend einem Grund Result nicht immer Funktioniert.
Bei Textfeldern hast Du leider die Beschränkung von 255 Zeichen beim kopieren.
Hier musst Du dann den Feldinhalt über das Clipboard in das andere Feld kopieren.
Gruß
Ralf
Hallo Thommy,
hier noch die Deklartionen, die Funktion und der Funktionsaufruf um Texte > 256 Zeichen in ein Formularfeld zu bekommen.
' ########### ##################################################
'Deklarationen zur Benutzung des Clipboards
'Ist notwendig, da in Word ein BUG ist, der nicht zulässt Zeichenfolgen > 256 Char direkt in ein
'Textformularfeld zu bringen
' ########### ##################################################
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) _
As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As Long) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
‘###############################################################
'####Funktion um Texte > 256 Char über die Zwischenablage in ein Formularfeld zu bringen
' ########### ##################################################
Function ClipBoard_SetData(MyString As String)
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, x As Long
' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
GoTo OutOfHere2
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Function
End If
' Clear the Clipboard.
x = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If
End Function
' ########### ##################################################
' ########### Aufruf um den Inhalt in das Formularfeld zu bringen ######
' ########### ##################################################
ClipBoard_SetData <Textstring>
hier noch die Deklartionen, die Funktion und der Funktionsaufruf um Texte > 256 Zeichen in ein Formularfeld zu bekommen.
' ########### ##################################################
'Deklarationen zur Benutzung des Clipboards
'Ist notwendig, da in Word ein BUG ist, der nicht zulässt Zeichenfolgen > 256 Char direkt in ein
'Textformularfeld zu bringen
' ########### ##################################################
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) _
As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) _
As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat _
As Long, ByVal hMem As Long) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
‘###############################################################
'####Funktion um Texte > 256 Char über die Zwischenablage in ein Formularfeld zu bringen
' ########### ##################################################
Function ClipBoard_SetData(MyString As String)
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, x As Long
' Allocate moveable global memory.
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
' Lock the block to get a far pointer
' to this memory.
lpGlobalMemory = GlobalLock(hGlobalMemory)
' Copy the string to this global memory.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
' Unlock the memory.
If GlobalUnlock(hGlobalMemory) <> 0 Then
MsgBox "Could not unlock memory location. Copy aborted."
GoTo OutOfHere2
End If
' Open the Clipboard to copy data to.
If OpenClipboard(0&) = 0 Then
MsgBox "Could not open the Clipboard. Copy aborted."
Exit Function
End If
' Clear the Clipboard.
x = EmptyClipboard()
' Copy the data to the Clipboard.
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
If CloseClipboard() = 0 Then
MsgBox "Could not close Clipboard."
End If
End Function
' ########### ##################################################
' ########### Aufruf um den Inhalt in das Formularfeld zu bringen ######
' ########### ##################################################
ClipBoard_SetData <Textstring>
Sorry,
habe noch etwas vergessen! Du mußt natürlich nach Füllen des Clipboards mit
"ClipBoard_SetData <Text>"
den kopierten Text auch noch in das Feld bringen!!
Der Aufruf muß heissen:
'1. Die Kurzbeschreibung in die Zwischenablage kopieren
ClipBoard_SetData <Text>
'2. Den Cursor im Dokument in das Feld setzten
Selection.GoTo What:=wdGoToBookmark, Name:="<Feldname>"
'3. Den Inhalt der Zwischenablage in das Feld kopieren
Selection.Paste
habe noch etwas vergessen! Du mußt natürlich nach Füllen des Clipboards mit
"ClipBoard_SetData <Text>"
den kopierten Text auch noch in das Feld bringen!!
Der Aufruf muß heissen:
'1. Die Kurzbeschreibung in die Zwischenablage kopieren
ClipBoard_SetData <Text>
'2. Den Cursor im Dokument in das Feld setzten
Selection.GoTo What:=wdGoToBookmark, Name:="<Feldname>"
'3. Den Inhalt der Zwischenablage in das Feld kopieren
Selection.Paste
Hi Thommy,
das kannst Du mit den Formularfeldern in Word leider nicht.
Du kannst aber eine Userform in VBA erstellen und das dort realisieren.
Ich habe soetwas auch schon mal realisiert - kleiner Tipp, benenne die Felöder im Wordformular und die entsprechenden in der Userform identisch, so kannst Du mit einem einfachen Loop alle Userform-inhalte in die Formularfelder bringen.
Gruß
Ralf
das kannst Du mit den Formularfeldern in Word leider nicht.
Du kannst aber eine Userform in VBA erstellen und das dort realisieren.
Ich habe soetwas auch schon mal realisiert - kleiner Tipp, benenne die Felöder im Wordformular und die entsprechenden in der Userform identisch, so kannst Du mit einem einfachen Loop alle Userform-inhalte in die Formularfelder bringen.
Gruß
Ralf
Hallo Thomas,
hier der Code, mit dem ich die Felder aus dem Word-Formular in die Userform bringe:
Set docu = ActiveDocument
For Each FormField In docu.FormFields
Feld_name = FormField.Name
If FormField.CheckBox Then
Me.Controls(FormField.Name) = FormField.CheckBox.Value
Else
Me.Controls(FormField.Name) = FormField.Range
End If
Next
ich hoffe, das hilft Dir
Gruß
Ralf
hier der Code, mit dem ich die Felder aus dem Word-Formular in die Userform bringe:
Set docu = ActiveDocument
For Each FormField In docu.FormFields
Feld_name = FormField.Name
If FormField.CheckBox Then
Me.Controls(FormField.Name) = FormField.CheckBox.Value
Else
Me.Controls(FormField.Name) = FormField.Range
End If
Next
ich hoffe, das hilft Dir
Gruß
Ralf