Conversion en VBA

Résolu
Maksime568 Messages postés 145 Statut Membre -  
ccm81 Messages postés 11033 Statut Membre -
Bonjour,

je souhaiterais intégrer en VBA cette formule:
=SI(OU(P7<>"";Q7<>"");SI(OU(P7="HS";Q7="HS");"NOK";"OK");"")
dans la case O7.

je début en VBA, ça me permettrais de comprendre la base de départ pour ensuite me lancer dans du plus compliquer.
il y a énormément de ligne dans mon tableau, et ça m'embête à chaque création de nouvelle ligne de devoir tirer la formule vers le bas(car j'en ai d'autre des formules et ce n'est pas toujours moi qui ajoute des lignes).
j'ai tenté une vulgaire macro de copier/coller de formule mais ayant plein de formules longues, plein de lignes et plein de feuilles au finales je m'en sortais avec un fichier excel de 50Mo.....
j'espère ainsi alléger mon fichier grâce à ça.

Merci

7 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour à tous les deux

    Et pour boucler sur plusieurs lignes

    Dim li1 As Long, li2 As Long, li As Long
    li1 = 4
    li2 = 15
    For li = li1 To li2
      If Range("P" & li).Value & Range("Q" & li).Value = "" Then
        Range("O" & li).Value = ""
      Else
        If Range("P" & li).Value = "HS" And Range("Q" & li).Value = "HS" Then
          Range("O" & li).Value = "NOK"
        Else
          Range("O" & li).Value = "OK"
        End If
      End If
    Next li

    Cdlmnt
    1
    1. Maksime568 Messages postés 145 Statut Membre
       
      Merci,
      créer la base ça va je m'en sors.
      Mais pour faire le bouclage après sur plusieurs lignes j'ai du mal. (j'ai le bouquin prog VBA pour les nuls mais j'ai pas fini de le lire et je suis pas encore au bouclage. ^^
      si je comprend bien ici, li1=4 est ma première ligne et li2=15 est ma dernière ligne?
      sur mon tableau j'ai plusieurs milliers de lignes.
      Qu'est ce qui est le plus simple et le moins lourd:
      - mettre li2 = une très grande valeur?
      - faire une macro qui voit lorsque qu'il y a une nouvelle valeur en E me rajoute cette macro précédente?
      mon fichier faisant déjà 5Mo j'aimerais ne pas trop l'alourdir si c'est possible.
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    1. si je comprend bien ici, li1=4 est ma première ligne et li2=15 est ma dernière ligne?
    C'est çà
    2. Qu'est ce qui est le plus simple et le moins lourd:
    - mettre li2 = une très grande valeur?
    - faire une macro qui voit lorsque qu'il y a une nouvelle valeur en E me rajoute cette macro précédente?

    Ce que je crois comprendre
    2.1. Tu as un gros fichier avec beaucoup de formules, tu veux l'alléger en remplaçant les formules par leur résultat via vba
    La macro le fait, elle sera exécutée une seule fois et traitera l'ensemble des lignes depuis li1 jusqu'à li2
    Tu peux ajouter histoire de réduire le temps d'exécution
    - en début de procedure (avant For ...)
    Application.ScreenUpdating = False
    pour désactiver la mise à jour de l'écran
    - en fin de procedure (avant End)
    Application.ScreenUpdating = True
    Pour mettre à jour l'écran
    2.2. Pour la suite, tu vas ajouter des lignes et tu veux que lorsque la colonne E (ligne li2+1) est remplie, une autre macro te calcule les valeurs en ligne li2+1
    C'est ça?
    1
    1. Maksime568 Messages postés 145 Statut Membre
       
      en 2.1: oui j'ai un gros fichier avec beaucoup de lignes contenant chacune beaucoup de formule (ci-joint un exemple de mes formules en O, R, S T et W)
      http://www.cjoint.com/confirm.php?cjoint=0CxlOQaCBUI
      2.2: oui. Mais ce n'est pas forcément moi qui rajoute des lignes, j'aimerais simplifier au maximum ces étapes. à l'heure actuelle je tire les formules vers le bas en prenant de l'avance et ça va. mais c'est rébarbatif, et quand je suis en retard pour le faire on me dit "ça marche pas".

      quelques questions, tu sauras peut-être me répondre:
      en vba, est-ce plus simple de faire en sorte que excel repère l'ajout de nouvelle lignes et ainsi lance les formules?
      sachant que la personne va rajouter des lignes puis remplir un à un les valeurs dans P et Q par exemple. La formule devrait donc rester active le temps que la personne remplisse les cellules.
      Si je comprend bien tu me propose plutôt de faire en sorte de d'abord remplir les cellules et ensuite demander à la macro de calculer?
      Je pourrais éventuellement faire un bouton "Calcul" afin de lancer les formules ce serait faisable, dommage j'appréciais le faite d'avoir le résultat sitôt une valeur entrée.

      Je souhaiterais prochainement automatiser l'ajout de nouvelles lignes.
      Maintenant, la personne doit ajouter quelques champs et ensuite tirer ces champ vers le bas afin de les copier et d'en incrémenter certains.
      Je pense qu'un bouton d'ajout avec quelques champs à remplir serait-plus simple mais ça me demanderas un peu de temps.
      Peut-être que, avec ta vision de programmateur, tu saurais me dire si plus tard, le fait d'ajouter un bouton rajoutant des lignes serait à coupler avec ma demande actuelle et simplifierait l'ensemble?
      Je ne sais pas si ma demande est claire?
      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    0. Désolé, je ne peux pas lire ton fichier, peux tu l'envoyer au format excel 2003, sans la macro
    2.1. oui j'ai un gros fichier avec beaucoup de lignes contenant chacune beaucoup de formule
    oui quoi ? tu veux exécuter la macro ?
    Si oui, fais le (sur une copie partielle dans un premier temps bien sûr) et vérifies que tout s'est bien passé
    2.2. On peut très bien automatiser la maj d'une ligne dès qu'une cellule (d'une colonne à fixer) est remplie, c'est à la procédure
    Worksheet_Change(ByVal Target As Range)
    de réagir à l'évènement : changement de valeur dans E26 par exemple
    On peut aussi lancer cette maj via un bouton, un double-clic sur une cellule, un raccourci clavier, etc ...
    1
    1. Maksime568 Messages postés 145 Statut Membre
       
      voila au bon format: http://www.cjoint.com/confirm.php?cjoint=0CxnsH7tWxy
      en 2.1: je vais tenter de la lancer déjà voir si ça fonctionne bien. ;)

      en point 2.2:
      si j'ajoute une valeur en E21, je n'ajouterais des valeur en P21 et Q21 que plus tard, mais par contre je souhaiterais que ma macro ne se lance donc qu'après avoir entré des valeurs en P et Q.
      0
    2. Maksime568 Messages postés 145 Statut Membre
       
      la macro fonctionne parfaitement en lancement manuel. ;)
      0
  4. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Désolé, tu n'as pas pris le bon format, il me le faut en .xls

    je souhaiterais que ma macro ne se lance donc qu'après avoir entré des valeurs en P et Q.
    Dons lorsque P et Q sont remplies toutes les deux ?
    1
    1. Maksime568 Messages postés 145 Statut Membre
       
      désolé, je vais finir par y arriver:
      http://www.cjoint.com/data/0CxpOjUuRg3.htm

      Oui, en gros quand P et Q sont remplis, mais parfois Q n'est pas rempli.
      Mais en fait je viens de voir que ma formule pourrais être légèrement modifiée.
      On pourrait mettre O = vide si P= vide
      et O = HS si P = HS.
      O = OK si P contient une valeur numérique.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    en attendant, voilà ce que ça peut donner
    https://www.cjoint.com/?3CxpTyQwxRW
    1
    1. Maksime568 Messages postés 145 Statut Membre
       
      Ah merci.
      J'ai retravaillé l'ensemble d'après ce que tu m'as fait:
      Option Explicit

      Public Sub MAJcO()
      Dim li1 As Long, li2 As Long, li As Long
      li1 = 4
      li2 = 15
      For li = li1 To li2
      If Range("P" & li).Value & Range("Q" & li).Value = "" Then
      Range("O" & li).Value = ""
      Else
      If Range("P" & li).Value = "HS" Then
      Range("O" & li).Value = "NOK"
      Else
      If IsNumeric(Range("P" & li).Value) Then
      Range("O" & li).Value = "OK"
      End If
      End If
      End If
      Next li
      End Sub

      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim li As Long
      If Not Intersect(Target, Columns("P:Q")) Is Nothing Then
      Application.EnableEvents = False
      li = Target.Row
      If Range("P" & li) <> "" Then
      If Range("P" & li).Value = "HS" Then
      Range("O" & li).Value = "NOK"
      If IsNumeric(Range("P" & li).Value) Then
      Range("O" & li).Value = "OK"
      Else
      Range("O" & li).Value = ""
      End If
      End If
      End If
      Application.EnableEvents = True
      End If
      End Sub


      voilà les modif.
      par contre désolé mais je ne comprend pas le "worksheet_change..."
      je l'ai modifié et je pense que ce n'était pas à faire.
      Je pense que ma formule avec les conditions modifiées dans le post plus haut simplifie les choses.
      C'est dingue. Des formules utilisées depuis longtemps parfois on se rend compte qu'elle sont bien simplifiable.
      0
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    1. Tu peux simplifier un peu le code de la procédure MAJ.
    RQ1. La colonne Q n'intervient plus, mais si ça te va, pas de pb

    Public Sub MAJCol()
    Dim li1 As Long, li2 As Long, li As Long
    li1 = 4
    li2 = 15
    For li = li1 To li2
      If Range("P" & li).Value & Range("Q" & li).Value = "" Then
        Range("O" & li).Value = ""
      ElseIf Range("P" & li).Value = "HS" Then
         Range("O" & li).Value = "NOK"
      ElseIf IsNumeric(Range("P" & li).Value) Then
         Range("O" & li).Value = "OK"
      End If
    Next li
    End Sub

    2. par contre désolé mais je ne comprend pas le "worksheet_change..." je l'ai modifié et je pense que ce n'était pas à faire.
    Cette procédure agit uniquement sur la ligne qui vient d'être modifiée en colonnes P:Q ( li = Target.Row). Donc il faut bien la modifier
    RQ2. Idem RQ1
    1
    1. Maksime568 Messages postés 145 Statut Membre
       
      mais elle sert à quoi cette procédure exactement?
      j'arrive pas à comprendre comment elle tourne, notamment pour ce qui suit
      If Not Intersect(Target, Columns("P:Q")) Is Nothing Then
        Application.EnableEvents = False
      0
    2. ccm81 Messages postés 11033 Statut Membre 2 434
       
      1. Cette procédure, comme son nom l'indique, réagit a tout changement dans la feuille. Toi tu ne veux faire quelque chose que si la changement se fait en colonne Q donc, si la cellule cible (target : celle qui a changée dans la feuille) est dans une des colonne P ou Q alors on fait
      2. Tu peux supprimer les deux lignes
      Application.EnableEvents = false  et true

      3. Tu peux aussi te contenter de
      If Not Intersect(Target, Columns("P")) Is Nothing Then 

      si la colonne Q n'intervient plus
      0
    3. Maksime568 Messages postés 145 Statut Membre
       
      En fait là si je met uniquement la colonne P et que j'ajoute une valeur en P et bien rien ne se passe.
      Sauf si je relance manuellement la macro.
      Si je met tout le second bloque en commentaire la macro se déroule bien tout de même.
      Est-ce normal que ces deux procédures soit dans deux sub différents?
      0
    4. ccm81 Messages postés 11033 Statut Membre 2 434
       
      En fait là si je met uniquement la colonne P et que j'ajoute une valeur en P et bien rien ne se passe. Sauf si je relance manuellement la macro.
      De quelle macro parles tu ?
      Ici la macro Wokssheet_Change déclenchée uniquement par un cahnement en colonne P
      https://www.cjoint.com/?3CyoGI2RbKr
      0
    5. Maksime568 Messages postés 145 Statut Membre
       
      http://www.cjoint.com/data/0CypU5HVB2V.htm
      je ne comprend pas pourquoi cela ne fonctionne pas sur mon fichier.
      il me semble pourtant que la copie est bonne mais si j'ajoute une valeur je n'ai pas automatiquement un lancement de la macro pour la ligne en question
      0
  8. eljojo_e Messages postés 1255 Statut Membre 155
     
    Bonjour,
    La formule "traduite" en vba donne :

    Sub calculs
    if [P7] <> "" or [Q7] <>"" then
    if [P7] = "HS" or [Q7] = "HS3 then
    [O7] = "NOK"
    else
    [O7] = "OK"
    end if
    end if
    end sub


    Ca va calculer un fois. Tu devra relancer la macro pour refaire le calcul.
    0