[GELÖST][VBA] Userform "stylen"

Moderator: ModerationP

[GELÖST][VBA] Userform "stylen"

Beitragvon thowe » 28. Nov 2019, 14:05

Hallo liebe Foristi,

mit folgendem Code-Schnippsel "style ich die Userforms".In Excel 2013 und läuft das einwandfrei

Code: Alles auswählen
Option Explicit
Dim Colors

Sub StyleDialog(objForm As Object)
Dim objControl As Control
Set Colors = New clsColors
'Textboxes
For Each objControl In objForm.Control
    If TypeOf objControl Is MSForms.TextBox Then
        With objControl
            .BackColor = Colors.BlackMedium
            .ForeColor = Colors.Grey
        End With
    End If
Next
'Labels



Aufgerufen wird diese Sub-Routine im Userform_Initialize() Event mit:

Code: Alles auswählen
StyleDialog(Me)



Ich erhalte die Fehlermeldung: Laufzeitfehler 438, Objekt oder Methode werden nicht unterstützt in der "For Each Schleife", gleich am Anfang.


Woran kann das liegen....?

Ich danke schon vorab für eure Hilfestellung und eure Anregungen....
Zuletzt geändert von thowe am 06. Dez 2019, 09:21, insgesamt 1-mal geändert.
LG & ciao....

thowe
<think happy thoughts>
Hast du Milch für Kaffe? Ja, ich habe "Fettarme". Das sehe ich. Bekomme ich nun eine Milch?
Benutzeravatar
thowe
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 506
Registriert: 09. Jul 2007, 12:20
Wohnort: Graz

Re: [VBA] Userform "stylen"

Beitragvon halweg » 28. Nov 2019, 14:56

Auf den ersten Blick würde ich sagen, dass es
"For Each objControl on objForm.Controls" heißen müsste.
Office 2002, 2010; Windows 7, 10
Benutzeravatar
halweg
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 565
Registriert: 21. Okt 2010, 08:04
Wohnort: Dresden

Re: [VBA] Userform "stylen"

Beitragvon thowe » 28. Nov 2019, 19:45

Hallo halweg!

Nein, ist leider nicht die Lösung....

jedenfalls danke für deine Antwort
LG & ciao....

thowe
<think happy thoughts>
Hast du Milch für Kaffe? Ja, ich habe "Fettarme". Das sehe ich. Bekomme ich nun eine Milch?
Benutzeravatar
thowe
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 506
Registriert: 09. Jul 2007, 12:20
Wohnort: Graz

Re: [VBA] Userform "stylen"

Beitragvon 1Matthias » 28. Nov 2019, 20:21

Moin!
(auch hier :D ).
Also habe mal geschaut. Das "Problem" ist, dass du der Prozedur ein Object übergibst. Das ist nun aber der Container/KLasse für alle Objekte. Nicht jede Klasse hat aber Controls. Deshalb Hat dein objform auch keine controls Eigenschaft. Statt dessen hat sie nur die Elemente auf der UF. Am Besten mal im Lokalfenster verfolgen. Bei der allgemeinen Klasse kannst du also nur die Elemente und EIgenschaften ansprechen, die alle gemein haben. Wie kann man es lösen?
Entweder du änderst den Typ in der Funktion oder du änderst deinen Code wie folgt (das mit der Farbklasse ist raus - hat beim Testen nur gestört)
Code: Alles auswählen
Sub StyleDialog(objForm As Object)
Dim objControl As Control

'Textboxes
For Each objControl In objForm
    If TypeOf objControl Is MSForms.TextBox Then
        With objControl
            .BackColor = vbRed
            .ForeColor = vbYellow
        End With
    End If
Next
End Sub


beachte

VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 641
Registriert: 15. Aug 2017, 18:36

Re: [VBA] Userform "stylen"

Beitragvon thowe » 28. Nov 2019, 20:32

Hallo 1 Matthias,

danke auch hier.....

nur ne - blöde - Rückfrage...
Warum läuft das in Excel seit Jahren, anstandslos... Weil …?
LG & ciao....

thowe
<think happy thoughts>
Hast du Milch für Kaffe? Ja, ich habe "Fettarme". Das sehe ich. Bekomme ich nun eine Milch?
Benutzeravatar
thowe
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 506
Registriert: 09. Jul 2007, 12:20
Wohnort: Graz

