Plantage lors de l'exécution de mon code

Plantage lors de l'exécution de mon code - VB/VBA/VBS - Programmation

Marsh Posté le 04-10-2013 à 10:26:05    

Bonjour,
 
J'ai créé une macro qui plante quand je la lance au bout d'un certain nombre de lignes.
En effet, ma boucle plante au bout d'environ 250 lignes  :??:  
Voici mon code :

Code :
  1. Public MyArray
  2. Sub CalculControleCode()
  3.  
  4.     MyArray = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" )
  5. ' Copie des EGP
  6.     Sheets("TCD retravaillé" ).Select
  7.     Range("A5:A" & Cells(Rows.Count, 1).End(xlUp).Row).Copy _
  8.         destination:=Sheets("Contrôle" ).Range("A3" )
  9.    
  10.     Sheets("Contrôle" ).Select
  11.    
  12.     '
  13.     Call Boucle(MyArray(1), 2)
  14.     Call Boucle(MyArray(4), 8)
  15.     Call Boucle(MyArray(7), 14)
  16.     Call Boucle(MyArray(10), 20)
  17.     '
  18. End Sub
  19. Sub Boucle(ByVal MaColonne As String, ByVal MonIndex As Integer)
  20. '
  21.     Dim Maligne As Integer
  22.     Dim MaValeur As String
  23.     Dim Resultat As String
  24.        
  25.     Maligne = 3
  26.     Do
  27.     '
  28.     MaValeur = Sheets("Contrôle" ).Range("A" & Maligne).Value
  29.     '
  30.     For i = MonIndex To (MonIndex + 5)
  31.         '
  32.         If Maligne = 257 Then
  33.             Debug.Print "Ligne 257"
  34.         End If
  35.        
  36.         Resultat = Recherche1(MaValeur, MyArray(i))
  37.         '
  38.         If Resultat <> "-" Then
  39.             '
  40.             Sheets("Contrôle" ).Range(MaColonne & Maligne).Value = Resultat
  41.             Exit For
  42.             '
  43.          End If
  44.         '
  45.     Next
  46.    
  47.     Maligne = Maligne + 1
  48.     '
  49.     Loop Until Sheets("Contrôle" ).Range("A" & Maligne).Value = ""
  50. '
  51. End Sub
  52. Function Recherche1(ByVal MaValeur As Variant, ByVal MaColonne As String)
  53. '
  54.     '
  55.     ligne = 0
  56.     '
  57.     Do
  58.         ligne = ligne + 1
  59.         Cible = Sheets("PB" ).Range("B" & ligne).Value
  60.     Loop Until Cible = MaValeur
  61.     '
  62.     Recherche1 = Sheets("PB" ).Range(MaColonne & ligne).Value
  63. '
  64. End Function


 
Si vous avez une idée de comment je peux vider la mémoire au fur et à mesure que ma boucle passe ... ce serait génial :)
D'ailleurs, le code fonctionne parfaitement quand je suis sur peu de lignes ....
 
Merci

Reply

Marsh Posté le 04-10-2013 à 10:26:05   

Reply

Marsh Posté le 04-10-2013 à 12:13:56    

Par hasard ton "Maligne" irais pas au dela de 32000 et quelques lignes?
 
Sinon, quel est le message d'erreur et sur quelle ligne l’exécution s'arrête?


---------------
il s'appel le ronge me doute
Reply

Marsh Posté le 04-10-2013 à 12:34:02    

Ca me rappelle un vieux problème que j'avais eu autrefois.
J'avais pensé aussi que cela venait de la mémoire qui n'était pas libérée.
Mais en réalité le plantage était dû à certaines cellules particulières.
Elles étaient nulles, mais pas vides.
Donc, il faudrait essayer de remplacer

Loop Until Sheets("Contrôle" ).Range("A" & Maligne).Value = ""


par

Loop Until Nz(Sheets("Contrôle" ).Range("A" & Maligne)) = ""

Message cité 1 fois
Message édité par olivthill le 04-10-2013 à 12:37:10
Reply

Marsh Posté le 04-10-2013 à 13:59:23    

Merci olivhill ... je vais essayer ça.
Sinon, pour te répondre Arl Guhr, dans mon cas, "Maligne" ne dépasse pas 32000 lignes. D'ailleurs, la dernière ligne est 3931.
Et je n'ai aucun message d'erreur. Y a juste Excel qui ne répond plus au bout d'un moment. et en moyenne, c'est au bout de 250 lignes que ça plante.
Mais si j'utilise le pas à pas (F8) ... là ça marche et ça ne plante pas ...

Reply

Marsh Posté le 04-10-2013 à 14:05:52    

olivthill a écrit :

Ca me rappelle un vieux problème que j'avais eu autrefois.
J'avais pensé aussi que cela venait de la mémoire qui n'était pas libérée.
Mais en réalité le plantage était dû à certaines cellules particulières.
Elles étaient nulles, mais pas vides.
Donc, il faudrait essayer de remplacer

Loop Until Sheets("Contrôle" ).Range("A" & Maligne).Value = ""


par

Loop Until Nz(Sheets("Contrôle" ).Range("A" & Maligne)) = ""



 
Je viens d'essayer de remplacer ma ligne de code par la tienne ... Je ne peux pas compiler le projet :(
Ça me met :

Erreur de compilation:
Sub ou Function non définie


C'est sur le "Nz" qui surligne l'erreur ...
 
 
Euh ... Je précise, je suis un peu beaucoup débutante en VBA. Et c'est mon 1er code pour lequel je transforme les formules en Excel en code (d'habitude, j'utilise l'enregistreur pour avoir ma formule retranscrite)

Message cité 1 fois
Message édité par michele_ le 04-10-2013 à 14:10:30
Reply

Marsh Posté le 04-10-2013 à 15:50:42    

Bonjour,
La boucle de ta fonction recherche1 s'arrête comment si elle ne trouve pas la valeur?


---------------
Seul Google le sait...
Reply

Marsh Posté le 04-10-2013 à 16:38:47    

breizhbugs a écrit :

Bonjour,
La boucle de ta fonction recherche1 s'arrête comment si elle ne trouve pas la valeur?


En fait, elle trouvera obligatoirement la valeur car il s'agit d'un copié-collé entre les 2 onglets : la colonne B de l'onglet "PB" est copié sur la colonne A de l'onglet "contrôle"
Mais il est vrai que je n'ai pas fait de sortie dans le cas où ma recherche1 ne trouve pas la valeur (puisque dans mon fichier, ce n'est pas possible ...)

Reply

Marsh Posté le 04-10-2013 à 20:32:04    

 
           Bonjour,
 
           afin d'optimiser la recherche,voir l'aide de la fonction  Find  et son exemple, y a pas photo !
 
           Sinon la variable MyArray est totalement inutile dans ce code …
 
 
 

Reply

Marsh Posté le 04-10-2013 à 23:58:31    

michele_ a écrit :

Erreur de compilation:
Sub ou Function non définie


C'est sur le "Nz" qui surligne l'erreur ...


Désolé, j'ai confondu Excel et Access. Toutes mes excuses. :(  
 

Reply

Marsh Posté le 08-10-2013 à 11:33:33    

Merci, je vais creuser pour utiliser la fonction Find
 
Pas de soucis olivthill ;)


Message édité par michele_ le 08-10-2013 à 11:33:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed