Bloquage sur Excel 2003

Bonsoir,

J'ai un programme qui tourne parfaitement sur Excel 2003 SP2. Ce programme fait appel à l'évènement Worksheet_Change(Target as Range) depuis une feuille1

cet évènement exécute une série de macros

macro1 qui fait appel à macro2 puis à macro3

dans macro2, je rempli des tableaux déclarés par Dim tab_(100) depuis une autre feuille2

Je fais dans cette macro2 des trucs du genre : tab_(i)=sheets(feuille2).range(A1).value etc. (il ya plusieurs sheets(feuille2).range(..) à exécuter dans cette macro.

ensuite dans macro3 je fais des traitements d'écriture de cellule dans la feuille1 en faisant sheets(feuillle1).select puis range("B1).value...

Donc cela fonctionne parfaitement dans Excel 2003 SP2 mais ne fonctionne pas complètement dans Excel 2003 . (non mis à jour avec SP2)

Je mets des points d'arret pour tester mon fichier excel sur la version non SP2 avec l'éditeur VBA. Je vois qu'au bout d'un moment ça arrete d'exécuter dans la macro2 au niveau d'un sheets(feuille2).range(...).value

Avez-vous une idée ce pourquoi Excel (2003 non SP2) arrête l'exécution du reste du programme. Y a-t-il un phénomène de saturation de mémoire à cause du nombre important de variables sheets(feuille2).range(...) ..?

Merci de votre lumière sur ce sujet et comment puis-je palier à ce problème s'il s'agit bien d'un problème de mémoire vive.

Merci encore

Hat

Re Merci

hello

mettre à jour en SP2, c'est gratuit, non ?

(et n'oublie pas de répondre à la réponse à ton autre question sur ce forum)

Mon programme doit tourner sur tous les postes même s'il n'ont pas Excel 2003 SP2. (attention il ne suffit pas d'avoir la mise à jour de XP SP2 pour mettre à jour Excel 2003 - ça doit être une installation à part)

1) Si on veut que ce programme tourne sur Excel 2003 (avec ou sans SP2) peut-on importer dans le projet VBA une dll de la mise à jour , afin de ne pas avoir à installer depuis le CD ?

2) J'ai analysé ce bug de Excel 2003 , au départ je pensais que ça venait du nombre d'écriture Sheets().range() dans ma fonction enreg_formule.

Je fais l'appel et le traitement correspondant par 2 méthodes :

Méthode 1

Private Sub Worksheet_Change(ByVal Target As Range)
gestion_mois Target
End Sub
'dans une feuille "mois_"

puis

Sub gestion_mois(Target As Range)
feuille = ActiveSheet.Name
adr = ActiveCell.Address
Application.EnableEvents = False

If Target.Address = "$T$20" Or Target.Address = "$T$21" Or Target.Address = "$T$22" Then
Application.Calculation = xlCalculationManual
i = 1
While Range("BZ" & i).Value <> Range("T22").Value
i = i + 1
Wend
ii = 1
While Range("CI" & ii).Value <> "#"
ii = ii + 1
Wend
If i <= ii Then
mes = Msg_("Attention", "Vous allez redéfinir le niveau à partir du jour " & Range("T22").Value & ". Souhaitez-vous continuer ?")
End If
deprotect
If i > ii Or mes = vbYes Then
Range("CB" & i).Value = Range("T20").Value
Range("CC" & i).Value = Range("T21").Value
    Range("CB" & i & ":CC" & i).Select
    Selection.AutoFill Destination:=Range("CB" & i & ":CC" & 32), Type:=xlFillDefault
Range("CI" & ii).Value = ""
Range("CI" & i).Value = "#"
ElseIf mes = vbNo Then
If Target.Address = "$T$20" Then
Range("T20").Value = Range("CO1").Value
ElseIf Target.Address = "$T$21" Then
Range("T21").Value = Range("CO3").Value
End If
End If
protect
Application.Calculation = xlCalculationAutomatic
End If

If Range("U1").Value = "oui" Then
i0 = 1
While Range("D" & i0).Value <> "E#0"
i0 = i0 + 1
Wend
i = i0
While Range("D" & i).Value <> "E##"
i = i + 1
Wend
If i0 <= Target.Row And Target.Row < i - 1 Then
Application.Calculation = xlCalculationManual
ui = i - 2
While Range("H" & ui).Value = "" And ui > Target.Row
ui = ui - 1
Wend
mess = 1
If ui > Target.Row Then
mes = Msg_("Attention", "La chronologie n'est pas respectée. Souhaitez-vous continuer et recalculer les consommations ?")
If mes = vbNo Then
mess = 0
End If
End If
If mess = 1 And Target.Count = 1 Then
If Target.Column = 8 Or Target.Column = 9 Or Target.Column = 10 Or Target.Column = 11 Or Target.Column = 13 Or Target.Column = 14 Or Target.Column = 15 Then
If Not ((Target.Column = 10 Or Target.Column = 11) And (Range("U2").Value = "" Or Range("U2").Value = 0) And (Range("U3").Value = "" Or Range("U3").Value = 0) And (Range("U4").Value = "" Or Range("U4").Value = 0) And (Range("U5").Value = "" Or Range("U5").Value = 0) And (Range("U6").Value = "" Or Range("U6").Value = 0) And (Range("U7").Value = "" Or Range("U7").Value = 0) And (Range("U8").Value = "" Or Range("U8").Value = 0)) Then
mess_attente_deb
enreg_formule Cells(Target.Row, 9).Value
ecrire_conso feuille, Cells(Target.Row, 5).Value, Cells(Target.Row, 6).Value, Cells(Target.Row, 8).Value, Cells(Target.Row, 13).Value, Cells(Target.Row, 15).Value, Target.Row, "H", "M", "O", Cells(Target.Row, 10).Value, "J", Cells(Target.Row, 11).Value, "K"
mess_attente_fin
End If
End If
ElseIf mess = 1 Then
cnt = Target.Columns.Count
bol = False
For k = 1 To cnt
If Target.Columns(k).Column = 8 Or Target.Columns(k).Column = 9 Or Target.Columns(k).Column = 10 Or Target.Columns(k).Column = 11 Or Target.Columns(k).Column = 13 Or Target.Columns(k).Column = 14 Or Target.Columns(k).Column = 15 Then
bol = True
End If
Next
If bol = True Then
kf = Target.Row + Target.Count / cnt - 1
If kf = i - 1 Then
kf = i - 2
End If
For k = Target.Row To kf
mess_attente_deb
enreg_formule Cells(k, 9).Value
ecrire_conso feuille, Cells(k, 5).Value, Cells(k, 6).Value, Cells(k, 8).Value, Cells(k, 13).Value, Cells(k, 15).Value, k, "H", "M", "O", Cells(k, 10).Value, "J", Cells(k, 11).Value, "K"
mess_attente_fin
Next
End If
End If
Application.Calculation = xlCalculationAutomatic
End If
End If
Application.EnableEvents = True
Range(adr).Select
End Sub

Méthode 2

Sub calcul_conso()
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
feuille = ActiveSheet.Name
adr = ActiveCell.Address
i0 = 1
While Range("D" & i0).Value <> "E#0"
i0 = i0 + 1
Wend
i = i0
While Range("D" & i).Value <> "E##"
i = i + 1
Wend
For k = i0 To i - 2
enreg_formule Cells(k, 9).Value
ecrire_conso feuille, Cells(k, 5).Value, Cells(k, 6).Value, Cells(k, 8).Value, Cells(k, 13).Value, Cells(k, 15).Value, k, "H", "M", "O", Cells(k, 10).Value, "J", Cells(k, 11).Value, "K"
Next
Application.EnableEvents = True
Range(adr).Select
Application.Calculation = xlCalculationAutomatic
End Sub

Dans la méthode 1 (lorsque je saisis des cellules de mon tableau, il se produit un évènement après l'ENTER validation de la saisie qui fait excuter la macro gestion_mois

Sur Excel 2003 non SP2, au bout de quelques saisies (au nombre de 8 ou 12 ou 1.. aléatoire), le programme s'arrête net (pas de message du débogueur !)

Et l'évènement de celulle ne fonctionne plus ou aléatoirement par la suite.

Dans la méthode 2 qui ne fait pas appel à l'évènement de cellule (appel direct de la macro de traitement), le traitement ce fait jusqu'au bout sans problème en faisant appel aux mêmes sous procédures ou fonctions.

Ma conclusion du problème sous Excel 2003 non SP2 :

Apparament il ne s'agirait pas d'un problème du nombre d'écriture sheets().range().., mais d'un problème de gestion de l'évènement de cellule en particulier.

Ma question :

Avez-vous une explication du phénomène ?

Merci de m'éclairer et me donner peut-être une solution, notamment pour importer dans mon projet une fameuse dll de Excel 2003 SP2

re

je cale en VBA

mais pourquoi pas le SP3 sur tous les postes ?

Confirmation de Microsoft,

c'est un bug de Excel 2003 --> si on veut que cet évènement Worksheet_Change fonctionne bien, il faut migrer vers Excel 2003 SP2

A extrapoler pour tous les autres évènements ; mais j'ai pas testé donc à voir...

@+

Hat

Rechercher des sujets similaires à "bloquage 2003"