Excel ne répond pas - macro light et fichier allégé au maxi
Bonjour à tous,
Je débute dans la programmation VBA sous excel, et je ne comprends pas pourquoi ma macro entraîne le plantage d’excel.
Il n’y a aucune formule dans les cellules, je les ai supprimées et remplacées par des valeurs pour être sûr que ce ne soit pas ça qui fasse ramer excel.
Le but de la macro est de copier les cellules d’une plage qui répondent à une condition et de les coller dans une même colonne (pour permettre un vlookup facile ensuite).
Quelqu’un peut-il me dire pourquoi ça plante (ou rame) ? J’ai l’impression que mes boucles sont bien fermées, que tous les End If sont là…
Merci d'avance !
Voilà le code :
Private Sub CommandButton1_Click()
' Le but de la macro est de sélectionner les cellules de la plage B6:BG200 répondant aux conditions suivantes :
' - différent de " / "
' - différent de "FIN"
' et de les coller dans la colonne A à partir de la ligne 210
' Définition et dimensionnement des variables :
Dim COL As Integer, LIG As Integer, VAL As String, LIG2 As Integer, VAL2 As String
' Points de départ des calculs :
COL = 10 ' colonne 59 (BG)'ATTENTION VALEUR MODIFIEE POUR TEST --> 10 au lieu de 59
LIG = 6 ' ligne 6 (après les entêtes de colonnes)
VAL = Cells(LIG, COL).Value ' valeur de la cellule d'origine
LIG2 = 210 ' ligne 210 après le tableau de généalogie
VAL2 = Cells(LIG2, 1).Value ' valeur de la cellule de destination
Do Until COL = 1
' Si la valeur sur la ligne 202 est égale à 195,
' Alors passer à la colonne précédente,
' Sinon analyser la valeur des cellules de la ligne 6 à 200 et passer à la colonne suivante
' Passage des calculs en mode manuel
Application.Calculation = xlCalculationManual
If Cells(202, COL).Value = 195 Then
COL = COL - 1
Else:
Do Until LIG = 10 'ATTENTION VALEUR MODIFIEE POUR TEST --> 10 au lieu de 200
' Si la valeur de la cellule est différente de " / " ou "FIN",
' Alors ajouter la valeur de la cellule dans la liste des lots à traquer, et passer à la ligne suivante
' Sinon Passer à la ligne suivante
If VAL <> " / " Or VAL = "FIN" Then
' Si la valeur de la cellule de destination est nulle,
' Alors copier la valeur de la cellule d'origine dans la cellule de destination, et passer à la ligne suivante
' Sinon passer à la ligne2 suivante
If VAL2 = "EMPTY" Then
VAL2 = VAL
LIG = LIG + 1
Else: LIG2 = LIG2 + 1
LIG = LIG + 1
End If
Else: LIG = LIG + 1
COL = COL - 1
Loop
End If
Loop
' Passage des calculs en mode automatique
Application.Calculation = xlCalculationAutomatic
' Message de fin de tâche
MsgBox "Fini !!!"
End Sub
Bonjour,
VAL étant définie une fois pour toutes, la macro ne devait pas faire grand chose...
Je te propose donc du plus classique et qui devrait être plus sûr si ta description correspond bien à ton fichier (car j'ai quelques doutes sur plusieurs points...
Private Sub CommandButton1_Click()
Dim i%, j%, k%
Application.ScreenUpdating = False
With Me
j = 209
For k = 59 To 2 Step -1
If .Cells(202, k) <> 195 Then
For i = 6 To 200
If .Cells(i, k) <> " / " Or .Cells(i, k) <> "FIN" Then
j = j + 1: .Cells(j, 1) = .Cells(i, k)
End If
Next i
End If
Next k
End With
MsgBox "Fini !!!"
End SubCordialement.
Hello !
J'ai testé ton code...
Il ne donne pas les bons résultats.
Il liste le contenu de 4382 cellules alors qu'il ne devrait en lister que 867.
Je ne comprends pas ce que tu veux dire par "VAL étant définie une fois pour toutes".
J'ai defini VAL comme une valeur variable :
VAL = Cells(LIG, COL).Value
Elle varie donc à chaque fois que l'itération change la valeur des variables LIG et COL...
Je joins mon fichier si ça peut aider... Le but est donc que toutes les cellules de la plage A6:BG200 dont la valeur n'est ni "FIN" ni " / " soient listées dans la colonne A à partir de la ligne 210.
La condition sur la valeur 195 est sensée permettre de ne pas faire l'analyse des cellules si toute la colonne est faite de cellule don't la valeur est "FIN" ou " / ".
Merci pour votre aide !
Tu initialises VAL une fois !
La variable a donc la valeur de la cellule pointée lors de l'intialisation.
N'étant initialisée qu'une fois, sa valeur ne change plus...
Pour le reste, il faudrait peut-être que tu t'assures de la validité des valeurs de comparaison : " / " (slash encadré d'espaces) et "FIN" (en majuscules). Les cellules qui contiennent ces valeurs sont exclues. Toutes les autres sont récupérées.
Cordialement.
edit : J'ai écrit le code trop vite !
If .Cells(i, k) <> " / " And .Cells(i, k) <> "FIN" ThenRemplacer Or par And dans cette ligne.
Mais cela ne semble pas suffire à atteindre ton évaluation. Peut-être manque-t-il une condition... ?
Bonjour à tous !
Après d'autres essais, je me suis rendu compte d'une erreur stupide de ma part (MFerrand, j'avais noté "=" au lieu de "<>"...).
Du coup, je bloque sur un autre point. Le problem étant different, je cloture ce sujet et en édite un autre
Merci à tous pour votre aide !