Formule VBA avec (si et alors) [Résolu]

Signaler
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
-
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 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

16 réponses

Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
- 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
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
peux-tu partage un fichier qui montre clairement ce que doit faire la "formule"?
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
Bonjour yg_be,

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

Je travaille sur Excel 2010.

Cordialement,

Zizou
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
ce serait plus clair si tu expliquais en français ce que tu voulais obtenir, sans utiliser les formules.
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
Bonjour yg_be,

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

Cordialement,

Zizou
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
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.
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
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"
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
Bonjour yg_be,

Même embrumée ta boule de cristal fonctionne merveilleusement bien.

J'intègre ta formule dans la base réelle. Encore merci.

Cas particulier :
Question : serait-il possible d'affecter 2 références pour les même critères?

Exemple : 9000 = train, 9100 = locomotive.

Je souhaite réunir 9000 et 9100 pour dire que c'est train.

Cordialement,

Zizou
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
peut-être en faisant
Case 9000, 9100 :
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
GÉNIAL ça fonctionne super bien.

J'ai plusieurs modules, comment les regrouper par un bouton? Sans abuser de ta gentillesse.

Cordialement,

Zizou
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659
peut-être en écrivant une nouvelle sub qui appelle les autres sub, et en liant la nouvelle au bouton?
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1 >
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020

Bonjour yg_be,

j'ai essayé :

Sub Bouton1 (Clic)
Call Module1
End Sub

ça demande l'affectation d'un Sub.

Est ce qu'est la bonne méthode?

Par avance, je te remercie de ton aide.

Cordialement,

Zziou
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020
659 >
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020

je ne sais pas ce qu'est Module1, mais Call sert à appeler des sub, pas des modules.
un module contient différents composants, et n'est pas fait pour être appelé.
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1 >
Messages postés
11549
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
14 juillet 2020

Merci beaucoup pour ta réponse ye_be, je ne veux pas abuser de ta gentillesse.
Encore mille merci. Tu m'as beaucoup aidé.
Bien cordialement,
Zizou
Messages postés
50
Date d'inscription
dimanche 1 février 2009
Statut
Membre
Dernière intervention
14 juillet 2020
1
oui yg_be