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 SubBonjour 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 :
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 SubVoici 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).ClearContentsSi 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 IfBonjour 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.