Såhär lyckas jag lösa problemet. Function ÄrLaddat(MittFormNamn) Hej Per! Jag vet inte om jag helt förstår vad du är ute efter. Jo du har förstått mig rätt. Hur stänger du ditt fönster? Kan det vara så att fönstret är laddat men bara är osynligt. Det skulle förklara varför funktionerna retunerar sant. Hej Andreas. Det finns ytterligare ett alternativ att kontrolera om ett formulär är öppet: Tack igen för en lösning som fungerar bra.VBA Elementärt Testa om formulär öppet.
Hur kan jag testa om ett formulär anropats direkt eller via ett annat formulär(via en lista)?
Det enklaste svaret på frågan vore att helt enkelt i det anropade formuläret (vid Load) testa om ev anropande formulär är öppet.
t.ex:
Månadslista är eventuellt anropande formulär.
If [Forms]![Månadslista] = Öppen Then
.......
End If
mvh /HarrySv: VBA Elementärt Testa om formulär öppet.
Dim ManadsLista AS Form
...
On Error GoTo Next1 ' Ifall formulär "Månadslista" inte är öppen Go To Next1
Set ManadsLista = Forms![Månadslista]
.....
......
Next1:
.....
Visa gärna annan lösning / HarrySv: VBA Elementärt Testa om formulär öppet.
' Accepterar: ett formulärnamn
' Funktion: avgör om ett formulär är laddat
' Returnerar: Sant om angivet formulär är laddat,
' Falskt om det inte är laddat.
Dim I
ÄrLaddat = False
For I = 0 To Forms.Count - 1
If Forms(I).FormName = MittFormNamn Then
ÄrLaddat = True
Exit Function ' Avbryt funktionen när formuläret hittats.
End If
Next
End FunctionSv:VBA Elementärt Testa om formulär öppet.
Tack för ditt svar.
Med din lösning uppstår i mitt program samma problem som med Henriks lösning, nämligen att funktionen hittar FORM1 även om den inte är laddad.
Jag har alltså FORM1 och FORM2
FORM2 kan anropas antingen direkt(utan att FORM1 är laddad) eller via FORM1 som är ett formulär som innehåller en lista med vars hjaälp jag genom dubbelklickning öppnar FORM2.
I FORM2 vill jag kunna kolla om FORM2 blivit anropad Av FORM1 eller inte.
Vid test av ditt förslag öppnar jag enbart FORM2. Därefter stegar jag genom programmet som anropar din rutin som helt riktigt först känner igen FORM2 stegar vidare och hittar därefter även FORM1( trots att den inte är laddad( syns inte i aktivitetsfältet)).
Borde man istället testa på om FORM1 är aktiv? MEN HUR???
Både FORM1 och FORM2 två ligger ju i samma system och samma Access klassmodul. Är det därför som din rutin hittar även FORM1 trots att den inte är aktiv?
Min lösning som ju bara är att kringgå problemet med "ON ERROR" fungerar men är närmast att betrakta som en nödlösning.
Skulle mycket hellre använda en lösning typ din eller Henriks.
Tacksam för svar / HarrySv: VBA Elementärt Testa om formulär öppet.
Men jag använder "min" funktion om jag vill ha ett svar på om ex. formuläret Inmatning är laddat/öppet eller inte.
Så i ett makro kan jag ha argumentet ÄrLaddat("Inmatning") som ett villkor och göra saker om det är laddat eller inte. Då fungerar det ju utmärkt för mig och jag får inga svar för några andra formulär som jag inte direkt frågar efter.
Så om jag förstått dig rätt så borde det ju fungera tycker jag.
Alltså: Jag har funktionen i en modul och anropar den i ett makro. Då går det jättebra.Sv:VBA Elementärt Testa om formulär öppet.
Jag vill veta om FORM1 är laddat/öppet eller inte.
Jag vill alltså använda ÄrLaddat("FORM1") som ett villkor och göra saker om det är laddat eller inte.
Du har funktionen i en modul och anropar den i ett makro.
Jag har lagt in funktionen i FORM2 och anropar den vid Form_Load i FORM2.
Borde ju gå lika bra.
När jag sen kör programmet och kollar satsen:
If Forms(I).FormName = MittFormNamn Then ....
blir (pekar på) FORMs(I).FormName först = "FORM2" och därefter
blir (pekar på) FORMs(I).FormName = "FORM1" vilket ger träff även om FORM1 inte är laddad/öppen.
Något är tydligen galet !!
mvh / HarrySv: VBA Elementärt Testa om formulär öppet.
Om du vill att et formulär skall ha olika beteende beroende på hur det öppnas. Kan du skicka med argument till det:
Private Sub Kommandoknapp1_Click()
On Error GoTo Err_Kommandoknapp1_Click
DoCmd.OpenForm "Formulär2", , , , , , "Lista"
Exit_Kommandoknapp1_Click:
Exit Sub
Err_Kommandoknapp1_Click:
MsgBox Err.Description
Resume Exit_Kommandoknapp1_Click
End Sub
Sedan läsa av det på följande sätt:Private Sub Form_Open(Cancel As Integer)
If Me.OpenArgs = "Lista" Then
MsgBox "Formuläret har öppnats från en lista!"
End If
End Sub
Sv:VBA Elementärt Testa om formulär öppet.
Tack för ditt svar.
Hur jag stänger fönstret? Det underliga är att funktionerna returnerar sant (hittar verkligen FORM1) även om jag inte ens har öppnat FORM1 utan gått direkt från start till att öppna direkt FORM2.
Ditt förslag att skicka med ett argument vid öppnandet är en bra lösning på mitt problem.
Förslaget mottages med tacksamhet.
Mitt problem är således löst, men jag lämnar ändå tråden öppen ett tag till för att eventuellt få svar på varför de två tidigare föreslagna funktionerna inte fungerar som tänkt.
Må så gott! mvh/HarrySv: VBA Elementärt Testa om formulär öppet.
If SysCmd(acSysCmdGetObjectState, acForm, "frmEmployees") = acObjStateOpen Then
MsgBox "Formuläret är öppet"
Else
MsgBox "Formuläret är öppet"
End If
Sv:VBA Elementärt Testa om formulär öppet.
(If SysCmd(acSysCmdGetObjectState, acForm, "frmEmployees") = acObjStateOpen Then ...)
Använder i mitt program din tidigar lösning:
DoCmd.OpenForm "Formulär2", , , , , , "Lista"
eftersom denhär lösningen även visar vilken av listkontrollerna i anropande formulär som anropat.
Avseende de två förslag jag inte fick att fungera så verkar det som om något gått fel vid själva testet (trots många testförsök).
Lösningarna fungerar i varje fall nu helt ok.
Tack till er alla som svarat.
Trevlig fortsättning på midsommarfirandet!!
mvh /Harry