VBA - Copie cellules selon conditions avec multiplication

Bonjour a tous,

Je viens vers vous car malgré des heures et des heures de recherches sur le forum et autres moteurs de recherches, je n'ai pas trouvé de solution.

Je vous explique le problème:

dans une feuille je rentre les informations concernant les implantation/remplacement de poteaux, je souhaite qu'en fonction des données rentrées en colonne AD et/ou AF cela crée une ou plusieurs nouvelle(s) ligne(s) dans une nouvelle feuille en ne copiant que certaine colonne E en A, G en B, H en D et en F (feuille 2) si c'est pose appui neuf ou remplacement en fonction des données dans les colonne AD ou AF.

En fichier joint un exemple.

Par avance merci

Bonjour,

Une proposition à tester ...

Attention toutefois car une saisie répétée sur une ligne renseignée provoquera une nouvelle écriture en feuille 2.

Cordialement.

8arnaud87.zip (25.61 Ko)

Bonsoir Gyrus,

Merci pour cette réponse très rapide.

Est il possible de mettre un zéro dans la case sans qu'il m'indique "Nombre d'appuis hors limite"?

Est il possible de connaitre aussi la façon de faire, car l'approche me semble bonne mais peut être peaufiné.

Est il possible de faire commencé la formule a partir d'une certaine ligne car mon classeur existe deja?

Désolé pour toutes ces questions mais j'aime bien comprendre les choses et pouvoir les adapter en fonction

Cordialement

Est il possible de mettre un zéro dans la case sans qu'il m'indique "Nombre d'appuis hors limite" ?

Tu peux modifier cette ligne de code :

If Target.Value >= 0 And Target.Value < 100 Then

Ces limites (0 et 100) sont libres et peuvent être modifiées. Il faut toutefois conserver la logique de traitement. Si tu saisis -1 par exemple, il faut que le programme refuse la prise en compte.

Est-il possible de connaitre aussi la façon de faire, car l'approche me semble bonne mais peut être peaufiné ?

La procédure evenementielle utilisée (Worksheet.Change) permet de détecter la modification de valeur dans les colonnes AD et AF.

La ligne étant identifiée, il suffit d'effectuer le nombre de copies indiquées pour les plages définies.

Pour aller plus loin, tu dois me dire quels sont les parties de la procédure qui te posent problème.

Est-il possible de faire commencer la formule a partir d'une certaine ligne car mon classeur existe deja ?

Tu auras compris qu'il ne s'agit pas d'une formule mais d'une procédure VBA.La prise en compte dépend uniquement de la ligne renseignée. Il n'y a pas d'impact sur la partie déjà renseignée (si cette plage n'est pas modifiée).

Tu as raison de chercher à comprendre le programme. Cela te permettra de l'adapter au besoin et t'éviteras une utilisation inappropriée.

Cordialement.

Bonjour gyrus,

Lorsque j'ouvre le fichier, j'active les macros mais dans l'onglet Macro je ne vois aucune macro enregistrée. Est ce normal?

Cordialement

Oui, c'est normal car il ne s'agit pas d'une macro mais d'une procédure évènementielle.

Tu peux la visualiser dans DEVELOPPEUR > Visual Basic > Microsoft Excel Objets - Feuil1 (Feuil1)

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LigneAjout As Long
Dim i As Integer
    If Not Application.Intersect(Target, Range("AD2:AD1000")) Is Nothing Or _
        Not Application.Intersect(Target, Range("AF2:AF1000")) Is Nothing Then
        If Target.Count = 1 And IsNumeric(Target) Then
            If Target.Value > 0 And Target.Value < 100 Then
                With Worksheets("Feuil2")
                    For i = 1 To Target.Value
                        LigneAjout = .Range("A" & Rows.Count).End(xlUp).Row + 1
                        .Range("A" & LigneAjout) = Range("E" & Target.Row).Value
                        .Range("B" & LigneAjout) = Range("G" & Target.Row).Value
                        .Range("D" & LigneAjout) = Range("H" & Target.Row).Value
                        If Target.Column = 30 Then
                            .Range("F" & LigneAjout) = "Pose appui Neuf"
                        Else
                            .Range("F" & LigneAjout) = "Remplacement"
                        End If
                    Next i
                    Target.Interior.ColorIndex = 3
                    .Activate
                End With
            Else
                MsgBox "Nombre d'appuis hors limite.", vbCritical
            End If
        Else
            MsgBox "Saisie incorrecte.", vbExclamation
        End If
    End If
End Sub

Cordialement.

Bonjour à tous,

Le code de gyrus est parfait ...!!!

Mais, il me semble qu'une macro évènementielle n'est pas vraiment adaptée dans ce cas précis ...

Du coup, ci-joint un fichier test dans lequel la macro est transposée en macro standard ...

En espèrant que cela t'aide

6test-arnaud87.xlsm (25.75 Ko)

Bonjour,

En gardant la méthode de gyrus, est il possible d’éviter les doublons? ou faut il passer obligatoirement par une macro?

Est il possible d'avoir une macro automatique (déclenchement dés lors qu'un chiffre y est renseigné)?

