Anzeige
Archiv - Navigation
1328to1332
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Userform erstellen

Userform erstellen
18.09.2013 13:41:06
Manuel
Hallo,
ich möchte (ganz simpel) einfach nur via VBA ein Userform erstellen. mit dem Befehl von der Windows Support Seite:

Sub Add_Form2()
' Declare a variable to hold the UserForm.
Dim mynewform As Object
' Create a new UserForm. You can now use this new VBComponent object
' to manipulate the User Form.
Set mynewform = _
Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_MSForm)
With mynewform
.Properties("Height") = 246
.Properties("Width") = 616
.Name = "HelloWord"
.Properties("Caption") = "This is a test"
End With
End Sub

Das funktioniert auch einwandfrei... einmal. Sobald ich das Makro ein zweites mal starten möchte, oder es editieren möchte kommt ständig:
Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt.
.
Ich möchte einfach nur ein Userform erstellen um darauf später von einem anderen Makro zugreifen zu können um es zu verändern.
Ich hoffe mir kann jemand helfen.

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform erstellen
18.09.2013 14:22:13
EtoPHG
Hallo,
Das funktioniert auch einwandfrei... einmal.
Warum es kein zweites mal funktioniert, liegt vermutlich an dieser Zeile:
         .Name = "HelloWord"
Da schon eine Userform mit diesem Namen existiert, kann keine 2te mit dem gleichem Namen erzeugt werden. Also steigt der Code mitten im With - End With Konstrukt aus.
Die erste UF muss gelöscht werden, oder aber der Name muss eindeutig vergeben werden.
Warum du dich allerdings mit VBA Basiskentnissen an das dynamische Erstellen von UF's wagst, weiss ich nicht. Ich würde mich da zuerst mal auf mind. 2-3 Stufen höher in der VBA Leiter hochhangeln. ;-)
Gruess Hansueli

Anzeige
AW: Userform erstellen
19.09.2013 08:18:41
Manuel
Hey
ein bisschen mehr als Bassiskenntnisse sind es schon, aber ich denke es ist noch nicht fortgeschritten.
Zu dem Problem. Soweit bin ich auch schon gekommen, dass es daran liegen könnte, dass das Userform mit dem Namen bereits existiert. Doch auch wenn ich das Userform lösche und ein neues erzeugen möchte funktioniert das nicht.
Ich habe gelesen das die VBE Objekte von Grund auf Schreibgeschützt sind. Kann man diesen Schreibschutz wieder herausnehmen?
Gruß Manuel

AW: Userform erstellen
19.09.2013 09:37:01
EtoPHG
Hallo Manuel,
Hast du denn die Mappe nach dem Erstellen, bzw. Löschen der UF jeweils gesichert?
Wenn nicht, bleib ich bei der Aussage: "Basiskenntnisse in VBA...etc.
Wen ja, lad deine Beispielmappe oder den gesamten Code hoch!
Gruess Hansueli

Anzeige
AW: Userform erstellen
19.09.2013 11:26:59
Manuel
Letztendlich arbeite ich mit VBA unter MS Project. Ein Projekt wird ausgewertet und das Ergebnis in einer Excel-Datei festgehalten.
Der Part der nicht funktioniert ist gekennzeichnet. Ist auch unabhängig von dem Rest des Makros (denke ich).

