Formular per VBA erstellen und übrige Formulare

Formular per VBA erstellen und übrige Formulare offen lassen

Ich erstelle aus einem Formular heraus per VBA ein weiteres temporäres Formular. Nach dessen schließen und löschen ist das erste Formular(dauerhaftes festes Formular, per Hand erstellt)immer gleich auch geschlossen. Wie kriege ich es hin, dass es offenbleibt?

Kann man das temporäre Formular auch mit ShowModal=false öffnen?

VBA.UserForms.Add(VBComp.Name).Show
ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=VBComp
MsgBox „W“
End Sub

Hinter der Msgbox „W“ kann ich das alte Formular noch sehen. Nach end sub ist dann alles weg :frowning:

Melanie

Ich erstelle aus einem Formular heraus per VBA ein weiteres
temporäres Formular. Nach dessen schließen und löschen ist das
erste Formular(dauerhaftes festes Formular, per Hand
erstellt)immer gleich auch geschlossen. Wie kriege ich es hin,
dass es offenbleibt?
Kann man das temporäre Formular auch mit ShowModal=false
öffnen?

Hi Melanie,

Männer sind nicht multitasking fähig :smile: ich kann nicht gleichzeitig Fußball schauen und deinen Beitrag verstehen.

Lad doch bitte mal eine kleine Beispielmappe hoch bei
http://www.badango.com
oder
http://www.hostarea.de
oder
sonstwo

Vielleicht verstehe ich dann exakter was du da willst, was da nicht klappt.

Lösung dann in 45 Minuten, oder später, oder nie *grins*

@Mod Hallo Rainer wieso muß ich da immer die Hochladadressen eintippseln. Grad http:// ist sehr lästig zu schreiben.

Lade mal die Datei hoch, Hochladadressen findest du in der FAQ:xyz

wäre leichter zu schreiben -))

Viva Espana *sing*

Gruß
Reinhard

Hallo reinhard,

@Mod Hallo Rainer wieso muß ich da immer die Hochladadressen
eintippseln. Grad http:// ist sehr lästig zu schreiben.

so? [FAQ:2861]

Gute Idee! :smile:

Gruß Rainer

so? [FAQ:2861]

Hallo Rainer,

genauso, dankeschön :smile:

Mir ist noch http://www.rapidshare.com/ eingefallen.

Ui, Tor für Schweden grad.

Vom prinzip her sollte man alle Fragen im Forum klären ohne Beispieldatei, auch wegen dem Archiv, was nutzt mir im Archiv ein Link auf eine Datei die es nicht mehr gibt!

Aber oftmals stellen sich Anfrager beim Problembeschreiben so geschickt an wie ich beim Tanzen *lächel*, d.h. keiner weiß was die wollen oder was ich da auf der Tanzfläche mache *gg* und dann da alle Infos aus der Nase zu ziehen…
Ups, nochnen Tor für Schweden.
…das ergibt dann schon eine riesenlange Beitragsfolge bis man überhaupt erstmal dazu kommt die Anfrage beantworten zu können.
Eine hochgeladene datei kürzt das wesentlich ab, meistens zumindest.

Dann gibts noch etwas was es so wohl in Vb nicht gibt, Exceldateien die sich seltsam verhalten. Die kann man schlichtweg nur mal auf einem anderen Rechner testen ob da das Gleiche passiert.

Äh, irgendwie unklug Fußball zu schauen und gleichzeitig etwas sinnvolles zusammenhangvolles hier schreiben zu wollen. Also lese einfach nur und versuch dabei nicht zu denken was ich eigentlich sagen wollte, denn Denken läßt dich früher sterben:

/t/rechnen-mit-farben/4637432/5

Lieben Gruß
Reinhard

Hallo Reinhard,

so? [FAQ:2861]

genauso :smile:

Mir ist noch http://www.rapidshare.com/ eingefallen.

ist nachgetragen.

Ui, Tor für Schweden grad.

Ja, hab’ ich gesehen … Beide. :smile:

Vom prinzip her sollte man alle Fragen im Forum klären …
Eine hochgeladene datei kürzt das wesentlich ab …

Man kann ja das Ergebnis am Ende hier zusammenfassen, ich finde den Weg gut.

