Charlotte Foust
cfoust at infostatsystems.com
Fri Aug 19 17:33:32 CDT 2005
Yes, I know that Lambert. I just wondered if it blew up the other way too, because if so it suggests something is corrupted. Of course, there is an entirely different way to do it in Access 2000 and later: use the AccessObject and loop through the Application.CurrentProject.AllForms collection test the form's IsLoaded property before closing it. ;-} Charlotte -----Original Message----- From: Heenan, Lambert [mailto:Lambert.Heenan at aig.com] Sent: Friday, August 19, 2005 2:14 PM To: 'Access Developers discussion and problem solving' Subject: RE: [AccessD] Close All Forms It's normal practice to go in reverse when destroying items in a collection. Here's why... Say there are three forms open. With this code For i = Forms.Count - 1 To 0 Step -1 On the first time through Forms.Count - 1 is evaluated as 2, and I is set to 2. Then DoCmd.Close acForm, Forms(i).Name will close some form in the collection (which is closed is unspecified as collections are not sorted). Next time round the loop i is set to 1 and another form is closed. Etc. etc. But if we try doing this in a 'forward' direction we have... For i = 0 to Forms.Count - 1 If Forms(i).Name <> "frmMainMenu" Then DoCmd.Close acForm, Forms(i).Name End If Next i First time round Count = 3, i is set to 0 and "forms(0)" closes. Next time round Count = 2, i = 1 and "forms(1)" closes Next time round Count = 1, i = 2 and "Forms(2).Name" generates an error 2456, "The number you user to refer to the form is invalid", which is the collection's equivalent of "Subscript out of range" The For loop is optimized by the compiler so that the termination condition (Forms.Count-1) is only evaluated once. That's why you do it in reverse. None of this explains why Barbara is seeing Access crash though. Her code is totally legitimate. It's not even anything to do with the fact that the 'Function' does not return a value. I'm sure she's set it up like that so it can be called from an AutoKey macro. So we are left with the possibility that the applications p-code is corrupt. Time to back it up, then decompile and compact. With any luck that will fix it. If not, import all the objects into a new database. Lambert -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Charlotte Foust Sent: Friday, August 19, 2005 4:36 PM To: Access Developers discussion and problem solving Subject: RE: [AccessD] Close All Forms Is there any particular reason you're using a reverse step in this? Have you tried it like this: For i = 0 to Forms.Count - 1 If Forms(i).Name <> "frmMainMenu" Then DoCmd.Close acForm, Forms(i).Name End If Next i Does that also bail out on End Function? Charlotte Foust -----Original Message----- From: Barbara Ryan [mailto:BarbaraRyan at cox.net] Sent: Friday, August 19, 2005 11:52 AM To: Access List Subject: [AccessD] Close All Forms I have used the following code successfully in Access 97 to close all forms when a specific function key is pressed. However, in Access 2002, this code causes the error box to appear (with the 2 options to send an error report to Microsoft or not) and then closes Access. Does anyone know why? Function CloseAllForms() Dim i As Integer ' Loop through the collection of open forms and close them (except for the main menu) If Forms.Count > 0 Then For i = Forms.Count - 1 To 0 Step -1 If Forms(i).Name <> "frmMainMenu" Then DoCmd.Close acForm, Forms(i).Name End If Next i End If End Function Thanks, Barb Ryan -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com