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
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 SubMé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 SubDans 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