Merci pour vos réponses

Cordialement

Re,

Que signifie pour toi :

est il possible d’éviter les doublons

Perso ... je n'en vois aucun .... Le fait d'avoir une Colonne ' Traité ' ... permet d'éviter tous les doublons ...

Re,

J'entend par éviter les doublons le fait d'avoir en feuille 2, une ou plusieurs ligne(s) avec les même valeurs, si on modifie le chiffre en AD ou AF de la feuille 1.

Cdt

Re,

J'entend par éviter les doublons le fait d'avoir en feuille 2, une ou plusieurs ligne(s) avec les même valeurs, si on modifie le chiffre en AD ou AF de la feuille 1.

Cdt

Arnaud ...

Pourrais-tu avoir la gentillesse de ré-ouvrir le tout premier Fichier que tu as posté avec ton premier message ...

James007,

Dans mon premier fichier, on peux voir qu'en E "REF Appuis" cela sont unique, d'ou l’intérêt de ne pas créer de nouvelle ligne si je remplace un 2 par un 3 en AD.

Actuellement: 2 ligne se crée en feuille 2 à la première saisie mais si je met un 3 à la place j'ai 3 nouvelles lignes en plus des 2 premières.

J’espère avoir été assez clair dans mon explication.

Cdt

Re,

Désolé ... mais je faisais référence à ta Feuille 2 .... celle qui illustre le Résultat que tu attends ...

De plus ... ton sujet annonce .... " Copie cellules ....avec mutiplication "

Bonjour,

Comme indiqué par James007 (que je salue), tu peux ajouter un marquage en feuille 1 qui signalera que la saisie a été effectuée. Il suffit alors d’inclure un test dans la procédure afin d’éviter une seconde copie.

Note bien que l’on ne peut pas effectuer un test directement sur les données copiées en feuille 2 car on ne sait pas différencier les lignes, du fait que l’on ne dispose pas d’une référence unique pour chaque ligne (exemple avec les 2 lignes de PA-02340-000G qui sont strictement identiques).

De plus, tu dois être conscient que les données ne sont pas protégées et qu’il restera facile de faire une mauvaise manip.

Cordialement.

Bonjour,

Au fur et à mesure une référence unique sera rempli en E ce qui pourra éviter les erreurs, Pouvons nous mettre un test sur cette colonne?

Cdt

Re,

Il ne faut surtout pas hésiter à rendre ton objectif le plus clair possible ...

Un fichier test avec une dizaine de lignes renseignées serait très précieux ...

Je suppose qu'il s'agit de la colonne "REF Appuis" de la feuille 2.

Le problème, c'est que cette référence n'existe pas en feuille 1. Tu ne peux donc pas effectuer de comparatif avant copie.

Par contre, je pense qu'il est possible d'effectuer un comptage du nombre de PA identiques dans chaque feuille et de comparer les 2 résultats.

re,

Voici trois tableaux de test

  • le premier pour voir le résultat initial
  • le second est celui que je ne souhaite pas car cela posera des problème a court terme
  • le troisième est le résultat que je souhaiterai avoir

Cdt

4arnaud87-test3.zip (30.65 Ko)
1arnaud87-test2.zip (30.71 Ko)
2arnaud87-test1.zip (30.49 Ko)

Allons-y pour un test ....

Cordialement.

6arnaud87.zip (28.88 Ko)

re,

Impeccable c’est exactement ce que je cherchais.

Merci a vous pour vos réponses rapide.

Cdt

Rechercher des sujets similaires à "vba copie conditions multiplication"