Fonction goto ?
Bonjour,
J'ai une macro qui va chercher une valeur d'un fichier 1 dans un fichier 2. Seulement lorsque le résultat est "Nothing" j'ai une erreur à l'avant dernière ligne (Set feuveille = Sheets(nomonglet2).Range("G" & resultat.Row) ) justement car le résultat est Nothing et donc il ne trouve pas Range("G" & resultat.Row).
comment résoudre ce problème ?
Merci d'avance.
Sub Pilotage_des_feux()
'
' Pilotage_des_feux Macro
'
'déclaration des variables
Dim resultat As Range
Dim valeur As Range
Dim feujour As Range
Dim feuveille As Range
Dim dateorange As Range
Dim datevert As Range
Dim MyFiles() As String
Windows("Pilotage des Feux test.xlsm").Activate
Worksheets("Feuil1").Activate
chemin = Worksheets("Feuil1").Range("A2").Value 'chemin où sont les fichiers
chemin2 = Worksheets("Feuil1").Range("A4").Value 'chemin du fichier matrice
fichier2 = Worksheets("Feuil1").Range("B4").Value 'Fichier matrice
fichier = Dir(chemin)
'ouverture du fichier matrice
ChDir "" & chemin2 & ""
Workbooks.OpenText Filename:= _
"" & chemin2 & "" & fichier2 & ".xls"
'On récupère le nom de l'onglet dans une variable
nomonglet2 = ActiveSheet.Name
'On boucle dans le répertoire définit pour réucpérer tous les fichiers qui sont présents
Do While fichier <> ""
ReDim Preserve MyFiles(j)
MyFiles(j) = fichier
j = j + 1
fichier = Dir()
Loop
Workbooks.Open chemin & MyFiles(0) 'on ouvre le 1er fichier du répertoire
'For j = LBound(MyFiles) + 1 To UBound(MyFiles)
For j = LBound(MyFiles) To UBound(MyFiles) 'on va ouvrir les fichiers du répertoire définit au fur et à mesure pour faire les tests
Workbooks.Open chemin & MyFiles(j)
nomonglet = ActiveSheet.Name 'on récupère le nom de l'onglet dans une variable
Sheets(nomonglet).Activate
pgmitim = "PGM_ ITIM SURVEILLANCE FEU " 'permettra ensuite de récupérer la date de fichier du jour par rapport au nom du fichier du jour
Columns("H:I").EntireColumn.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'on ajoute 2 colonnes H et I pour pouvoir faire le copier/coller dans le fichier matrice avec le même nombre de colonnes
'Permet de récupérer la date J-1 du fichier du jour (ex : PGM_ ITIM SURVEILLANCE FEUX 20092018, on récupère 19/09/2018)
datewb = Replace(Replace(MyFiles(j), pgmitim, ""), ".xls", "")
datewb = DateSerial(Right(datewb, 4), Mid(datewb, 3, 2), Left(datewb, 2)) - 1
'on compte le nombre de lignes du fichier
Range("A4").Select
Selection.End(xlDown).Select
fin = ActiveCell.Row
For i = 4 To 11 'On va de la valeur 2 à la valeur fin
Set valeur = Sheets(nomonglet).Cells(i, 1) 'la variable valeur aura comme résultat i = 4 à fin et 1 = colonne A (donc A4 à A"fin") - càd n° de référence unique sur lequel on fera la recherche
Set feujour = Sheets(nomonglet).Cells(i, 7) 'la variable feujour aura comme résultat i = 4 à fin et 7 = colonne G (donc G4 à G"fin")
' Orange = "H" & i & "" 'Orange servira à aller sur la case H4 à H"fin"
' Vert = "I" & i & "" 'Vert servira à aller sur la case I4 à I"fin"
Windows("" & fichier2 & ".xls").Activate 'On va sur le fichier matrice
Set resultat = Sheets(nomonglet2).Columns(1).Find(What:=valeur, LookAt:=xlWhole, MatchCase:=False) 'On fait un find sur le fichier matrice pour trouver la donnée "valeur"
Set feuveille = Sheets(nomonglet2).Range("G" & resultat.Row) 'on récupère la valeur de la case G4 à G"fin"
feuveille = Range("G" & resultat.Row).Value
Bonjour,
Faut-il ignorer l'erreur ? Ou la traiter d'une autre façon ?
S'il faut l'ignorer, On Error Resume Next
deviendra ton ami
Bonjour,
je propose :
...
For i = 4 To 11 'On va de la valeur 4 à la valeur fin
...
Windows("" & fichier2 & ".xls").Activate
Set resultat = Sheets(nomonglet2).Columns(1).Find(What:=valeur, LookAt:=xlWhole, MatchCase:=False)
If Not resultat Is Nothing Then
Set feuveille = Sheets(nomonglet2).Range("G" & resultat.Row)
feuveille = Range("G" & resultat.Row).Value
...
End If
...
Next i
dhany
Merci SlimShady69 et dhany pour vos retours
J'ai choisi l'option On Error Resume Next
Merci encore.
Bonjour le Fil,
Si je peux me permettre, la solution de dhany (que je salue) est la meilleure
"On Error Resume Next" te jouera des tours, à moins de mettre pas loin après "On error Goto 0"
mais c'est comme tu veux
Le problème c'est que la suite de ma macro utilise la variable feuveille, c'est pour ça que je préfère On Error Resume Next.
A la ligne If Not resultat Is Nothing And feujour = "Feu vert Arrivée" And feuveille = "Feu orange Arrivée" Then, du coup si feuveille = Nothing alors ça plante.
If resultat Is Nothing And feujour = "Feu orange Arrivée" Then 'si on ne trouve pas la variable "resultat" dans le fichier matrice et que la case Gx contient "Feu Orange Arrivée" dans le fichier du jour
Windows(MyFiles(j)).Activate 'alors on va sur le fichier du jour, on copie la ligne
Range("A" & i & "").EntireRow.Select
Selection.Copy
Windows("" & fichier2 & ".xls").Activate 'on colle la ligne tout en bas du fichier matrice et on on met la date du fichier jour en colonne Hx
Range("A4").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste
ActiveCell.Offset(0, 7).Select
ActiveCell.Value = datewb
Else
'Set feuveille = Sheets(nomonglet2).Cells(resultat.Row, 7) 'on récupère la valeur de la case G4 à G"fin"
'si on trouve la variable "resultat" dans le fichier matrice et que la donnée "Feu vert Arrivée" du fichier du jour est renseignée
'et que la donnée "Feu orange Arrivée" du fichier matrice est renseignée alors on met la date du fichier du jour dans la case Ix du fichier matrice
If Not resultat Is Nothing And feujour = "Feu vert Arrivée" And feuveille = "Feu orange Arrivée" Then
Set dateorange = Sheets(nomonglet2).Cells(resultat.Row, 8) 'on récupère la valeur de la case H4 à H"fin"
Set datevert = Sheets(nomonglet2).Cells(resultat.Row, 9) 'on récupère la valeur de la case I4 à I"fin"
Windows("" & fichier2 & ".xls").Activate
Range("I" & resultat.Row).Select
Range("I" & resultat.Row).Value = Format(Now - 1, "dd/mm/yyyy")
Range("I" & resultat.Row).Value = datewb
Range("G" & resultat.Row).Select
Range("G" & resultat.Row).Value = feujour
End If
End If
Bonjour Marty15
En regardant ton code d'un peu plus près, je me suis aperçu que tu fais de graves erreurs
1) Il faut mettre "Option Explicit" en début de module pour t'obliger à définir tes variables
2) "Set" n'est à utiliser que lorsque tu définis un variable objet
Or je vois des aberrations comme
Set feuveille = Sheets(nomonglet2).Range("G" & resultat.Row) 'on récupère la valeur de la case G4 à G"fin"
feuveille = Range("G" & resultat.Row).Value
Si tu veux récupérer une valeur, il faut simplement dire
FeuVeille = Sheets(NomOnglet2).Range("G" & Resultat.Row).Value
En définissant la variable correctement
Dim FeuVeille as string
Voilà, c'est juste pour ton info
Bonjour BrunoM45,
Merci pour ces infos.
C'est vrai que je fais un peu n'importe quoi.
En tout cas je note bien tes conseils.
Re,
Faire ça à l'arrache c'est souvent voir toujours source d'ennuies
Un projet quel qu'il soit doit s'étudier avant de commencer et donc apprendre si nécessaire