Re: [VBA] Userform "stylen"

Beitragvon snb » 28. Nov 2019, 21:42

Zuviel Aufwand....

'Structuring precedes coding'

Code: Alles auswählen
Private Sub Userform_Initialize()
  For Each it in controls
    if typename(it)="TextBox" then
        it.BackColor = vbRed
        it.ForeColor = vbYellow
    End If
  Next
End Sub
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7381
Registriert: 25. Sep 2014, 16:37

Re: [VBA] Userform "stylen"

Beitragvon 1Matthias » 28. Nov 2019, 21:56

Moin!
ALso meine (evtl. auch falsche) Begrüdnung wäre:
Die Programmiersprache ist die selbe aber das Objekt- und Klassenmodell im Hintergrund (also word oder excel) ist ein anderes. Bspw. hast du in Excel workbooks und in Word documents. Einiges ist identisch (weil die selben Klassen genutzt werden) manches aber unterschiedlich. Du kannst ja mal im VBE mit F2 die Objekte vergleichen.
Bzgl. der Aussage des fehlerfreien Ablaufs in Excel kann ich nichts sagen. Das kommt auf den Code an und ggf. sind dort Änderungen. Wenn ich deinen Ausgangscode in Excel einfüge und mit .control nutze (auch mit controls) kommt die selbe Meldung, da die Klasse Object keine element(s) Eigenschaft hat. Vllt. gab es also minimale Änderungen im Code und deshalb lief es.
Was ggf. auch in die Richtung geht wäre das hier: http://www.office-loesung.de/ftopic516038_0_0_asc.php
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 641
Registriert: 15. Aug 2017, 18:36

Re: [VBA] Userform "stylen"

Beitragvon thowe » 29. Nov 2019, 08:25

Hallo 1Matthias!

Danke für deine Antwort

Ich habe es jetzt auf einem anderen Rechner ausprobiert. Dort ist die SELBE WORD-Version installiert (gleiches ISO-image). Auf dem zweiten Rechner läuft es. Komisch.

Ich lade mal eine TestDatei hoch. Läuft die bei dir auf WORD?

Was ich noch nachgucke ist, ob beim ersten Rechner (dort wo der Fehler auftritt) unter Verweise die selben aktiviert sind, nämlich unter anderem:

Microsoft Word 15.0 Object Library und
Microsoft Office 15.0 Object Library

??? hmm ??? man kann keine .docm Dateien hochladen? -> nun gut dann als .zip :-)

herzlich
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
LG & ciao....

thowe
<think happy thoughts>
Hast du Milch für Kaffe? Ja, ich habe "Fettarme". Das sehe ich. Bekomme ich nun eine Milch?
Benutzeravatar
thowe
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 506
Registriert: 09. Jul 2007, 12:20
Wohnort: Graz

Re: [VBA] Userform "stylen"

Beitragvon 1Matthias » 29. Nov 2019, 15:28

Moin!
Wie gestern mal geschrieben steckt der Fehler im Detail - auch wenn er nur minimal ist. :) So zumindest meine Sichtweise.
Der Unterschied zwischen dem Ausgangscode und deiner Word-Datei besteht in zwei simplen Klammerzeichen. Die bewirken, dass dein Objekt (hier die Userform) anders übergeben wird.
Im Ausgang waren Klammern drum. Deshalb wird die UF ByVal übergeben. Die aufgerufene Funktion erhält also eine Kopie und passt die an den Parameter in der aufgerufenen Fkt/Sub an. Es werden also alle überschüßigen Elemente entfernt. Kann man in der Lokalansicht auch sehen. Da gibt es nur die Elemente auf der uF und mehr nicht. Das Controls läuft also in einen Fehler.
In der Datei sind keine Klammern da. Das Objekt wird also als Referenz übergeben. Ist also wie ein Zeiger auf die urspr. Userform. Der kann man nun nichts entfernen. Es sind also noch alle Elemente, inkl. der Controls vorhanden.
Ändere mal den Aufruf in
UfStylen (Me)
Ergebnis wird wieder der Fehler sein.
Es hängt also immer von der Art der Übergabe ab.
Um dich aber noch ein wenig zu verwirren. Wenn du das Ganze noch mit einem Call versiehst, gilt die erste Klammer als ByRef. Machst du dann noch eine Klammer drum, wird es wieder ByVal. Da sollte man also aufpassen.
Hier noch was zum Lesen:
https://renenyffenegger.ch/notes/develo ... yRef/index
https://docs.microsoft.com/de-de/dotnet ... -reference
https://excelmacromastery.com/vba-objec ... _and_ByVal
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 641
Registriert: 15. Aug 2017, 18:36