Private Sub LAM_AktArbeit_an_Stichtag_ausrichten(sCase As String)
Dim ProProj As Project, ProProject As Project
Dim ProP As Project
Dim ResR As Resource
Dim ResRs As Resources
Dim AssAssignments As Assignments
Dim AssAssignment As Assignment
Dim IntRessources As Integer, i As Integer
Dim IntType As Integer
Dim IntTS As Integer
Dim IntFormat As Integer
Dim IntGrundlast As Integer
Dim IntLastMonth As Integer
Dim LonWorkTotal As Long
Dim StrNumber As String
Dim BooFlag As Boolean
Dim vRow() As Variant
Dim DatDateFrom As Date
Dim DatDateTo As Date
Dim UserForm as Object
Dim Label as object
GloBooEnd = False
'---- Info zum Makro und Einlesen des Stichtags --------------------------------------------
IntLastMonth = -1
Do
StrNumber = InputBox("Das Makro liest die Zeitreihen ""aktuelle Arbeit"" und ""Arbeit""  _
auf Monatsbasis pro Mitarbeiter aus " & vbCrLf & _
"(es werden nur Vorgänge betrachtet, die innerhalb des Jahres liegen - die  _
Korrekturen werden in einer Excel-Tabelle dargestellt)." & vbCrLf & vbCrLf & _
"1) Mitarbeiter hat ""akt. Arbeit"" nach dem Stichtag:" & vbCrLf & _
"   - Die Summe der hinter dem Stichtag liegende Arbeit" & vbCrLf & _
"   - wird auf die Monate vor dem Stichtag, die bereits" & vbCrLf & _
"   - einen Eintrag in ""aktuelle Arbeit"" haben, verteilt." & vbCrLf &  _
vbCrLf & _
"Bitte den letzten Monat für ""akt. Arbeit"" angeben " & vbCrLf & _
"(z.b. ""4"" für April):", _
Title:="LAM_Report_AktuelleArbeit_an_Stichtag_ausrichten", Default:="5")
If IsNumeric(StrNumber) Then IntLastMonth = CDec(StrNumber)
If Not IsNumeric(StrNumber) And StrNumber  "" Then MsgBox "Der eingegebene Wert war  _
keine Zahl oder außerhalb des Bereichs 1..12."
If (IntLastMonth  12) And StrNumber  "" Then MsgBox "Der  _
eingegebene Wert war keine Zahl oder außerhalb des Bereichs 1..12."
Loop While Not (IntLastMonth >= 1 And IntLastMonth  ""
If StrNumber = "" Then Exit Sub
'--- setzen der Parameter, da Rumpf des Programms für das Befüllen der Excel-Datei aus dem  _
Macro
'    zum Auslesen der Ressourcen übernommen wurde
IntTS = 3
IntFormat = 3
IntGrundlast = 1
gbFlagMeldungVerteilungAktuelleArbeitShow1 = True
Set ProProj = ActiveProject
'--- Vorbereiten Report ----------------------------------------------------------
InitialisePlan2ProjectAssignments
ReDim vRow(400)
vRow(1) = ProProj.Name
BooFlag = SetReport(ciSetReportOpen)
BooFlag = SetReport(ciSetReportHeader, IntTS, vRow, DatDateFrom, DatDateTo, IntFormat)
'--- Setzen des aktuellen Projekts -----------------------------------------------
ProProj.Activate
'--- Eigentliche Schleife über alle Ressourcen ------------------------------------
'########################HIER DER WICHTIGE TEIL!###########################
Set UserForm = Application.VBE.ActiveVBProject.VBComponents.Add(vbtext_ct_MSForm)
with Userform
.Properties("Height")= 200
.Properties("Width") = 200
.Properties("Caption") = "Verteilung"
.Name = "Test"
end with
Set Label = Userform.Designer.Controls.Add("Forms.Label.1")
with Label
.Caption = "Beispiel"
.Left = 10
.Top = 10
.Height= 30
.Width= 180
end with
IntRessources = ProProj.Resources.Count
Set ResRs = ProProj.Resources
For Each ResR In ResRs
If Not ResR Is Nothing Then
i = i + 1
If i Mod 10 = 0 Then SetExcelStatusBar i & " von " & IntRessources
Set AssAssignments = ResR.Assignments
For Each AssAssignment In AssAssignments
vRow = vKorrekturAktuellerArbeit_und_Arbeit(ResR, AssAssignment, IntLastMonth,  _
sCase)
BooFlag = SetReport(ciSetReportRowPPMS, 1, vRow)
If GloBooEnd = True Then
MsgBox "Es ist ein Fehler in der Dokumentation aufgetreten. Bitte starten  _
sie das Programm erneut.", vbSystemModal
Exit Sub
End If
Next AssAssignment
End If
Next ResR
MsgBox "es sind" & Chr(13) & GloIntCount & Chr(13) & "Terminänderungen aufgetreten",  _
vbSystemModal
SetExcelStatusBar ""
'--- Formatieren des Reports -------------------------------------------------------
BooFlag = SetReport(2, IntTS, IntFormat:=IntFormat)
If IntFormat = ciFormatPivot Then BooFlag = SetReport(ciSetReportPivot)
ReDim vRow(400)
vRow(1) = ProProj.Name
BooFlag = SetReport(ciSetReportWriteParameter, IntTS, vRow, DatDateFrom, DatDateTo,  _
IntFormat)
BooFlag = SetReport(ciSetReportClose)
Das komplette Makro ist noch länger würde aber hier den Rahmen sprengen. Die Formatierung ist auch nicht perfekt aber wie gesagt Profi bin ich nicht. Das Problem besteht weiterhin, dass das UserForm nicht wie gewünscht geöffnet wird. Ich möchte in MS Project via VBA ein UserForm öffnen, wo ich Objekte erzeugen kann ohne das ständig Laufzeitfehler kommen.
Gruß

Anzeige
UF in MS Project!!!
19.09.2013 11:48:38
EtoPHG
Hallo Manuel,
Hättest von Anfang an gesagt, dass du eine UF in MS-Project erzeugen willst, hätte ich mich nicht auf den Thread eingelassen. Dies ist ein XL-Forum und ich kann deinen Code nicht nachstellen, da ich über kein MS-Project verfüge. Vielleicht wendest du dich an ein Forum das spezifisch MS-Project behandelt.
VBA heisst zwar in vielen MS-Applikation so, aber Komponenten die von 'aussen' kommen, wie etws MSForms können sich in verschieden Applikation u.U. auch verschieden verhalten!
Lass es mal offen, vielleicht bekommst du noch Input von Anderen.
Gruess Hansueli

Anzeige
AW: Userform erstellen
20.09.2013 18:37:05
fcs
Hallo Manuel,
woraus ergibt sich die Notwendigkeit das Userform dynamisch per Makro zu erstellen?
Wenn deine Datei auch von anderen Anwendern genutzt werden soll, dann müssen diese immer eine Sicherheits-Einstellung unter den Optionen anpassen: "Zugriff auf VBA-Projekt erlauben" muss aktiviert werden. D.h. die Anfälligkeit gegen Viren, die VBA-Code manipulieren wird erhöht, da diese Einstellung nicht nur für die einzelne Datei gilt, sondern für die gesamte Anwendung.
Ansonsten hast du in dem Code einen Tippfehler eingebaut.
 '########################HIER DER WICHTIGE TEIL!###########################
Set UserForm = Application.VBE.ActiveVBProject.VBComponents.Add(vbtext_ct_MSForm)

Die Variable "vbtext_ct_MSForm" ist falsch, die korrekte Schreibweise ist "vbext_ct_MSForm".
Wenn du das Makro in der gleichen Datei mehrfach ausführen willst, dann darf das Userform nur bei der 1. Ausführung erstellt werden. Bei jeder weiteren Ausführung muss nach entsprechender Prüfung der VBA-Komponenten-Namen die UF-Erstellung übersprungen werden.
In Excel sieht so etwas wie folgt aus, dürfte auch in MSProject funktionieren:
Sub MakeUserform()
Dim UserForm As Object
Dim Label As Control
Dim bolUF_vorhanden As Boolean
'########################HIER DER WICHTIGE TEIL!###########################
For Each UserForm In Application.VBE.ActiveVBProject.VBComponents
If UserForm.Name = "Test02" Then
bolUF_vorhanden = True
Exit For
End If
Next
If bolUF_vorhanden = False Then
Set UserForm = Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_MSForm)
With UserForm
.Properties("Height") = 200
.Properties("Width") = 200
.Properties("Caption") = "Verteilung"
.Name = "Test"
End With
Set Label = UserForm.Designer.Controls.Add("Forms.Label.1")
With Label
.Caption = "Beispiel"
.Left = 10
.Top = 10
.Height = 30
.Width = 180
End With
Else
'do nothing
MsgBox "Das Userform ""Test"" existiert schon!"
End If
End Sub

Gruß
Franz

Anzeige
AW: Userform erstellen
23.09.2013 07:40:37
Manuel
Hallo Franz,
Dankeschön erstmal. Das mit der Bedingung ist ein guter Tipp. Was ich mir auch überlegt habe ist, ein bereits vorhandenes Userform in VBA zu laden.Also ohne das es bereits in den Formularen vorhanden ist.
Ich werde es mal ausprobieren aber soweit funktioniert alles.
Gruß Manuel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige