Je cherche a construire une boucle qui me permet de remplacer mes valeurs dans une colonne en fonction d’un critère.
Le critère est le suivant :
Le mot a remplacer est composé de 8 caractères (soit chiffres, soit lettres)
Si les caractères numéros 2 et 3 sont des chiffres, alors il faut garder les 6 premiers caractères.
Si non, on ne fait rien.
Voilà ce que j’ai pour le moment mais j’ai également une erreur 1004 sur la ligne avec les étoiles.
Sub MEP()
Dim DernLigne As Long
Dim z%
With Worksheets("MAJ")
For z = 500 To DernLigne
If IsNumeric(Right(Left(.Cells(z, 3), 3), 2)) Then
.Cells(z, 3).Value = Left(.Cells(z, 3).Value, 6) 'l'erreur est ici <<<<<<<<
End If
Next z
End With
End Sub
Merci à ceux qui vont se pencher sur le sujet.
EDIT : J’ai également essayé comme suit : .Cells(z, 3).Value = Left(.Cells(z, 3), 6)
Bonjour,
Avec un fichier exemple ce serait mieux.
Je ne vois pas d’erreur dans ton code, sauf si DernLigne est mal initialisé (chose qu’on ne voit pas ici).
Erreur 1004 en general renvoi à une absence d’objet; vérifie si .Cells(z, 3) te fait pas sortir de la feuille a un certain moment.
J’ai posé un espion sur DernLigne (donc le max de z) qui dans mon fichier correspond à 4660 (donc normalement toujours dans la feuille.
Lorsque j’ai créé un fichier test, aucune erreur lors de la macro.
DernLigne est initialisée comme suit :
DernLigne = Worksheets(“MAJ”).Range(“B” & Rows.Count).End(xlUp).Row
Sub MEPCodeSAP()
Dim DernLigne As Long
Dim z%
DernLigne = Worksheets("MAJ").Range("B" & Rows.Count).End(xlUp).Row
With Worksheets("CODESAP")
.Columns("A:G").Delete
.Columns("B:E").Delete
.Columns("C:D").Delete
.Columns("B:B").Cut
.Columns("A:A").Insert Shift:=xlToRight
.Columns("A:A").NumberFormat = "0"
End With
Application.CutCopyMode = False
With Worksheets("MAJ").Range("C2:c" & DernLigne)
.FormulaR1C1 = "=VLOOKUP(RC[-1],CODESAP!C[-2]:C[-1],2,0)"
.Value = .Value
End With
With Worksheets("MAJ")
For z = 2 To DernLigne
If IsNumeric(Right(Left(.Cells(z, 3), 3), 2)) Then
.Cells(z, 3).Value = Left(.Cells(z, 3).Value, 6)
End If
Next z
End With
End Sub
Sub MEP()
Dim DernLigne As Long
Dim z%
With Worksheets("Sheet1")
DernLigne = .Range("A" & Rows.Count).End(xlUp).Row
For z = 1 To DernLigne
If IsNumeric(Mid(Cells(z, 1), 2, 3)) Then 'Equivalent de la fonction STXT d'Excel (choisit les 2ème et 3ème caractéres)
.Cells(z, 1).Value = Left(.Cells(z, 1).Value, 6)
Next z
End With
End Sub
La macro marche correctement, mais un autre problème en découle.
Dans mon message juste au dessus du votre il y a toute la macro.
A un moment j’utilise la fonction Recherchev (Vlookup) dans ma colonne C pour y attribuer une valeur. Mais certaines valeurs sont introuvables et la fonction m’affiche donc #N/A.
La suite de la macro bug car #N/A n’est surement pas correctement lu par Excel et me donne une erreur 13 sur ma ligne :
If IsNumeric(Right(Left(.Cells(z, 3), 3), 2)) Then
seulement dans les cellules avec #N/A.
Est-il possible de rajouter un quelconque IFERROR dans cette formule pour éviter les erreurs ?
With Worksheets("MAJ").Range("C2:c" & DernLigne)
.FormulaR1C1 = "=VLOOKUP(RC[-1],CODESAP!C[-2]:C[-1],2,0)"
[...etc]
Oui mais tu donnes un classeur qui ne correspond depuis le départ avec ton module ???
Car tu fais une recherche dans une feuille CODESAP qui n’est pas présent dans le classeur fourni
Effectivement, mais c’est le seul moyen que j’ai de partager quelque chose sans des données confidentielles :S De plus le classeur contient une dizaine de modules et de macros toutes liées les unes aux autres. Je voulais donc me limiter à ce qui était utile pour vous et pas vous noyer dans 30 macros (sauf si j’ai omis des informations)
Je vais donc essayer d’être le plus précis possible. Si ça ne suffit toujours pas j’essayerai de faire ce que je peux pour uploader un fichier
Mon fichier est une liste de mes produits que je souhaite mettre à jour automatiquement avec des données extraites de SAP. La feuille CODESAP contient ainsi tous les codes SAP (le texte formé de 8 caractères) de mes produits et leur code EAN (l’EAN correspond à leur carte d’identité, unique à chaque produit).
La recherche dans la feuille CODESAP me permet donc de trouver ces fameuses chaines de 8 caractères en fonction de l’EAN. Mais certains produits ne sont pas dans la feuille CODESAP, et la recherchev me donne donc des #N/A.
Le problème est que je souhaite passer outre ces #N/A (qui bloquent la macro avec une erreur 13) lorsque je transforme les 8 caractères en 6 caractères.
D’où la question : Comment intégrer dans la formule ci-dessus une condition pour Clearcontents la cellule si Cells(z, 3) = #N/A
Sub MEPCodeSAP()
Dim DernLigne As Long
Dim z%
DernLigne = Worksheets("MAJ").Range("B" & Rows.Count).End(xlUp).Row
With Worksheets("CODESAP")
.Columns("A:G").Delete
.Columns("B:E").Delete
.Columns("C:D").Delete
.Columns("B:B").Cut
.Columns("A:A").Insert Shift:=xlToRight
.Columns("A:A").NumberFormat = "0"
End With
Application.CutCopyMode = False
With Worksheets("MAJ").Range("C2:c" & DernLigne)
.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Feuil1!C[-2]:C[-1],2,0),"""")"
.Value = .Value
End With
With Worksheets("MAJ")
DernLigne = .Range("A" & Rows.Count).End(xlUp).Row
For z = 1 To DernLigne
If IsNumeric(Mid(Cells(z, 1), 2, 3)) Then 'Equivalent de la fonction STXT d'Excel (choisit les 2ème et 3ème caractéres)
.Cells(z, 1).Value = Left(.Cells(z, 1).Value, 6)
Next z
End With
End Sub
Oui en effet .FormulaR1C1 = « =IFERROR » sera l’équivalent de la fonction SIERREUR
En VBA tu peux créer un gestionnaire d’erreur comme suit :
Placer avant la boucle : On Error Resume Next ,pour que la macro continue son chemin et ignore cette ligne.
Désolé de ne pas avoir rep. avant, j’avais une limite de message étant nouveau sur le forum.
La proposition de @Mimimathy semble fonctionner correctement. Un énorme merci pour m’avoir débloqué sur ce problème.
Merci aussi a Wild pour le lien, ca va me faire un peu de lecture comme je ne maîtrise pas encore la gestion des erreurs (indispensable sur des grandes macros à ce que j’ai compris).