Formule VBA avec (si et alors)

Résolu
zizou026 Messages postés 102 Statut Membre -  
zizou026 Messages postés 102 Statut Membre -
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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  2. zizou026 Messages postés 102 Statut Membre 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
  3. zizou026 Messages postés 102 Statut Membre 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
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    peux-tu partage un fichier qui montre clairement ce que doit faire la "formule"?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zizou026 Messages postés 102 Statut Membre 1
     
    Bonjour yg_be,

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

    Je travaille sur Excel 2010.

    Cordialement,

    Zizou
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  7. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  8. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  9. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      ce serait plus clair si tu expliquais en français ce que tu voulais obtenir, sans utiliser les formules.
      0
  10. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  11. zizou026 Messages postés 102 Statut Membre 1
     
    Bonjour yg_be,

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

    Cordialement,

    Zizou
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  12. zizou026 Messages postés 102 Statut Membre 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
  13. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  14. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  15. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peut-être en faisant
      Case 9000, 9100 :
      0
  16. zizou026 Messages postés 102 Statut Membre 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peut-être en écrivant une nouvelle sub qui appelle les autres sub, et en liant la nouvelle au bouton?
      0
      1. zizou026 Messages postés 102 Statut Membre 1 > yg_be Messages postés 23437 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
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > zizou026 Messages postés 102 Statut Membre
         
        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
      3. zizou026 Messages postés 102 Statut Membre 1 > yg_be Messages postés 23437 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
  17. zizou026 Messages postés 102 Statut Membre 1
     
    oui yg_be
    0