Re: [VBA] Userform "stylen"

Beitragvon knobbi38 » 29. Nov 2019, 15:46

Hallo Matthias,

deine vermeindliche Begründung liest sich sehr schön, ist aber leider nicht richtig. Objekte werden in VBA immer per Referenz übergeben. Du solltest deinen letzen Link nochmal genauer durchlesen. Achte auf den Befehl new() in der Variablendefinition. Dort ist nochmal de Wirkungsweise von Byval und Byref bezüglich Objekteübergabe beschrieben. Kann man sich aber auch selber in einem kleinen Testprojekt klarmachen

Dein Link eine Userform an eine Prozedur übergeben ist genau die Erklärung für das Verhalten und für Excel und Word ist das Objektmodell von MSForms identisch.

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

Re: [VBA] Userform "stylen"

Beitragvon 1Matthias » 29. Nov 2019, 18:57

Hallo Ulrich!
Hatte mir die Links schon angeschaut und auch noch weitere gehabt. Das Prinzip von ByVal und ByRef ist mir (glaube ich zumindest :) ) klar. Das Problem war nur, dass ich das nicht ganz auf den Fall hier anwenden konnte. Deshalb meine blumige Umschreibung, mit dem Zusatz, dass ich das so interpretiere. :-)
Die Frage die damit aber noch im Raum steht, warum funktioniert die Übergabe ohne Klammern (wäre ja ByRef) und die mit Klammern (wäre ja eigentlich ByVal) nicht? Wenn das Objekt immer ByRef übergeben wird, müsste es doch egal sein. An dem Punkt hatten mir die Links, meine Tests bzw. die Suche keinen Sinn gemacht, weshalb ich es selbst interpretierte. Auch im Code von Makromastery sind ja die Elemente nach der Übergabe (noch) vorhanden und können abgerufen werden. Mit dem new wird dann eine neue coll angelegt und ja nach Übergabeart überschrieben. HIer sind die Elemente aber weg.
Auch wenn ich den funktioniernden Code von Nepumuk abwandle und die übegebende UF mit den extra Klammern umschließe kommt die Fehlermeldung. DAs bedeutet doch, dass bei der Übergabe entweder was wegfällt (sieht man ja im Lokalfenster) oder die Übergabe anders interpretiert wird. Greift der Code mit den Klammern dann nur noch auf die Schnittstelle (wobei die Items ja noch dabei sind und nur der Rest fehlt) zu oder hat der sich ein anderes Objekt geschnappt (welches)?
Falls du da eine Erklärung hast, wäre das super. Weil das leuchtet mir noch nicht so ein. Vielen Dank vorab.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 641
Registriert: 15. Aug 2017, 18:36

OT: Parameterübergabe Userform-Objekt ByRef/ByVal, als Ausdr

Beitragvon knobbi38 » 30. Nov 2019, 03:43

Hallo Matthias,

ausgehend von der Parameterdeklaration von Objekten mit byref und byval ist, glaube ich, byref klar - es wird eine Referenz auf das Objekt übergeben. Mit der Deklaration byval wird hingegen eine Kopie der Referenz übergeben. In beiden Fällen kann das Objekt verändert werden und mit byref kann auch die Objektreferenz selber geändert werden, was bei der Deklaration mit byval nicht möglich ist.

Hier ein kleines Codebeispiel zum ausprobieren, um das zu verdeutlichen:
Code: Alles auswählen
Sub Test()
  Dim a As Collection

  Set a = New Collection
  a.Add Item:="Hallo A", Key:="A"
  Debug.Print a.Item("a")

  ParameterTest1 a: Debug.Print "1:"; a.Item("a")
  ParameterTest2 a: Debug.Print "2:"; a.Item("a")
  ParameterTest3 a: Debug.Print "3:"; a.Item("a")
  ParameterTest4 a: Debug.Print "4:"; a.Item("a")
  Call ParameterTest5(a): Debug.Print "5:"; a.Item("a")
  Call ParameterTest6(a): Debug.Print "6:"; a.Item("a")
