2009-10-15 9 views
8

Sto usando Access 2003 su una macchina duo-core con 4GB di RAM, sistema operativo Windows XP (Service Pack 3) [5.1.2600]MS Access: Non v'è memoria sufficiente per eseguire questa operazione

Periodicamente, viene visualizzato un messaggio di errore "Memoria insufficiente per eseguire questa operazione. Chiudi i programmi non necessari e riprova l'operazione".

Un controllo di Task Manager indica che c'è abbondanza di memoria libera. Chiudere altri programmi aperti non fa differenza.

Si verifica sporadicamente e in circostanze diverse: a volte mentre si salvano le modifiche al design del modulo o al codice VBA, a volte quando diversi moduli sono aperti e in uso.

Se si tenta di salvare le modifiche di progettazione e si verifica questo errore, gli oggetti di Access sono danneggiati e non possono essere ripristinati.

Qualsiasi suggerimento su cosa potrebbe causare questo sarebbe molto gradito.

MTIA

+0

Probabilmente si intende 4 GB di RAM, non 4 MB. –

+0

James - Dettagli, dettagli.

+0

Se fosse 4 MB, questa sarebbe stata una domanda da non sottovalutare. – JohnFx

risposta

1

Come noto che si tratta di moduli o rapporti che molto probabilmente si corrompono, ho creato un nuovo mdb e solo tabelle importate (allegate), query, script (uno solo), moduli e menu. Poi ho usato LoadFromText per importare moduli e report tramite una funzione, e poi ho fatto il solito decompilare/compilare e compattare/riparare ecc.

Finora, toccare il legno, non ho avuto un altro incidente in alcuni giorni, quindi ho Probabilmente starò con questo metodo di recupero.

Mille grazie a tutti per i vostri suggerimenti.

+0

FWIW, non ho avuto un grave incidente per ~ 4wks da quando utilizzo LoadFromText, quindi i metodi di backup e recupero sopra descritti usando SaveAsText e LoadFromText sembrano essere molto utili. – maxhugen

3

Oh mio.

Ho lavorato in un negozio per molti anni che ha utilizzato Access come piattaforma preferita. L'applicazione alla fine è diventata così grande che ha iniziato a colpire una limitazione della memoria interna di Access 2003. Hanno iniziato a sperimentare lo stesso identico problema che si sta avendo. Come hai notato, non vi è alcuna indicazione esterna di problemi di memoria quando ciò accade.

La società ha parlato a lungo con Microsoft del problema e credo che Microsoft abbia fornito loro una patch. Quindi potresti voler parlare con Microsoft di questo, se sembra una situazione simile a quella che stai vivendo, dato che potrebbero essere in grado di fornirti la stessa patch.

In definitiva la soluzione a lungo termine è quella di rompere l'applicazione in pezzi più piccoli. Passare ad Access 2007 non ha aiutato; in effetti, ha peggiorato le cose perché Access 2007 ha più parti mobili.

+0

Grazie Robert. Questa applicazione è piuttosto piccola, ~ 40 forme e sottostrutture, lo stesso per i report, ~ 11.000 righe di codice VBA. Per quanto riguarda il supporto MS, ho rinunciato a quegli anni fa: pagarli quando ho trovato bug nelle loro app non era la mia tazza di tè :) – maxhugen

+0

Se si dispone di un abbonamento MSDN, si hanno incidenti gratuiti. In questo caso particolare, Microsoft dovrebbe fornire gratuitamente la patch. –

1

Questo è anche il messaggio di errore predefinito quando Access non ha idea di quale sia il problema. Ora se il tuo MDB è particolarmente grande, dì più di 800 forme e rapporti con i moduli, sì, l'MDB potrebbe essere troppo grande anche se ti ha dato un messaggio quando sei andato a creare MDE. ACC2000: "Microsoft Access Was Unable to Create an MDE Database" Error Message

