Boucle et remplacement de valeur

Bonjour,

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)

J

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.

Hello,

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

Fichier test : test1.xlsm (14,2 Ko)

Cela peut-il venir du début de ma macro ?

Cf.

    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

Bonjour

A tester avec ce code

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

Re,

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]

Merci

J’avais essayé d’utiliser quelque chose comme

If Iserror(Cells(z, 3) Then

Ou même avec un argument Else, mais sans résultats

Re,

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

Et je ne suis pas encore devin

Re,

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

Re,

Teste comme ceci

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étails pour une bonne lecture : http://silkyroad.developpez.com/VBA/GestionErreurs/#LIII-A-3.

Bonjour WildDigiSoft,

Oui pas de soucis, je connais, mais comme il y a déjà un FORMULA, c’est plus rapide pour moi de l’incorporer dans la formule :wink:

En effet mieux vu le contexte :wink:

Bonjour @Mimimathy et @WildDigiSoft,

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).

Bonjour

Si ton problème est résolu, peux-tu stp cocher le petit :white_check_mark: sous le message qui contient la solution stp?

Cela nous aide à déterminer qui a encore besoin d’aide et qui est sauvé!

Merci