thommy75
Goto Top

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

Content-Key: 79721

Url: https://administrator.de/contentid/79721

Printed on: April 27, 2024 at 03:04 o'clock

Member: RDiller
RDiller Feb 02, 2008 at 11:20:41 (UTC)
Goto Top
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
Member: RDiller
RDiller Feb 04, 2008 at 12:38:36 (UTC)
Goto Top
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>
Member: RDiller
RDiller Feb 04, 2008 at 12:44:59 (UTC)
Goto Top
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
Member: thommy75
thommy75 Feb 04, 2008 at 22:24:06 (UTC)
Goto Top
Hallo Ralf,

Super-ausführliche Antwort, vielen Dank!
Habe soeben Deinen Lösungsvorschlag in die Tat umgesetzt - genauso wollte ich es haben.
Mit den 255 Zeichen bin ich bisher gut bedient, aber man weiss ja nie... Und das Dokument wird ständig ausgebaut, da kann es doch mal vorkommen, dass ich darauf zurückgreifen werde.

Eigentlich wäre mein Problem gelöst, aber vielleicht hast Du noch einen Tipp:
Ich möchte teilweise Kontrollkästchen bzw. Textfelder ausblenden - geht das überhaupt?
Habe schon etliches ausprobiert (alla .....Visible o.ä.), konnte aber noch keine Lösung finden.

Grüsse, Thomas
Member: RDiller
RDiller Feb 05, 2008 at 15:58:49 (UTC)
Goto Top
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
Member: thommy75
thommy75 Feb 26, 2008 at 23:33:51 (UTC)
Goto Top
Hallo Ralf (oder auch die Anderen...),

ist schon eine Weile her, seit wir über dieses Thema gesprochen haben...
Hab mir inzwischen ein wenig Lektüre besorgt un mich eingelesen (VBA-Programmierung von Bernd Held), aber noch nicht ganz das gefunden, was ich suche.
Ich möchte Deinen Vorschlag umsetzen, und mit Userform arbeiten. Sieht bisher ganz gut aus, nur verstehe ich das mit dem "Loop" nicht ganz.
In jedem meiner Userforms stecken ca. 30-60 Textfelder, Kontrollkästchen usw., die ich bisher einzeln in das Dokument übertrage, z.B.:
TextSTANDORT1.Value = ActiveDocument.FormFields("STANDORT1").Result   
So wie Du angedeutet hast, müsste es einfacher gehen (einfach alle gleichnamigen Elemente in das Word-Dokument schreiben bzw. auch auslesen). Hast Du da auch eine Lösung parat?

Mir ist auch aufgefallen, dass das Übertragen vom Userform ins Dokument (nicht umgekehrt) ewig dauert. Ist das normal?

Gruss, Thomas
Member: RDiller
RDiller Mar 06, 2008 at 12:45:56 (UTC)
Goto Top
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