VBA EXCEL event change macro te snel?

Status
Niet open voor verdere reacties.

franzeman

Gebruiker
Lid geworden
2 sep 2006
Berichten
98
In mijn zeer uitgebreide gebeurtenis macro (Private Sub Worksheet_Change(ByVal Target As Excel.Range), waarbij ik cellen automatisch laat opmaken n.a.v. de in te geven celinhoud, doet zich iets merkwaardigs voor.
Soms worden enkele cellen wel eens niet opgemaakt, terwijl het een andere keer weer wel lukt. Per computer is dit fenomeen ook verschillend, lijkt het.

Vermoeden: Ik denk, dat het een time management probleem is, en dat de pc eigenlijk meer tijd nodig heeft om z'n huiswerk goed te doen. Er zou misschien een time delay moeten worden ingelast.

Vraag: (Als ik het al bij het rechte eind heb.) Hoe doe ik dat?

Groetjes van franzeman
 
wat is de code die uitgevoerd wordt?

Dit is de (gedeeltelijke) code:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

Dim i As Integer
Dim cell As Range
Dim Password

Application.ScreenUpdating = False

If (starting_up = False) Then


For Each cell In Target
If ((ActiveCell.row > 10) And (ActiveCell.row < 100)) Then
If ((ActiveCell.Column > 5) And (ActiveCell.Column < 255)) Then

'Alle cellen met ingevulde waarden voorzien van hun correcte opmaakkleur.
If cell.Value = "" Or 0 Then

If cell.Value = 0 Then Target.FormatConditions.Delete
If cell.Value = 0 Then cell.Font.Name = "Tahoma"
If cell.Value = 0 Then cell.Font.ColorIndex = 0
If cell.Value = 0 Then cell.Font.Bold = False

'voor de rijenafwisseling in wit - lichtblauw tbv de "voorw." opmaak
cell.Interior.ColorIndex = 20
cell.FormatConditions.Delete
cell.Interior.Pattern = xlSolid
cell.FormatConditions.Add Type:=xlExpression, Formula1:="=REST(RIJ();2)=0"
cell.FormatConditions(1).Interior.ColorIndex = 34

Else

If cell.Value = Range("A10") Then cell.Interior.ColorIndex = 35
If cell.Value = Range("A10") Then cell.Font.Name = "Tahoma"
If cell.Value = Range("A10") Then cell.Font.ColorIndex = 0
If cell.Value = Range("A10") Then cell.Font.Bold = False

If cell.Value = Range("A11") Then cell.Interior.ColorIndex = 24
If cell.Value = Range("A11") Then cell.Font.Name = "Tahoma"
If cell.Value = Range("A11") Then cell.Font.ColorIndex = 0
If cell.Value = Range("A11") Then cell.Font.Bold = False

If cell.Value = Range("A12") Then cell.Interior.ColorIndex = 40
If cell.Value = Range("A12") Then cell.Font.Name = "Tahoma"
If cell.Value = Range("A12") Then cell.Font.ColorIndex = 0
If cell.Value = Range("A12") Then cell.Font.Bold = False

End If 'Else If cell.Value = "" Or 0
End If '((ActiveCell.column > 5) And (ActiveCell.column < 255))
End If '((ActiveCell.row > 10) And (ActiveCell.row < 100))
Next cell


End If 'starting_up = false

Application.ScreenUpdating = True

End Sub


Groetjes van franzeman
 
Ik weet niet zeker of het de oplossing is, maar probeer eens voor de next cell een doevents

Dus in code:

Code:
.............
End If '((ActiveCell.column > 5) And (ActiveCell.column < 255))
End If '((ActiveCell.row > 10) And (ActiveCell.row < 100))
Next cell
Veranderen in:
Code:
.............
End If '((ActiveCell.column > 5) And (ActiveCell.column < 255))
End If '((ActiveCell.row > 10) And (ActiveCell.row < 100))
[COLOR="Red"]DoEvents[/COLOR]
Next cell
 
Ik weet niet zeker of het de oplossing is, maar probeer eens voor de next cell een doevents

Dus in code:

Code:
.............
End If '((ActiveCell.column > 5) And (ActiveCell.column < 255))
End If '((ActiveCell.row > 10) And (ActiveCell.row < 100))
Next cell
Veranderen in:
Code:
.............
End If '((ActiveCell.column > 5) And (ActiveCell.column < 255))
End If '((ActiveCell.row > 10) And (ActiveCell.row < 100))
[COLOR="Red"]DoEvents[/COLOR]
Next cell

Het spijt mij Spiderman, maar dit is niet de oplossing!
Ik heb jouw suggestie ook op andere plaatsen in de code uitgeprobeerd, maar noppes.
In de volledige code heb ik wel 20 verschillende opmaaksoorten, die in de event ogenblikkelijk herkend en verwerkt moeten worden. En dit werkt 'over het algemeen' ook goed.
Ik heb al eerder het vermoeden uitgesproken, dat wellicht tijdens de event 'de handrem' iets moet worden aangetrokken, omdat door de snelheid interne foutjes worden gemaakt (?).
Heb zelf de Excel bijbels er al op nageslagen en kom dan relevante zaken tegen als:
Application.Wait of Application.(Re)Calculate... Maar hoe pas ik dat in?

Groetjes van franzeman
 
Ik ben er ook een beetje mee aan het spelen, maar ik zie tot op heden geen fouten.


Kun je me een voorbeeld geven van waaneer het fout gaat.

Bijvoorbeeld welke cellen had je geselecteerd. Alle info is welkom
 
Ik ben er ook een beetje mee aan het spelen, maar ik zie tot op heden geen fouten.


Kun je me een voorbeeld geven van waaneer het fout gaat.

Bijvoorbeeld welke cellen had je geselecteerd. Alle info is welkom

Nee, sorry!
Het is een heel ingewikkeld document met 10 modules, wat ik niet in z'n geheel kan/mag sturen. Het zou zeer, zeer veel uitleg vergen om uit te leggen hoe of wat. Als ik een klein gedeelte uit het programma zou distilleren, is het probleempje waarschijnlijk ook niet meer manifest...
Ik ben namelijk nog steeds van mening, dat het met de runtime te maken heeft en dat het programma door de snelheid foutjes maakt.
Het valt mij overigens wel op, dat het fenomeen zich significant meer voordoet bij de even rijen als bij de oneven (zie code voorwaardelijke opmaak "REST"). Maar wanneer ik in de gehele VBA-code die voorwaardelijke opmaakcode 'buitenspel"zet, maakt dat helemaal niets uit(!?)
Dus...

Groetjes van franzeman :rolleyes:
 
Laatst bewerkt:
Sorry, maar dan houdt het bij mijn ook op.
Aan de code is weinig fout, mijn inziens.

Wat ik wel zie, en niet zeker weet of het de bedoeling is, is het volgende

Code:
For Each cell In Target
If ((ActiveCell.row > 10) And (ActiveCell.row < 100)) Then
If ((ActiveCell.Column > 5) And (ActiveCell.Column < 255)) Then

'Alle cellen met ingevulde waarden voorzien van hun correcte opmaakkleur.
[COLOR="DimGray"]If cell.Value = "" Or 0 Then[/COLOR]
......

Dit houdt dus in dat als ActiveCell (dus de eerste geselecteerd in je Range) buiten het bereik ligt, je de code tussen
Code:
[I][COLOR="dimgray"]If cell.Value = "" Or 0 Then
.....
End if
[/COLOR][/I]
niet uitvoerd. Ook al ligt de rest van de cellen wil in je bereik
 
Sorry, maar dan houdt het bij mijn ook op.
Aan de code is weinig fout, mijn inziens.

Wat ik wel zie, en niet zeker weet of het de bedoeling is, is het volgende

Code:
For Each cell In Target
If ((ActiveCell.row > 10) And (ActiveCell.row < 100)) Then
If ((ActiveCell.Column > 5) And (ActiveCell.Column < 255)) Then

'Alle cellen met ingevulde waarden voorzien van hun correcte opmaakkleur.
[COLOR="DimGray"]If cell.Value = "" Or 0 Then[/COLOR]
......

Dit houdt dus in dat als ActiveCell (dus de eerste geselecteerd in je Range) buiten het bereik ligt, je de code tussen
Code:
[I][COLOR="dimgray"]If cell.Value = "" Or 0 Then
.....
End if
[/COLOR][/I]
niet uitvoerd. Ook al ligt de rest van de cellen wil in je bereik

Dank je wel, daar heb ik begrip voor.
Daar ga ik vanavond even op studeren.
Waarschijnlijk kan ik pas aanstaande zaterdag reageren, maar ik houd je op de hoogte.

Groetjes van franzeman
 
Dank je wel, daar heb ik begrip voor.
Daar ga ik vanavond even op studeren.
Waarschijnlijk kan ik pas aanstaande zaterdag reageren, maar ik houd je op de hoogte.

Groetjes van franzeman

Hallo spiderman,
Ik geloof, dat ik er uit ben.

Zoals ik eerder in de code heb laten zien, zijn de rijen met de REST-formule voorwaardelijk opgemaakt. Dat betekent, dat alleen de even rijen automatisch een kleurtje krijgen (voor de duidelijkheid in het document).
Welnu, ik had al gemerkt, dat juist de cellen in de even rijen het regelmatig verdomden mijn eventcode te volgen. Door nu in de code bij elke geactiveerde cel eerst de opmaak te verwijderen met de regel: Cell.FormatConditions.Delete werkt het wel.
Eigenlijk logisch!

Hoe dan ook: bedankt voor het meedenken. :thumb:

En groetjes van franzeman
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan