Checkbox in Userform wieder ausfüllen nach dem speichern

Moderator: ModerationP

Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon genossealex » 16. Jul 2020, 10:51

Hallo zusammen,

ich habe ein Dokument bei dem in einer Userform durch ausfüllen von Textboxen und anhaken von Checkboxen automatisch Texte generiert werden.

Nachdem Speichern der Datei werden diese Felder und Boxen geleert (Bei einer nachträglichen Bearbeitung).

Bei den Textboxen bin ich soweit das die Texte aus dem Dokument in die Textboxen übertragen werden. Hier die Lösung dazu:
Code: Alles auswählen
UserForm1.TextBox1.Text = ActiveDocument.FormFields("Text1").Result



Jetzt die Große Frage:

Ist es möglich, für eine nachträgliche Bearbeitung, die Checkboxen irgendwie auch wieder anhaken zu lassen um dies nicht bei einer Bearbeitung immer wieder machen zu müssen?

Die Lösung wie oben sehe ich hier nicht, da ganze Texte eingefügt und nicht nur Formfields ausgefüllt werden.
genossealex
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 15
Registriert: 05. Feb 2020, 13:38

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon theoS » 16. Jul 2020, 20:16

Ja, das geht sogar relativ einfach, denn du musst ja nur den Zustand der Checkbox in einer Dokumentvariable speichern die du dann beim Aufrufen eben abrufst.
Allerdings musst du dir dann noch mal einfallen lassen, dass das Ding die Texte dann nicht 2 mal einfügt in das gleich Dok.
Das sollte allerdings mit ein wenig Fantasie auch möglich sein zu lösen.
Lies dich mal in das Thema Dokumentvariable ein.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5363
Registriert: 19. Apr 2008, 00:14

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon Gast » 13. Okt 2020, 16:08

Hi,

es hat etwas gedauert, aber ich es jetzt mal mit den Dokumentenvariablen versucht.

Beim ausführen eines Command Buttons auf meiner UserForm sollen die Daten ausgelesen werden.
Hier mein Plan zum auslesen der Checkboxen:
(Die Massagebox dient nur zum Anzeigen ob die Datenauslese funktioniert)

Code: Alles auswählen
Dim ctl As Control
   
    For Each ctl In UserForm1.Controls
        If TypeName(ctl) = "CheckBox" Then
            ActiveDocument.Variables.Add Name:=ctl.Name, Value:=ctl.Value
            MsgBox "Name =" & ctl.Name & vbCr & "Value = " & ctl.Value
        End If
    Next ctl



Anschließend sollen die Daten wieder in die UserForm übertragen werden, wenn diese über einen weiteren Button wieder geöffnet wird.
Hier mein Versuch:


Code: Alles auswählen
Dim var As Variable
Dim ctl As Control

    For Each var In ActiveDocument.Variables
        For Each ctl In UserForm1.Controls
            If TypeName(ctl) = "CheckBox" Then
                If var.Name = ctl.Name Then
                ctl.Value = var.Value
                ctl.Enabled = True
                End If
            End If
        Next
    Next


Anschließend sollen die Variablen gelöscht werden, da beim ausführen der UserForm die Variablen neu geschrieben werden.
Das bekomme ich jedoch nicht hin... dürfte aber eigentlich nicht so schwer sein.
Gast
 

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon genossealex » 14. Okt 2020, 08:32

ich hatte oben vergessen mich anzumelden :)
genossealex
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 15
Registriert: 05. Feb 2020, 13:38

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon theoS » 14. Okt 2020, 11:56

Naja, vielleicht solltest du die Variablen einfach abfragen ob sie da sind und anschließend den Wert neu zuweisen. Erscheint mir einfacher. Ansonsten bringt man die doch mit delete wieder weg.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5363
Registriert: 19. Apr 2008, 00:14

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon genossealex » 20. Okt 2020, 08:08

