Traduire une formule si contient une chaine de caractère

Bonjour,

Débutante VBA et novice sur le forum, je me permet de créer ce post car je n'arrive pas à trouver la solution qui permettra à mon code VBA d'effacer le contenu des lignes qui ne contiennent pas la chaine de caractère FR/AWS/.

Le nombre de ligne dans ce fichier sera variable selon les mois.

Exemple de ligne que je pourrais retrouver en colonne I de mon fichier; ces infos seront toujours dans la colonne I de l'onglet "Global".

DIS-FR/Effi'Connect/Body Nature/-PID3136076

DIS-FR/EFFICONNECT/EL QARIB-PID4668989

FR/AVRIL/FONDANAYCHE

FR/AVRIL/PRADELLE

FR/AWS/ACB - CP1433391/calip / ACB

FR/AWS/ACB - CP1433391/Webex

FR/AWS/APAVE ALSACIENNE .../ApogeeOne

FR/AWS/APAVE ALSACIENNE .../Point projet LHOTELLIE

Voici les pistes que j'ai explorées :

- Piste 1 : créer une colonne J qui me permettrait d'identifier les cellules de la colonne I qui contiennent FR/AWS/

Attention mon tableau est préformaté au format texte, c'est pourquoi j'ai commencé par le mettre au format standard afin de pouvoir écrire une formule.

Sub isoler FR ()

Columns(10).Insert

Range("J:J").NumberFormat = "General"

Range("J2").FormulaLocal = "=SI(ESTNUM(CHERCHE("FR/AWS/";I2));I2;"")"

End Sub

Résultat : message Erreur Execution' 1004' : Erreur définie par l'application ou par l'objet. Du coup je n'ai pas tenté d'étirer ma formule vers le bas pour identifier toutes les lignes qui pourraient répondre au critère d'application de la formation. J'utiliserai le code suivant pour le faire

Dim derniere_ligne As Long

derniere_ligne = onglet.Cells(Rows.Count, 1).End(xlUp).Row

Range.("J2:J" & derniere_ligne).FillDown

- Piste 2 : Isoler directement dans la colonne I, les cellules qui contiennent "FR/AWS/" et effacer le contenu. Ne cherchant pas à écrire une formule, j'ai laissé la colonne au format texte.

Sub Supp FR ()

Dim Plage As Range

Set Plage = Range("I2:I" & Range("I2").End(xlDown).Row)

If Not Left(Plage, 7) Like "FR/AWS/" Then

Range("I2:I" & Range("I2").End(xlDown).Row).ClearContents

End if

End Sub

Résultat : aucun message d'erreur mais rien ne se passe sur la colonne I

D'avance merci pour votre aide et si je ne suis pas assez clair, n'hésitez pas à me poser toutes les questions qui vous permettraient de m'aider

Bonne journée,

Rachel

Bonjour,

Pour commencer, l'intérêt de VBA est notamment de se détacher d'Excel et ses formules. En clair, inutile d'écrire une formule Excel valide, seul le résultat nous intéresse.

A noter aussi que l'écriture d'une formule Excel dans VBA se fait sous forme de texte, donc encadré par des guillemets. Pour inscrire des guillemets dans la formule, il faut les doubler : =(A1="") devient "=(A1="""")".

Votre deuxième solution ne peut pas fonctionner non plus, car vous cherchez à travailler directement sur une plage complète, alors qu'il faudrait travailler cellule par cellule. En clair, faire If Plage = "Texte" Then... est incorrect, à l'inverse de If Cellule = "Texte" Then....

Concernant votre demande, une suggestion :

Sub Test()

Dim Lig As Long, DerLig As Long

Application.Calculation = xlCalculationManual
With Sheets("NomFeuille") 'Nom a adapter
   DerLig = .Range("I" & Rows.Count).End(xlUp).Row
   For Lig = 2 To DerLig
       If .Range("I" & Lig) Like "*FR/AWS/*" Then .Range("I" & Lig).ClearContents
   Next Lig
End With
Application.Calculation = xlCalculationAutomatic

End Sub

Bonjour Pedro22

Merci beaucoup pour tes explications.

Pourrais-tu m'éclairer sur les 2 points suivants :

  • la signification de Application.Calculation = xlCalculationAutomatic
  • pourquoi as tu mis des points sur les codes suivants :
DerLig = .Range("I" & Rows.Count)

If .Range("I" & Lig)

Voici le code tel que je l'ai écris et qui m'engendre le message Erreur de compilation : Next sans For

Dim Lig As Long, DerLig As Long

Application.Calculation = xlCalculationManual

With Sheets("Onglet")

DerLig = .Range("I" & Rows.Count).End(xlUp).Row

For Lig = 2 To DerLig

If .Range("I" & Lig) Like "*FR/AWS/*" Then

Range("I" & Lig).ClearContents

Next Lig

End With

Application.Calculation = xlCalculationAutomatic

End Sub

- la signification de Application.Calculation = xlCalculationAutomatic

Cette instruction permet de rétablir le calcul automatique des formules Excel, préalablement désactivé en début de macro par une instruction du même type. Cela permet d'éviter de monopoliser les ressources pour évaluer à nouveau les formules à chaque modification faite par la macro sur la feuille. Du coup, l’exécution de la macro est plus rapide.

- pourquoi as tu mis des points sur les codes suivants :

DerLig = .Range("I" & Rows.Count)

If .Range("I" & Lig)

Le point est lié à l'utilisation d'une structure With Truc... End With, qui évite d'alourdir le code et de répéter plusieurs fois un même objet. Exemple :

Sub Démo()

Sheets("MaFeuille").Range("A1") = "Bonjour !"
Sheets("MaFeuille").Range("B1") = Rnd()*1000
Sheets("MaFeuille").Range("C1") = (Sheets("MaFeuille").Range("B1") > 500)
'Peut s'écrire :
With Sheets("MaFeuille")
   .Range("A1") = "Bonjour !"
   .Range("B1") = Rnd()*1000
   .Range("C1") = (.Range("B1") > 500)
End With

End Sub

Voici le code tel que je l'ai écris et qui m'engendre le message Erreur de compilation : Next sans For

Le message d'erreur est trompeur, ce serait plutôt If sans End If !.

Tu peux te passer de End If si tu écris tout sur une seule ligne, comme je l'ai fait :

If .Range("I" & Lig) Like "*FR/AWS/*" Then .Range("I" & Lig).ClearContents

Si tu écris sur plusieurs lignes, il faut matérialiser la fin de l'instruction par un End If :

If .Range("I" & Lig) Like "*FR/AWS/*" Then 
   .Range("I" & Lig).ClearContents
   '...
End If

Bonjour Pedro22,

Désolée pour mon retard tardif, j'étais prise sur un autre sujet.

Merci beaucoup pour ta pédagogie, c'est très clair ! j'ai tout compris

et bien sûr ton code fonctionne

Je te souhaite une excellente journée.

Bonjour Pedro22,

Désolée pour mon retard tardif, j'étais prise sur un autre sujet.

Merci beaucoup pour ta pédagogie, c'est très clair ! j'ai tout compris

et bien sûr ton code fonctionne

Je te souhaite une excellente journée.

Merci du retour, pense à valider le sujet !

Rechercher des sujets similaires à "traduire formule contient chaine caractere"