Gruß Rainer

Noch mal ausführlicher
(Das ganze Programm ist über 50 Din A Seiten lang)

  1. Ausgangsbasis ist Excel 2000

  2. Ein als Objekt im VBA Projekt fest abgespeichertes Userform („UF1“) wird gestartet. Auf UF1 ist ein Commandbutton, der eine Prozedur startet, die

  3. ein dynamisches Userform („UF2“) nach zuvor in UF1 getätigten Einstellungen erstellt und öffnet. UF1 bleibt dabei hinter dem nun im Vordergrund befindlichen UF2 weiterhin sichtbar.

  4. Wenn man nun UF2 schließt, wäre es doch schön, wenn UF1 wieder unversehrt in den Vordergrund treten würde.

–> Macht es aber nicht: Es ist einfach alles weg

'Wir klicken auf dem UF1 den Commandbutton, der UF2 erstellt. Aus der Routine(nach dem das UF2 bereits aufgebaut wurde):

VBA.UserForms.Add(VBComp.Name).Show
'Hier wird UF2 angezeigt

ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=VBComp
'Hier wird UF2 nach dem Anzeigen wieder gelöscht

MsgBox „W“
'Diese MSGbox ist nur zur Fehlersuche. Wenn SIe angezeigt wird, ist UF1 noch im Hintergrund sichtbar. KLickt man dann auf OK, verschwindet auch das UF1

End Sub
'Die Prozedur des Commandbutton auf UF1 ist zu Ende.

Deutschland spielt doch erst morgen wieder?

Melanie

Hi Melanie,

(Das ganze Programm ist über 50 Din A Seiten lang)

ui. Trotzdem, exportiere die relevanten Module (oder alle, vielleicht kann man da was kürzen) und zip sie, dann lade die zip-Datei mal hoch.

Und um UF2 zu entladen, nimm doch mal:

UnLoad Userform2

Gruß
Reinhard

Diese Prozedur wird vom UF1 aus aufgerufen:

Private Sub CommandButton37\_Click()
ThisWorkbook.VBProject.VBE.MainWindow.Visible = False

Dim ü, i, ii, jj As Long
Dim frmCommandButton, VBComp, strName, VBFrame
Dim intRow, j, S, T, tt, myFrame, MyC



S = "SELECT \* from Tabelle" 'Hier habe ichs jetzt dramatisch vereinfacht ist aber unreleveant der SQL Part

Set rs = DB.OpenRecordset(S)
rs.MoveLast: ii = rs.RecordCount: rs.MoveFirst
jj = rs.Fields.Count

'UF.Show \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
'Erstelle Grundform


Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(3)

With VBComp
 .Properties("Caption") = IICPLus.CBDat
 .Properties("Width") = 600
 .Properties("Height") = 700

 .Properties("Cycle") = 0
 strName = .Properties("Name")
End With

T = 50
S = "Frame1"
Set myFrame = VBComp.Designer.Controls.Add("Forms.Frame.1", S)
With myFrame
 .Caption = IICPLus.CBDat
 .Left = 5
 .Top = T
 .Height = 620
 .Width = 590
 .ScrollBars = 2
End With
'

T = 10
For j = 1 To jj
If rs(j - 1).Type = 12 Then tt = 70 Else tt = 20
S = "TB" & j
Set MyC = myFrame.Controls.Add("Forms.TextBox.1", S)
 With MyC
 .Left = 100
 .Top = T
 .Height = tt
 .Width = 400
 .MultiLine = True
 End With

S = "LAB" & j
Set MyC = myFrame.Controls.Add("Forms.label.1", S)
 With MyC
 .Caption = rs(j - 1).Name
 .Left = 10
 .Top = T
 .Height = tt
 .Width = 70
 End With

 S = "CB" & j
 Set MyC = myFrame.Controls.Add("Forms.commandbutton.1", S)
 With MyC
 .Caption = "Write!" & j
 .Left = 520
 .Top = T
 .Height = tt
 .Width = 40
 End With
 T = T + tt + 10
 With VBComp.CodeModule
 intRow = .CreateEventProc("Click", S)

 .InsertLines intRow + 1, "If MsgBox(""Wollen Sie das Feld '" & rs.Fields(j - 1).Name & "' wirklich ändern?"", vbYesNo) = vbYes Then"
 .InsertLines intRow + 2, "rs.Edit"
 .InsertLines intRow + 3, "rs!" & rs.Fields(j - 1).Name & "= ME.Controls(""" & "TB" & j & """).Value"
 .InsertLines intRow + 4, "rs.Update"
 .InsertLines intRow + 5, "Application.statusbar=""Feld '" & rs.Fields(j - 1).Name & "' wurde geändert!"""
 .InsertLines intRow + 6, "Else: end if"
 .InsertLines intRow + 6, "End SUb"
 End With
