Toon posts:

[VBA/Excel] Forms openen

Pagina: 1
Acties:
  • 529 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een Form0 om een project op te starten en een Form1 voor de projectinstellingen.

De code hieronder heeft betrekking op de volgende workflow:
  1. Open Form1
  2. -Als worksheet (ProjectSettings) nog niet bestaat
  3. Sluit Form1
  4. Open Form0
  5. Maak onder meer (ProjectSettings) aan
  6. Sluit Form0
  7. Open weer Form1
  8. -Als ws ("ProjectSettings) inmiddels wel bestaat, ga door met Form1
Macro's openen de forms
Visual Basic:
1
2
3
4
5
6
7
Sub OpenForm1()
    Form1.Show
End Sub

Sub OpenForm0()
    Form0.Show
End Sub



Form 1 Initialisatie
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub UserForm_Initialize()
  
'controleer of project is geinitialiseerd
   Dim wsSheet As Worksheet
   On Error Resume Next
   Set wsSheet = Worksheets("ProjectSettings")
   On Error GoTo 0
   If Not wsSheet Is Nothing Then
   MsgBox "is al gestart" 'bestaat al: ga door met openen form
   Else
'bestaat niet: ga naar form start
    Set wsSheet = Nothing
    Unload Me
    Run "OpenForm0"
    Exit Sub
End If
Set wsSheet = Nothing


Op zich werkt de code prima, maar ik krijg een fout 91 op Form1.Show een fout 91. Dit heeft iets met Set of With te maken. Ongetwijfeld met de Set wsSheet die ik gebruik om te kijken of de worksheet bestaat, maar ik kom er niet vanaf, ondanks dat ik hem netjes op Nothing zet.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
waarschijn iets met withevents niet geset oid.

Dat houdt in dat er geen referentie bestaat nog.

Visual Basic:
1
2
3
dim frm as form1
set frm = new form1
frm.show


Ik weet niet helemaal zeker of dit klopt.

Verwijderd

Topicstarter
Nee dat deed het hem niet. Dat gedeelte om een form te openen deed ervoor ook prima. Hij geeft pas een error sinds dat If - gebeuren erbij zit.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verwijderd schreef op zaterdag 31 maart 2007 @ 21:25:
Op zich werkt de code prima, maar ik krijg een fout 91 op Form1.Show een fout 91. Dit heeft iets met Set of With te maken. Ongetwijfeld met de Set wsSheet die ik gebruik om te kijken of de worksheet bestaat, maar ik kom er niet vanaf, ondanks dat ik hem netjes op Nothing zet.
Ongetwijfeld heeft het daar niet mee te maken :)

Je doet gewoon iets heel raars. Je opent een form, maar in de initialisatie unload het je het weer. Dat slaat nergens op en op wordt afgestraft met een error.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Je doet gewoon iets heel raars. Je opent een form, maar in de initialisatie unload het je het weer. Dat slaat nergens op en op wordt afgestraft met een error.
Mijn computer vindt mij raar :'( .

Als je het wel beschouwt is het niet zo raar en vrij elegant. Bij het openen van een formulier controleert hij of het de eerste keer is, omdat er eerst instellingen en sheets uit een add-in moeten worden gehaald. Vervolgens opent hij het form om de sheets te importeren.

Het lijkt ook logisch geprogrammeerd.
EDIT: Ik kan die controle natuurlijk ook naar voren halen in de OpenForm1 sub, dat is nog logischer.



Ik heb nu een theorie over de error: Bij het herkennen van een niet-bestaande worksheet wordt een error gegeneerd en genegeerd (On Error Resume Next). Maar, aangezien de initialisatie vanuit de OpenForm1 sub gebeurt, komt de error hier ook voor.

Ik heb (On Error Resume Next) ook toegevoegd aan de OpenForm1 sub. Bewust onderdrukken van de error, omdat die hoort, zeg maar. Beetje raar wel ja.

Is gewoon geen betere manier om een lege worksheet te herkennen vrees ik.

[ Voor 7% gewijzigd door Verwijderd op 31-03-2007 21:59 ]


Verwijderd

Topicstarter
code zonder fouten
  1. -Als worksheet (ProjectSettings) nog niet bestaat
  2. Open Form0
  3. Maak onder meer (ProjectSettings) aan
  4. Sluit Form0
  5. Open Form1
Macro's openen de forms
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub OpenForm1()
'controleer of project is geinitialiseerd
   Dim wsSheet As Worksheet
   On Error Resume Next
   Set wsSheet = Worksheets("ProjectSettings")
   On Error GoTo 0
   If Not wsSheet Is Nothing Then
   'bestaat al: ga door met openen form
   Else
'bestaat niet: ga naar form0
    Set wsSheet = Nothing
    Run "OpenForm0"
    Exit Sub
End If
Set wsSheet = Nothing   
Form1.Show
End Sub

Sub OpenForm0()
    Form0.Show
End Sub



Form 1 Initialisatie
Visual Basic:
1
2
Private Sub UserForm_Initialize()
  'niets bijzonders meer


Daar, dat is beter

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub OpenForm1()
   if not WorksheetExist("ProjectSettings") then
            form0.show
   end if
   Form1.Show
End Sub

Private function WorksheetExist(worksheetname as string)
        dim ws as worksheet      
        on error resume next
        set ws = worksheets(worksheetname)
        worksheetexist = (err = 0)
end function


Het kan ook nog zonder errors door alle werkbladen langs te lopen en de namen te vergelijken.
En als je nu nog form1 en form0 echte namen geeft begint het ergens op te lijken :)

[ Voor 9% gewijzigd door Lustucru op 31-03-2007 22:26 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Topicstarter
Lustucru schreef op zaterdag 31 maart 2007 @ 22:25:

Het kan ook nog zonder errors door alle werkbladen langs te lopen en de namen te vergelijken.
En als je nu nog form1 en form0 echte namen geeft begint het ergens op te lijken :)
Dat werk idd ook, maar ik had de fouten er ook al uit. De formulieren hebben in het echt ook normale namen (Start en Instellingen, maar ik meende dat dit net zo duidelijk was).

Edit: jouw code geeft een foutmelding als ik het proces annuleer (Unload me) in form0. Geen zin om oplossing te zoeken, ik blijf wel bij het huidige.

[ Voor 13% gewijzigd door Verwijderd op 31-03-2007 22:57 ]

Pagina: 1