Formule VBA avec (si et alors)

Signaler
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020
-
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
-
Bonjour,
Je cherche une formule VBA :
Si dans la feuille (onglet 1), on trouve « 9000 » et que dans une phrase on trouve « Train » alors remplacer la phrase par Train.
Par avance, je vous remercie beaucoup de votre aide et bon courage à tous.
Et, je profite de cette demande pour remercier ce forum et toutes les personnes qui m'ont aidées.
Cordialement,
zizou

13 réponses

Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
bonjour,
quand cela devrait-il se passer?
si il y a 9000 n'importe où, il faut remplacer toutes les cellules contenant "Train" par "Train"?
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Re ye_be,
Mes données 1er critère 9000 sont dans la colonne A, la 2ème critère peut être aléatoire.
J'ai environ une douzaine des 1er critères, je ferai un copier coller du formule et l'adapterai à mon fichier.
Merci pour ton aide.
Zizou
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

- une précision les critères à remplacer peuvent être soient dans la colonne J ou Q.
Il se trouve dans ces colonnes certaine cellule peuvent être sans informations.
Mais la colonne A est obligatoirement remplie.
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
peux-tu partage un fichier qui montre clairement ce que doit faire la "formule"?
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonjour yg_be,

Je te joins le fichier https://www.cjoint.com/c/JCynGXyVBXr

Je travaille sur Excel 2010.

Cordialement,

Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
1) il me semble qu'il manque quelques mots dans la phrase suivante:
"Si la A affiche 9000, alors remplacer par Train dans la colonne Q et si vide écrire Train."
2) pourquoi veux-tu faire une fonction et pas une macro?
3) je pense que tu peux utiliser une formule standard pour séparer la date et l'heure de la colonne D et que ça s'inscrit dans la colonne W et X:
=ENT(D4)
en W4 et
=D4-W4
en X4. adapte ensuite les formats pour l'afficher comme tu le souhaites.
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonjour yg_be,
je te remercie pour ta réponse.
J'ai fais le macro pour l'arrondissement :

Sub ardt()
'
' ardt Macro
'

'
Sheets("1").Select
Columns("I:I").Select
Selection.Replace What:="*Paris 10e*", Replacement:="75010", LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Sheets("Accueil").Select
ActiveWorkbook.Save
End Sub

Je ne vois pas trop comment faire avec la condition (SI/ALORS) remplace.
Aurais-tu l'amabilité de me donner un début, je pourrai essayer de l'appliquer.

pour ce qui concerne la séparation date c'est noté.

Je te remercie et je te souhaite une excellente journée.

Cordialement,

Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
le code suivant agit en fonction de la valeur en colonne A, sur chaque ligne.
si la valeur est 9000, il vérifie si la valeur sur la même ligne en colonne J ou Q est vide. si oui, il remplace la valeur vide par "Train".
j'ai déjà préparé la détection de la valeur 7300 en colonne A, il suffit d'ajouter en dessous ce que tu veux faire dans ce cas-là.
je n'ai pas compris la phrase "remplacer par Train dans la colonne Q".
Option Explicit

Sub repp()
Dim code As Range, ligne As Long, feuille As Worksheet
Set feuille = Sheets("1")
For Each code In feuille.[A:A]
    ligne = code.Row
    Select Case code
        Case 9000:
            If feuille.Cells(ligne, "J") = "" Then
                feuille.Cells(ligne, "J") = "Train"
            End If
            If feuille.Cells(ligne, "Q") = "" Then
                feuille.Cells(ligne, "Q") = "Train"
            End If
        Case 7300:
        
    End Select
Next code
End Sub


il est recommandé de ne pas utiliser active et select, je suggère ceci pour ton autre macro:
Sub ardt()
'
' ardt Macro
'

'
Sheets("1").Columns("I:I").Replace What:="*Paris 10e*", Replacement:="75010", LookAt:= _
    xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
ThisWorkbook.Save
End Sub
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonjour ye_be,