Das löschen funktioniert. Ich hatte es auch schon mal.
Ich bekomme aber beim erneuten Schreiben der Variablen einen Fehler und dachte das es daran liegt.
Er scheint aber ein Problem mit dem "Enabled" Status der Checkboxen zu haben, deswegen möchte ich die jetzt auch rausschreiben lassen.


Lässt sich der "Enabled" Status auch rausschreiben?
Wenn ich es nur als Messagebox ausgebe, funktioniert es, aber beim Rausschreiben kommt ein Fehler.

Idee warum?

Code: Alles auswählen
Dim ctl As Control
   
    For Each ctl In UserForm1.Controls
        If TypeName(ctl) = "CheckBox" Then
            ActiveDocument.Variables.Add Name:=ctl.Name, Value:=ctl.Value, Enabled:=ctl.Enabled
            MsgBox "Name =" & ctl.Name & vbCr & "Value = " & ctl.Value & vbCr & "Enabled = " & ctl.Enabled
            End If
    Next ctl
genossealex
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 15
Registriert: 05. Feb 2020, 13:38

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon theoS » 20. Okt 2020, 10:19

Was meinst du mit rausschreiben?
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5363
Registriert: 19. Apr 2008, 00:14

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon knobbi38 » 20. Okt 2020, 13:11

Hallo,

spätestens jetzt würde ich mir mal ein paar Gedanken dazu machen, das Problem etwas professioneller anzugehen.
  1. Grundlage der persistenten Speicherung ist eine Documentenvariable in Word, welche einen Wert vom Typ String aufnehmen kann.
  2. Die Informationen, welche du speichern möchtest, sind immer Key/Value Paare. Zur Verwaltung für so eine Datenstruktur wäre dann eine Klasse geeignet, die den Zugriff, die interne Verwaltung und die Serialisierung und Deserialisierung übernimmt.
  3. Innerhalb einer solchen Verwaltungsklasse könnte so ein Key/Value Paar in einem Dictionary-Objekt, einem Array, in einer XML-Struktur oder JSON-Struktur verwaltet werden.
So eine interne XML-Struktur könnte z.B. so aussehen:
Code: Alles auswählen
<Userform1>
  <Checkbox1>
    <Value>1</Value>
    <Enabled>1</Enabled>
  </Checkbox1>
  <Checkbox2>
    <Value>1</Value>
    <Enabled>1</Enabled>
  </Checkbox2>
</Userform1>

Bei Schließen der Userform wird dann so ein String mit Hilfe der Klasse generiert (serialisiert) und in eine DocVar mit dem Namen einer Userform abgespeichert und beim Laden der Userform dann entsprechend ausgelesen, deserialisiert, sprich der String geparst und in seine Bestandteile zerlegt., und den Steuerelementen wieder zugewiesen.
Die ganze "Arbeit" wird dann der Klasse selber überlassen und so kann das für beliebig viele Steuerelemente/Eigenschaften und Userforms angewendet werden.
Sicherlich findet man dazu in Internet auch noch mehr Ansätze:
https://www.youtube.com/watch?v=Q7UEPFJ7SMU
oder hier mal ein Ansatz mit einem Dictionary Objekt:
http://niraula.com/blog/create-dictionary-and-keyvalue-pair-classes-in-excel-vba/

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon genossealex » 25. Okt 2020, 22:10

@Theo S.
Ich kann ja Den Namen und den Wert einer Checkbox in den Dokumentvariablen speichern, um diese Information später dann in die Checkboxen wieder zu übertragen.
Das möchte ich auch mit dem "Enabled" gerne machen.
Wenn ich die Informationen der Variablen wieder in die Checkboxen übertrage sind diese zwar angehakt, aber ausgegraut.
Wenn ich dann die Variablen erneut erstelle kommt ein Fehler, wenn ich die Checkboxen nicht noch einmal angeklickt habe sodass sie nicht mehr ausgegraut sind.


@knobbi38
Professionell.... da ist das Problem :D
Ich habe VBA nie gelernt und alles was ich bis jetzt weiß habe ich mir mühevoll über eine lange Zeit selber angeeignet :)
Und mit Klassen, XML und JSON hatte ich bis jetzt noch nichts am Hut.