End Sub

Sub ParameterTest1(ByVal obj As Object)
  ' Objektinhalt verändern
  obj.Remove "A"
  obj.Add Item:="Hallo Test1", Key:="A"
End Sub

Sub ParameterTest2(ByVal obj As Object)
  ' Objektzeiger verändern
  Set obj = New Collection
  obj.Add Item:="Hallo Test2", Key:="A"
End Sub

Sub ParameterTest3(ByRef obj As Object)
  ' Objektinhalt verändern
  obj.Remove "A"
  obj.Add Item:="Hallo Test3", Key:="A"
End Sub

Sub ParameterTest4(ByRef obj As Object)
  ' Objektzeiger verändern
  Set obj = New Collection
  obj.Add Item:="Hallo Test4", Key:="A"
End Sub

Sub ParameterTest5(ByRef obj As Object)
  ' Objektinhalt verändern
  obj.Remove "A"
  obj.Add Item:="Hallo Test5", Key:="A"
End Sub

Sub ParameterTest6(ByRef obj As Object)
  ' Objektzeiger verändern
  Set obj = New Collection
  obj.Add Item:="Hallo Test6", Key:="A"
End Sub

So weit, so gut. Wie am Beispiel 5/6 zu sehen ist, kann das Objekt nicht in Klammern übergeben werden, sondern der Aufruf muß mit Call beginnen. Dadurch wird es ein ganz normaler Aufruf und die Klammern haben die gleiche Aufgabe, wie beim Aufruf einer Funktion.
Bei klammern eines Parameters ohne Call, bewertet VBA den geklammerten Parameter als Ausdruck, bevor er übergeben wird. Für die Userform ist die Defaulteigenschaft die Controls-Auflistung. Beim Aufruf einer Sub/Function in einer Userform mit (Me) in Klammern, wird der Ausdruck damit nach Me.Controls ausgewertet und die Referenz darauf als Parameter übegeben. Deshalb die Unterschiede mit und ohne geklammerten Parameter Me.

Grüsse Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1634
Registriert: 02. Jul 2015, 14:23

Re: [VBA] Userform "stylen"

Beitragvon thowe » 30. Nov 2019, 08:47

1Matthias hat geschrieben:Moin!
Wie gestern mal geschrieben steckt der Fehler im Detail - auch wenn er nur minimal ist. :) So zumindest meine Sichtweise.
Der Unterschied zwischen dem Ausgangscode und deiner Word-Datei besteht in zwei simplen Klammerzeichen. Die bewirken, dass dein Objekt (hier die Userform) anders übergeben wird. (…)


So ist es, Danke für die ganz tolle Erläuterung!
LG & ciao....

thowe
<think happy thoughts>
Hast du Milch für Kaffe? Ja, ich habe "Fettarme". Das sehe ich. Bekomme ich nun eine Milch?
Benutzeravatar
thowe
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 506
Registriert: 09. Jul 2007, 12:20
Wohnort: Graz

Re: [VBA] Userform "stylen"

Beitragvon 1Matthias » 30. Nov 2019, 13:37

Moin!
@Ulrich
Vielen Dank, dass du dir soviel Mühe gemacht hast. Das mit ByVal und ByRef war mit klar. Hatte gestern auch noch weiter recherchiert und auf einer der vielen Seiten gefunden, dass bei Objektübergabe mit () die DefaultEigenschaft genommen wird. Da war mit nicht klar, dass dies die Controlsauflistung ist. (Wobei es ja eigentlich im Objektkatalog markiert ist - hatte ich aber übersehen bzw. nicht nach geschaut). Hatte da eher gedacht, dass er die default Objectklasse genommen hat und meine Theorie danach angepasst. Nun ist aber alles klar. Nochmals vielen Dank.

@Thowe
Die Erklärung ist nicht ganz so toll - lediglich die Fehlersuche war ein Treffer. :-)
Die Ausführungen von Ulrich bitte beachten.

VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 641
Registriert: 15. Aug 2017, 18:36


Zurück zu Word Forum (provisorisch)

Wer ist online?

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