Ta formule fonctionne mais bizarrement en partie seulement, c'est à dire sur environ 200 cellules j'obtiens seulement 19 résultats sur la colonne J et 1 sur Q.
Question : concernant la colonne Q, je souhaiterai le mot sois inscrit si le mot concerné est dans la phrase ex : le wagon du train (seul le mot train s'inscrit dans la cellule).
Merci beaucoup ye_be et et souhaite une excellente journée.
cordialement,
Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
peut-être ceci pour remplacer la cellule par "train" si "train" y est présent:
Sub repp()
Dim code As Range, ligne As Long, feuille As Worksheet
Set feuille = Sheets("1")
For Each code In feuille.[A:A]
    ligne = code.Row
    Select Case code
        Case 9000:
            If feuille.Cells(ligne, "J") = "" Then
                feuille.Cells(ligne, "J") = "Train"
            End If
            If feuille.Cells(ligne, "Q") = "" Then
                feuille.Cells(ligne, "Q") = "Train"
            End If
            If InStr(feuille.Cells(ligne, "J"), "train") > 0 Then
                feuille.Cells(ligne, "J") = "train"
            End If
            If InStr(feuille.Cells(ligne, "Q"), "train") > 0 Then
                feuille.Cells(ligne, "Q") = "train"
            End If
        Case 7300:
        
    End Select
Next code
End Sub


"formule fonctionne mais bizarrement en partie seulement": à quel endroit vois-tu une anomalie?
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonjour yg_be,

je crois avoir trouver le petit bug.

Le mot train : est saisi (train, trains, trin, trins).
est ce possible d"écrire la formule comme suit :

If feuille.Cells(ligne, "Q") = "" Then
feuille.Cells(ligne, "Q") = "Train; Trains, Trin, Trins" ?

Je te remercie beaucoup.

Cordialement,

Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
ce serait plus clair si tu expliquais en français ce que tu voulais obtenir, sans utiliser les formules.
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Excuse moi, j'ai repris ta formule pour que je me retrouve.

le saisi du mot train se fait : train, train(s), trin, trin(s).

Cordialement,

Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
tu souhaites donc que, si la cellule contient un des mots suivants (train, train(s), trin, trin(s)), on remplace le contenu par "train"?
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonjour yg_be,

Oui c'est exactement ça. :) Encore merci de ton aide.

Cordialement,

Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
alors peut-être ceci:
Option Explicit
Const ctrains As String = "train,trains,trin,trins"
Sub repp()
Dim code As Range, ligne As Long, feuille As Worksheet
Set feuille = Sheets("1")
For Each code In feuille.[A:A]
    ligne = code.Row
    Select Case code
        Case 9000:
            If feuille.Cells(ligne, "J") = "" Then
                feuille.Cells(ligne, "J") = "Train"
            End If
            If feuille.Cells(ligne, "Q") = "" Then
                feuille.Cells(ligne, "Q") = "Train"
            End If
            If plus(feuille.Cells(ligne, "J"), ctrains) Then
                feuille.Cells(ligne, "J") = "train"
            End If
            If plus(feuille.Cells(ligne, "Q"), ctrains) Then
                feuille.Cells(ligne, "Q") = "train"
            End If
        Case 7300:
        
    End Select
Next code
End Sub
Private Function plus(phrase As String, mots As String) As Boolean
Dim mot
For Each mot In Split(mots, ",")
    If InStr(phrase, mot) > 0 Then
        plus = True
        Exit Function
    End If
Next mot
plus = False
End Function
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonsoir ye_be,

ça fonctionne sur la colonne Q (la colonne J ne réagit pas). Franchement merci beaucoup.

Je fais le nécessaire sur le vrai fichier et je te tiens informé.

Cordialement,

Zizou
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

Bonjour ye_be,

ça fonctionne MERCI BEAUCOUP.

Dans l'exemple d'écriture (train, train(s), trin, trin(s)), j'ai remarqué que l'écriture doit être parfait c'est à dire train(s)/TRAIN(S)/Train(s) ce qui fait déjà 6 distinctions pour le mot train. J'ai essayé d'accumuler les mots mais il bloque à 11 mots.

Question : serait-il possible que la formule prends en compte quelque soit la manière de saisi du mot Train? La base réelle contient déjà 12 mots.

Ou créer un nom Train qui pourrait contenir (train, train(s), trin, trin(s), wagon...) et l'associé dans ta formule.

Cordialement,
Zizou
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
tu écris "J'ai essayé d'accumuler les mots mais il bloque à 11 mots.".
je ne sais pas ce que tu as essayé, et je ne comprends pas "il bloque à 11 mots": qui fait quoi quand et comment?
Messages postés
32
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
1 avril 2020

C'est au bout de la ligne que ça (bloque), j'ai essayé de faire entrée pour la continuité du saisi des mots, là j'ai eu un bug.

Par avance excuse moi, si je ne suis pas clair.
yg_be
Messages postés
10253
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 avril 2020
577
je ne sais pas ce que tu as essayé, ma boule de cristal est embrumée.

tu peux travailler ainsi sur plusieurs lignes:
Const ctrains As String = "train,trains" _
    + ",trin,trins"