Next j
SW = jj
With VBComp.CodeModule
 .InsertLines intRow, "public Sub DatenLaden"
 .InsertLines intRow + 1, "Dim i As Long"
 .InsertLines intRow + 2, "For i = 1 To SW"
 .InsertLines intRow + 3, "If IsNull(rs(i - 1)) = False Then ME.Controls(""TB"" & i).Value = rs(i - 1)"
 .InsertLines intRow + 4, "Next i"
 .InsertLines intRow + 5, "End sub"
End With

 S = "CB" & "X"
 Set MyC = VBComp.Designer.Controls.Add("Forms.commandbutton.1", S)
 With MyC
 .Caption = "Laden"
 .Left = 10
 .Top = 5
 .Height = 30
 .Width = 40
 End With
With VBComp.CodeModule
 intRow = .CreateEventProc("Click", S)
 .InsertLines intRow + 1, "Call DatenLaden"
End With


 S = "CB" & "VW"
 Set MyC = VBComp.Designer.Controls.Add("Forms.commandbutton.1", S)
 With MyC
 .Caption = "Vorwärts"
 .Left = 480
 .Top = 5
 .Height = 30
 .Width = 50
 End With
With VBComp.CodeModule
 intRow = .CreateEventProc("Click", S)
 .InsertLines intRow + 1, "If TBNR 1 Then rs.MovePrevious"
 .InsertLines intRow + 2, "TBNR = rs.AbsolutePosition + 1"
 .InsertLines intRow + 3, "Call DatenLaden"
End With





S = "TB" & "NR"
Set MyC = VBComp.Designer.Controls.Add("Forms.TextBox.1", S)
 With MyC
 .Left = 300
 .Top = 5
 .Height = 15
 .Width = 40
 .MultiLine = True
 End With
 S = "Lab" & "NR"
Set MyC = VBComp.Designer.Controls.Add("Forms.TextBox.1", S)
 With MyC
 .Left = 340
 .Top = 5
 .Height = 15
 .Width = 80
 .MultiLine = True
 End With


With VBComp.CodeModule
 .InsertLines intRow, "Private Sub UserForm\_Initialize()"
 .InsertLines intRow + 1, "TBNR=1"
 .InsertLines intRow + 2, "Call Datenladen"
 .InsertLines intRow + 3, "LabNR="" von "" & rs.RecordCount"
 .InsertLines intRow + 4, "End sub"
End With
DoEvents


myFrame.ScrollHeight = T
VBA.UserForms.Add(VBComp.Name).Show

End Sub

Was 1. doof ist:

trotz
ThisWorkbook.VBProject.VBE.MainWindow.Visible = False

rollert mir beim Form-erstellen der ganze Code(VBE) übers Bild.

dann wird das Form (UF2) korrekt angezeigt und alles funktioniert auch richtig.

Wenn ich dann das UF2 schließe, ist das UF1 auch weg. Hat das was mit ShowModal zu tun? Das UF1 ist Showmodal=false un muss es auch bleiben.

[MOD] Pre-Tag eingefügt, überflüssiges Fullquote entfernt. Gruß Rainer

OT Pre Tag
Hi Melanie,

benutze bitte den pre-Tag, wird unter dem Eingabefeld bei der
Eingabe erklärt, dann bleiben Einrückungen im Code erhalten.

Also schreib das dann so:

    With VBComp
     .Properties("Caption") = IICPLus.CBDat
     .Properties("Width") = 600
     .Properties("Height") = 700
     .Properties("Cycle") = 0
     strName = .Properties("Name")
    End With

Gruß
Reinhard