Ho fatto accadere occasionalmente a me stesso. E i miei attuali MDB non sono così grandi. Si noti che compact e repair non rilevano errori in oggetti diversi da tabelle, indici o relazioni. Quindi importare in un altro MDB è l'unico modo per correggere questi errori.

Stai lavorando su questo MDB sulla rete? Questo è l'unica cosa che posso pensare che potrebbe causare questo problema.

+0

Ciao Tony: l'app è piccola. È vero, la compatta/riparazione non serve, quindi importare tutti gli oggetti in un nuovo mdb. L'app è una FE/BE seduta sul mio disco locale durante lo sviluppo. Ho eseguito il backup di oggetti tramite la funzione non documentata Application.SaveAsText e quindi Application.LoadFromText per recuperare gli oggetti danneggiati che non è stato possibile importare. È laborioso, però, e l'instabilità di Access mi preoccupa, come succede occasionalmente anche a un utente. – maxhugen

+0

Max, esiste uno strumento in uno dei collegamenti negli oggetti danneggiati all'interno di un MDB Microsoft Access danneggiato http://www.granite.ab.ca/access/corruption/corruptobjects.htm che eseguirà tutti gli oggetti. Ritornerei certamente anche sui suggerimenti di David, anche se non sono sicuro che sia il VBA corrotto. –

+0

Grazie Tony. Ho una funzione molto simile a quella di Arvin Meyer. Fa uscire tutti gli oggetti in una cartella con timestamp, come parte delle mie strategie di backup, e io uso molte volte ogni giorno. Ho esportato un paio di moduli corrotti e ho notato che la descrizione del modulo è stata sostituita da ????????ecc., ma il VBA sembra essere OK. – maxhugen

7

Il progetto VBA nel front-end è probabilmente danneggiato. È necessario ricostruire da zero e quindi utilizzare pratiche di codifica corretta di accesso:

  1. nelle opzioni VBE, spegnere la compilazione su richiesta (vedi Michael Kaplan's article on DECOMPILE per i dettagli del perché).

  2. in opzioni VBE, attivare RICHIESTA DICHIARAZIONE VARIABILE.

  3. nel VBE, personalizzare la barra degli strumenti in modo che il pulsante COMPILE sia facilmente accessibile (è presente nel menu Debug). Raccomando anche di aggiungere il pulsante CALL STACK (dal menu VIEW), in quanto è utile per il debug degli errori in modalità break. Il punto qui è rendere il debug e la compilazione il più semplice possibile.

  4. Dopo aver impostato l'ambiente, passare attraverso tutti i moduli del progetto appena ripristinato e aggiungere OPTION EXPLICIT all'inizio di ogni modulo che non è presente. Quindi compilare. Scoprirai rapidamente dove hai codice non valido e dovrai risolverlo.

  5. da ora in poi, quando si programma, compilare frequentemente, dopo ogni due o tre righe di codice. Probabilmente compilo il mio progetto 100 o più volte al giorno durante la codifica.

  6. decompilare periodicamente il progetto, compattarlo e ricompilarlo. Questo pulirà ogni sporcizia che si accumula durante lo sviluppo regolare.

Queste pratiche assicurano che il codice in un progetto non danneggiato rimanga nella condizione più pulita possibile. Non farà nulla per recuperare un progetto già danneggiato.

Riguardo a come ricostruire il progetto, penso che farei il percorso drastico di esportazione di tutti gli oggetti con Application.SaveAsText e importarli in un nuovo database vuoto con Application.LoadFromText. Ciò è superiore all'importazione semplice dal front end danneggiato corrotto perché l'importazione può importare strutture corrotte che non sopravviveranno a un ciclo SaveAsText/LoadFromText.

Programma quotidianamente in Access, che funziona con app non banali che utilizzano un sacco di codice, inclusi molti moduli di classe standalone. Non ho perso un oggetto per codificare la corruzione in oltre 5 anni, e questo era il giorno in cui stavo ancora usando A97.

+0

Grazie David. Ri 1, che cosa fa? (non trattato nell'articolo di Michael Kaplan) 2: sempre acceso. 3: Compilo sempre dopo ogni cambio di codice. 4: usa sempre questo. 5: Ho anche compilato molto. 6: decompilo/ricompilifico regolarmente. Anch'io lavoro quotidianamente con Access, per ~ 10 anni. Non ho perso alcun codice - anch'io ho molti moduli/classi VBA - ma occasionalmente ottengo un modulo o un rapporto corrotto. Ma recentemente ho ricevuto questo errore di "memoria". Oggi ho perso molte forme e tutte le segnalazioni! Fortunatamente, ho avuto backup di testo di tutti gli oggetti di ieri e ho utilizzato LoadFromText per recuperare moduli e report. – maxhugen

+0

L'articolo spiega perché non si desidera compilare incrementali, perché aumentano il numero di livelli di compilazione di cui VBA deve tenere traccia. La compilazione esplicita è una compilazione completa. Si potrebbe voler controllare l'articolo del file della Guida su COMPILARE SU RICHIESTA (premere F1 mentre si visualizza la scheda OPZIONE | GENERALE). –

0

Ho riscontrato questo problema molte volte e alla fine ho trovato una soluzione che funzionava. Non so quale sia la causa del problema, ma so come risolverlo.

Generalmente l'errore si verifica quando si apre un modulo. Quello che devi fare è ricreare completamente quella forma. Il modo più semplice per farlo è esportare prima il modulo in un file di testo con la funzione non documentata Application.SaveAsText. Quindi cancelli il modulo dal tuo database e ricaricalo con Application.LoadFromText.

4

Avendo inciampato in questo mio vecchio post e vedendo che ha avuto un bel po 'di interesse, ho pensato che forse sarebbe stato necessario un aggiornamento?

Quindi, dopo 2 anni di traccia, facendo molte app per app 2007 oltre alle più vecchie app del 2003 (e anche del '97), sto scoprendo che il 2007 è meno soggetto a crash davvero spiacevoli del 2003 - dove l'oggetto Access le definizioni (moduli e report, in particolare) potrebbero essere facilmente danneggiati.

Seguo ancora i suggerimenti 1-6 (sopra) di David-W-Fenton religiosamente però, più l'uso di Application.SaveAsText (vedi il suggerimento di Tony Toews e il link sopra).

In questi giorni, che si tratti di 97, 2003 o 2007 ci sto lavorando, se Access dà qualsiasi accenno di "essere strano | schiantarsi | gettando errori inspiegabili", ecc, faccio la seguente :

  1. chiudere immediatamente l'applicazione di accesso
  2. Eseguire il backup del file con estensione mdb/accdb
  3. Riaprire l'applicazione mentre si tiene premuto [Shift] quindi nulla viene eseguito
  4. esportare tutti gli oggetti come testo utilizzando Application.SaveAsText (come un altro backup)
  5. Chiudere e riaprire l'applicazione utilizzando l'opzione/decompilare
  6. ricompilare il codice VBA
  7. Fare un compatto/riparazione.

Questo non risolve tutto, ma riduce in modo significativo il numero di corruzioni degli oggetti Access da ciò che sono in grado di osservare.

3

Soluzione rapida; garantito al lavoro:

aperta VBA (Alt-F11) Nella finestra immediata digitare il seguente:

Application.SaveAsText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive" 

poi

Application.LoadFromText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive" 

Questo è tutto :) Spero che questo aiuta gli altri!

+0

Dopo l'esecuzione di 'Application.LoadFromText acForm," nome del form corrotto qui ", CurrentProject.Path e" \ zzTempRevive "' istruzioni alcuni errori possono essere trovati in _errors.txt_. Correggi gli errori quindi esegui di nuovo l'istruzione. – yW0K5o