Erreur macro incompréhensible
Bonjour,
je dois travailler depuis trop de temps sur ma macro et je ne trouve pas l'erreur ...
voici le code :
Sheets("Importation").Select
If Cells.Find("*") Is Nothing Then
MsgBox "Merci de ne pas laisser l'onglet d'importation vide"
Sheets("Intervention").Select
Else
Sheets("Feuil1").Visible = True
Dim Vligne1, Vligne2 As Integer
Dim Vcode As String
Sheets("Importation").Select
Range("D1").Select
5 If ActiveCell.Value <> "Nom du module" Then
If ActiveCell.Offset(0, 20).Range("A1").Value = "Fin de la feuille" Then
GoTo 100
End If
n = n + 1
Range("D" & n).Select
GoTo 5
Else
If ActiveCell.Offset(0, 3).Range("A1").Value = "recuperation1" Or _
ActiveCell.Offset(0, 3).Range("A1").Value = "recuperation2" Or _
ActiveCell.Offset(0, 3).Range("A1").Value = "recuperation3" Or _
ActiveCell.Offset(0, 3).Range("A1").Value = "recuperation4" Then
Vcode = ActiveCell.Offset(0, 3).Range("A1").Value
n = n + 3
Range("D" & n).Select
Do While ActiveCell.Value = "" Or ActiveCell.Value = "Identifiant"
n = n + 1
Range("D" & n).Select
Loop
Vligne1 = ActiveCell.Row
Do While ActiveCell.Value <> "Nom du module" And Not ActiveCell.Offset(0, 20).Range("A1").Value = "Fin de la feuille"
n = n + 1
Range("D" & n).Select
Loop
Vligne2 = ActiveCell.Row - 1
Range("D" & Vligne1 & ":AO" & Vligne2).Copy
Sheets("Feuil1").Select
If Range("B1").Value = "" Then
Range("B1").Select
ActiveSheet.Paste
Else
Range("B1").Range("A1:L1").End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
End If
ActiveCell.Offset(0, -1).Range("A1:A" & Vligne2 - Vligne1).Value = Vcode
Range("A1").End(xlDown).Select
Do While ActiveCell.Value = Vcode And Not ActiveCell.Address = "$A$1"
If ActiveCell.Offset(0, 1).Range("A1").Value = "" Then
ActiveCell.Rows("1:1").EntireRow.Delete Shift:=xlUp
End If
ActiveCell.Offset(-1, 0).Range("A1").Select
Loop
Sheets("Importation").Select
GoTo 5
Else
n = n + 3
Range("D" & n).Select
GoTo 5
End If
End If
100
Sheets("Feuil1").Select
Range("C:N,P:P,R:X,Z:AD,AF:AM").Delete
With Range("A:F")
Cells.SpecialCells(xlCellTypeConstants).Select
End With
Selection.Copy
Sheets("Intervention").Select
Range("A65536").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Sheets("Feuil1").Select
Cells.Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Sheets("Feuil1").Select
ActiveWindow.SelectedSheets.Visible = False
Mon problème : lors de certaines importations j'ai un message d'erreur. Je pense que cela est dû au fait qu'il peut y avoir dans mon fichier tous les points (recuperation 1, 2, 3 et 4), comme un seul des points, mais parfois aucun. On peut aussi trouver plusieurs fois le même point avec des infos différentes sous chacun...
-> j'espère être assez clair...
Je ne vois pas dans mon code a quel moment j'ai oublié de spécifier cela.
De plus, la phrase "Fin de la feuille", se trouve bien en bas de toutes les copies, seulement, lorsque ma macro bug la macro tourne jusqu'en bas de la feuille au lieu de s'arrêter à cette phrase...
Arrivez vous à voir mon erreur?
Merci d'avance,
Bonsoir,
Je ne sais si cela sera long, mais vous pouvez mettre un point d'arrêt sur l'exécution de votre macro.
Un clic gauche sur le coté gauche de la fenêtre de code et un point rouge apparaît.
Lors de l'exécution de la macro, elle s'arrêtera là où se trouve le point d'arrêt (c'est fait pour ça...) et il vous suffit de faire [F8] pour dérouler pas à pas, avec le curseur de la souris vous pouvez vérifier les valeurs des variables (elles s'affichent dans des infos bulles).
Alors peut-être allez vous trouver d'où vient l'erreur...
@ bientôt
LouReeD
Bonsoir,
Mon problème est bien le suivant, sur tous les fichiers que je test, ma macro fonctionne, cependant, seul 1 fichier fait de la résistance (j'en suis désolé, il est resté au travail, je ne l'ai pas actuellement avec moi).
Je veux donc savoir où j'ai pêché et quelle variable j'ai pu oublier...
Je mets en pièce jointe un exemple qui fonctionne.
Cependant, voici un résumé de ce qu'on peut trouver.
Il y a 3 groupes : "eco", "default" et "return".
Ces 3 groupes rassemblent des modules nommés recuperation, ils sont au nombre maximal de 10 ("recuperation1", "recuperation2" ...). Pour mon importation, seuls les 4 premiers sont importants.
La difficulté que je rencontre réside dans le fait que :
1. les 4 recuperations qu'il me faut peuvent être divisés dans les 3 groupes (donc 3 "recuperation1" à importer)
2. le nombre de lignes entre le nom du module et les données peut varier selon les fichiers
3. il peut très bien y avoir les 10 recuperations dans les 3 groupes, mais également, aucun recuperation qui m'interesse (ni 1, 2, 3 ou 4)
J’espère qu'avec l'exemple ce sera plus clair...
Re bonsoir,
Et bien c'est un peu compliqué, mais avec [F8] j'ai saisi ce que vous cherchiez à faire
L'erreur est du (lorsqu'il n'y a pas de récupération1 2 3 ou 4 à l'instruction suivante :
Cells.SpecialCells(xlCellTypeConstants).Select
S'il n'y a pas de cellule avec des valeurs, alors il y a erreur...
La solution ? Elle est dans le fichier joint
J'ai rajouter aussi le screenUpdating en False et true afin "d'aller plus vite" et éviter de faire scintiller l'écran...
@ bientôt
LouReeD
Nota : j'ai fais un test sans récupération 1 2 3 et 4 et avec plusieurs fois récupération 1 2 3 4 et tout marche bien...
Sinon au niveau du code, il y a peut être trop (beaucoup trop) de select
Sheets(1).select
range("A1").select etc...
A savoir, on peut très bien travailler sur une feuille sans la sélectionner tout comme les cellules :
on est sur la feuille 1 et on veut mettre "Loureed" dans la cellule A1 de la feuille 2 :
Sheets("Feuil2").select
Range("A1").select
Selection.value ="LouReeD"
Ceci est égal à : Sheets("Feuil2").cells(1,1).value = "LouReeD"
et tout cela sans sélection, donc moins d'emprise au niveau de la mémoire...
@ bientôt
Qu'il est fort le LouReeD
Bonsoir,
merci infiniment, je vais tester cela dès mon retour au travail.
Je reviens vers vous dès que possible pour clôturer le sujet.
En tout cas, j'ai lu vos notes dans la macro et je vous en remercie, cela va m'aider pour comprendre mes futurs bugs dans mes futures macros.
Bonne soirée,
Bonjour à tous,
désolé pour le délais de réponse mais je voulais tester plusieurs fichiers avant de valider le bon ou le mauvais fonctionnement de la macro.
Tous les fichiers testés ont parfaitement marché.
Il y en a un seul sur tous qui a fait planter la macro, et je n'y trouve pas de réponse (j'ai pourtant testé le F8) mais je pense que ca me dépasse un peu
Je mets en pièce jointe le fichier incriminé.
De plus, j'ai remarqué que de nombreuses lignes ressortent en double.
Est il possible de les filtrer pour ne copier qu'une ligne par module?
Les doublons entre groupes (= "eco", "default" et "return") sont pratiques mais pas dans un même module (recuperation1, recuperation2...).
Merci d'avance,
Bonne journée,
Bonjour, bonsoir
pour l'erreur c'est par ici :
Range("D" & Vligne1 & ":AO" & Vligne2).Copy
Sheets("Feuil1").Select
If Range("B1").Value = "" Then
Range("B1").Select
ActiveSheet.Paste
Else
Range("B1").Range("A1:L1").End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
End If
ActiveCell.Offset(0, -1).Range("A1:A" & Vligne2 - Vligne1).Value = Vcode
la partie surlignée est fausse : vous demandez de chercher vers le bas (Down) le dernière cellule pleine, mais comme vous partez de B1 plein vous avez en résultat la dernière cellule de la colonne B de sélectionnée, du coup la sélection de la cellule une ligne en dessous provoque une erreur car vous cherchez à atteindre une cellule hors limite (qui n'existe pas !)
donc correction avec :
Else
' l'erreur était là
Range("B65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
End If
là on part d'en bas (65536 ligne pour Excel 2003 et -, sinon 1048576 pour Excel 2007 et +) et on remonte pour trouver la dernière cellule plein et tout de suite on décale d'une ligne vers le bas donc on sélectionne la première cellule vide de la colonne B.
Avez vous excel 2007 ou plus ?
car le fichier joint est en 2007.... je vous met la version 2003
@ bientôt
LouReeD
Nota pour la mise en forme du tableau final, je l'ai transformé en tableau Excel.
Pour ce qui est des doublons, merci d'effectuer une importation est signaler sur la feuille ce que vous aimeriez obtenir
Re - bonsoir
je vous mets en pièce jointe le fichier avec le rendu final.
Dans le fichier d'importation, pour la récupération4 (N° 27, ticket 10) il y a 33 modification faites dessus, ce qui correspond à 33 lignes sur le tableau d'intervention lors du lancement de la macro.
Une seule ligne suffit.
En gros, si on a plusieurs fois le même N° et ticket pour une même récupération, alors on peut supprimer les doublons.
Est ce plus clair?
Merci encore,
bonne soirée,
Et bien voilà, ça commence à ressembler à un truc plutôt bien, non ?
@ bientôt
LouReeD