Kannst du mir vielleicht etwas helfen? :)
genossealex
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 15
Registriert: 05. Feb 2020, 13:38

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon knobbi38 » 26. Okt 2020, 01:19

Hallo,
genossealex hat geschrieben:Und mit Klassen, XML und JSON hatte ich bis jetzt noch nichts am Hut.

OK, aber ein Forum ist für Grundlagenvermittlung nur bedingt geeignet, besser wäre ein gutes Fachbuch.

Wenn du bei einer Dokumentvariable bleiben und darin zwei Stati in einem String abspeichern möchtest, mußt du die Informationen in einen String konvertieren und mit einem Trennzeichen versehen - genauso sind CSV-Dateien aufgebaut.

Beispiel:
Code: Alles auswählen
Dim aParam() As String
Dim strValues As String

Const cDELIMITER As String = "|"
Const cCHECKED As Long = 0
Const cENABLED As Long = 1

ReDim aParam(cENABLED)
aParam(cCHECKED) = CheckBox1.Value
aParam(cENABLED) = CheckBox1.Enabled

' Zu eine String zusammenfügen
strValues = Join(aParam, cDELIMITER)

' Einzelne Werte wieder extrahieren
aParam = Split(strValues, cDELIMITER)
CheckBox1.Value = CBool(aParam(cCHECKED))                ' [1]
CheckBox1.Enabled = CBool(aParam(cENABLED))

Die Behandlung von Null-Werten bei den Checkboxen überlasse ich jetzt mal dir.

Gruß Ulrich

Edit:
[1] nach Hinweis von Theo die explizite Konvertierung mit CBool() hinzugefügt.
Zuletzt geändert von knobbi38 am 26. Okt 2020, 22:55, insgesamt 1-mal geändert.
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon theoS » 26. Okt 2020, 22:09

Das liegt dann vermutlich daran, dass Word hier nicht automatisch konvertiert.
Der Wert in der Variablen ist ja IMMER String. den konvertiert man dann halt einfach:
Code: Alles auswählen
        If ctl.Name = "box2" Then
        UserForm1.box2.Enabled = CBool(dd1.Variables(ctl.Name & "En").Value)
        End If

(Hab hier die Checkbox box2 genannt und an das ctl einen Zusatz gehängt, der quasi das Enabled symbolisiert zum Unterschied von den anderen Namen.

Die Variablen lassen sich übrigens ganz einfach bearbeiten.
Code: Alles auswählen
        dd1.Variables(ctl.Name).Value = ctl.Value
        dd1.Variables(ctl.Name & "En").Value = UserForm1.box1.Enabled

Da musst du nicht überprüfen ob die schon da sind, wenn du die mal zurücksetzen magst, dann setz einfach an die geeignete Stelle den Wert ein, der nichts anrichtet oder lösche sie. Die werden dann neu gesetzt wenn du den Wert zuweist.

Nachtrag. d1 habe ich als document deklariert und mit set dd1 = activedocument zugewiesen.
theo s.
Benutzeravatar
theoS
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 5363
Registriert: 19. Apr 2008, 00:14

Re: Checkbox in Userform wieder ausfüllen nach dem speichern

Beitragvon knobbi38 » 26. Okt 2020, 23:10

@theo:

Guter Punkt :!: Hatte ich übersehen.

Hat aber nichts direkt mit Word zu tun, sondern mit der Ländereinstellung "deutsch" und MSForms, welche damit anscheinend so nicht umgehen kann.
Bei der Zuweisung an die Checkbox.Value Eigenschaft ergeben sich folgende Werte:
Code: Alles auswählen
CheckBox1.Value = "Wahr"  ergibt CheckBox1.Value = NULL
aber
CheckBox1.Value = "True"  ergibt CheckBox1.Value = Wahr (TRUE)

Mit der expliziten Typkonvertierung klappt es dann, so wie es eigentlich sollte.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23


Zurück zu Word Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste