2012-11-02 20 views
11

Sto utilizzando un enum definito in un modulo di classe in VBA di Excel. Questo sta funzionando benissimo, ma ho iniziato a ricevere un errore di compilazione su ogni volta che faccio un confronto sulle variabili enum:Le enumerazioni VBA danno errori occasionali di "Espressione costante richiesta"

in classe CExample:

Enum MyEnum 
    Foo 
    Bar 
End Enum 

Altrove:

If someValue = myEnum.Foo Then 

Il testo .Foo verrà evidenziato e verrà visualizzato il messaggio "Compile error: Constant expression required".

Una ricerca su Google suggerisce che questo può accadere in modo casuale, e correzioni come riavviare l'IDE o aggiungere uno spazio dopo la dichiarazione enum può farla riprendere a funzionare.

questo è davvero un bug noto in VBA? C'è qualcosa che posso fare per evitare che ciò accada, o far funzionare di nuovo VBA in modo affidabile se si alza?

Nel mio caso, la chiusura e la riapertura di Excel non ha aiutato. Mi scusi mentre riavvio il mio PC.

aggiornamento dopo il riavvio:

Il problema persisteva dopo il riavvio la mia macchina, che è sorprendente. Ho provato ad aggiungere Public di fronte alla definizione enum (sono intesi per essere public by default ma ho pensato di fare un tentativo), e l'errore è scomparso. Ho rimosso la parola chiave Public (quindi torniamo al mio codice originale) e continua a essere compilata e funziona correttamente.

Sembra che si tratti di un errore casuale in VBA. Sarei interessato a sapere se gli sviluppatori esperti hanno trovato questo spesso - consiglieresti di non usare le enumerazioni? Oppure compare una volta in una luna blu e sono stato solo sfortunato?

Aggiornamento dopo 6 settimane di ulteriore sviluppo:

Il problema non si ripeta durante il resto del mio tempo lo sviluppo di questo progetto, così sembra che sia un problema raro.

+1

Cosa succede quando si esegue 'If someValue = Foo Then ...'? Eliminare 'myEnum. Voglio dire –

+0

Dopo il riavvio, il problema si sta ancora verificando. Grazie per il tuo suggerimento Cthulhu, ma questo non ha aiutato - lo stesso errore di compilazione. –

+1

Sembra un bug. Copia lo stesso codice del modulo in uno nuovo e ricompila. Questo sembra risolverlo per alcuni. –

risposta

6

Come indicato nella domanda, ho eliminato l'errore modificando e salvando la definizione enum, quindi annullando la modifica e salvando di nuovo.Avendo recentemente lavorato un po 'di più sul progetto, ho trovato un problema diverso ma simile: una riga di codice generava un errore "Tipo non corrispondente", in cui non era presente alcuna mancata corrispondenza di tipo e dove la stessa funzione, invariata, funzionava bene con gli stessi input.

Alcuni degli errori intermittenti che sto vedendo potrebbero essere dovuti ad un accumulo di artefatti di codice nel file Excel - dopo aver letto alcune letture, ho scoperto che il codice VBA viene compilato e salvato nel file. Non c'è un'opzione "pulita" o "ricostruisci tutto": VBA cerca di capire da sé quali modifiche incrementali sono necessarie. Questo può portare a tutti i tipi di comportamento runtime dispari nei progetti in cui hai apportato molte modifiche al codice. Questa è probabilmente la causa degli errori enum che stavo riscontrando durante lo sviluppo iniziale di questa cartella di lavoro. La sezione "What It Means to Decompile and Compact in VBA" in questo articolo offre una buona panoramica.

La maggior parte delle citazioni di questo problema consiglia l'uso di VBA CodeCleaner: http://www.appspro.com/Utilities/CodeCleaner.htm. Chip Pearson, un noto e rispettato esperto VBA, afferma "I molto fortemente consiglia questo componente aggiuntivo". Sono sorpreso di non averlo mai visto prima!

5

Sembra un bug.

Copia lo stesso codice del modulo su uno nuovo e ricompila. Questo sembra risolverlo per alcuni.

Esiste una correzione simile, che comporta la modifica e l'annullamento della riga della definizione enum.

Considerare il passaggio a costanti numeriche se questo è un problema frequente.

0

Una vecchia domanda ma appena sperimentato. Removed Public definer su Enum e compilato bene. Non ha riavviato IDE. Sorprendente questo è ancora qui.

Problemi correlati