Formule VBA avec (si et alors)

Résolu
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   -  
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

16 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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"?
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
peux-tu partage un fichier qui montre clairement ce que doit faire la "formule"?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour yg_be,

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

Je travaille sur Excel 2010.

Cordialement,

Zizou
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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.
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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?
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
ce serait plus clair si tu expliquais en français ce que tu voulais obtenir, sans utiliser les formules.
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
tu souhaites donc que, si la cellule contient un des mots suivants (train, train(s), trin, trin(s)), on remplace le contenu par "train"?
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour yg_be,

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

Cordialement,

Zizou
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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?
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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"
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peut-être en faisant
Case 9000, 9100 :
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   1
 
GÉNIAL ça fonctionne super bien.

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

Cordialement,

Zizou
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peut-être en écrivant une nouvelle sub qui appelle les autres sub, et en liant la nouvelle au bouton?
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   1 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention  
 
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é.
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   1 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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
0
zizou026 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   1
 
oui yg_be
0