IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA insérer une ligne si deux cellules différentes


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut VBA insérer une ligne si deux cellules différentes
    Bonjour à tous.
    Je cherche à faire un truc sous Excel mais je coince. Qui peut m'aider.
    Sur la feuille 1 j'ai une ligne avec des données dans différentes colonnes. Sur la colonne 1 c'est un compteur qui s'incrémente automatiquement. Quand ce compteur bouge je veux copier cette ligne et l'insérer en ligne 1 dans la feuille 2.
    J'ai fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Workbook_Activate()
     
    If Cells(Feuil2!A2) <> Cells(Feuil1!A4) Then
     
    Sheets("Feuil1").Select
        Rows("2:2").Select
        Selection.Copy
        Sheets("Feuil2").Select
        Rows("4:4").Select
        Selection.Insert Shift:=xlDown
     
    End Sub
     
    End If
    Ca ne marche pas?
    Si quelqu'un peut m'aider?

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    Bonjour

    Le end if avant le end sub ce serait mieux.

    tu peux te passer des .select.

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, déjà un end if après le end sub ? Le compilateur doit retourner une erreur non ?
    ENsuite tous ces select sont inutiles, et enfin, si tu veux détecter un changement dans la feuille ce n'est pas dans l'évènement _Activate qu'il faut mettre le code. Teste ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        ' Vérifier si la modification a été effectuée dans la feuille "Feuil1" et si elle concerne la colonne A
        If Sh.Name = "Feuil1" And Target.Column = 1 Then
            ' Récupérer la ligne modifiée
            Dim modifiedRow As Range
            Set modifiedRow = Sh.Rows(Target.Row)
     
            ' Définir la ligne cible dans la feuille "Feuil2"
            Dim targetRow As Long
            targetRow = 1
     
            ' Insérer une nouvelle ligne en haut de la feuille "Feuil2"
            Sheets("Feuil2").Rows(targetRow).Insert Shift:=xlDown
     
            ' Copier la ligne modifiée depuis la feuille "Feuil1" vers la nouvelle ligne insérée dans la feuille "Feuil2"
            modifiedRow.Copy Destination:=Sheets("Feuil2").Rows(targetRow)
        End If
    End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut Macro?
    Merci Frank.
    Désolé je suis vraiment un novice. Cela ne marche pas, je ne comprend pas cela n'est pas vu comme une macro, je n'arrive pas à la lancer.

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, ce n'est pas une macro qu'il faut lancer, cela se fait automatiquement. Elle est placée dans l'évènement Workbook_SheetChange, donc elle va s'exécuter lorsqu'il y a un changement dans une feuille du classeur. La macro vérifie si le changement s'est fait dans la colonne A de "Feuil1", si oui il copie toute la ligne correspondant à la cellule modifiée et l'insère en première ligne de "Feuil2", sinon il ne se passe rien.
    Donc, lorsque tu es dans l'éditeur VBA, dans la fenêtre de projets, tu double cliques sur ThisWorkbook et tu colles la macro dans la fenêtre de droite et elle fonctionnera.

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut super
    Salut.
    Désolé je croyais avoir fait ceci et que cela ne marchait pas. J'ai refait un test et c'est OK. Merci.

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut
    Citation Envoyé par virloc Voir le message
    Salut.
    Désolé je croyais avoir fait ceci et que cela ne marchait pas. J'ai refait un test et c'est OK. Merci.
    Bonjour

    Cela fonctionne sauf que maintenant la cellule qui change d'état est une variable, je pense que cela ne fonctionne plus car Excel ne voit plus le changement de valeur.
    Il faudrait également que la copie de la ligne soit faite avec les valeurs.
    Autre chose, comment faire si je ne veux pas recopier toute la ligne mais seulement de la colonne A à F?

    Merci.

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, teste comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        ' Vérifier si la modification a été effectuée dans la feuille "Feuil1" et si elle concerne la colonne A
        If Sh.Name = "Feuil1" And Target.Column = 1 Then
            ' Récupérer la plage modifiée
            Dim modifiedRange As Range
            Set modifiedRange = Sh.Range(Sh.Cells(Target.Row, 1), Sh.Cells(Target.Row, 6))
     
            ' Définir la ligne cible dans la feuille "Feuil2"
            Dim targetRow As Long
            targetRow = 1
     
            ' Insérer une nouvelle ligne en haut de la feuille "Feuil2"
            Sheets("Feuil2").Rows(targetRow).Insert Shift:=xlDown
     
            ' Copier la plage modifiée depuis la feuille "Feuil1" vers la nouvelle ligne insérée dans la feuille "Feuil2"
            modifiedRange.Copy
            Sheets("Feuil2").Range("A" & targetRow & ":F" & targetRow).PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
        End If
    End Sub

  9. #9
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut
    Salut.

    Merci, la recopie se fait bien. Le problème est que la cellule qui change est une variable même si la valeur change Excel ne le voit pas. Si je change la valeur manuellement c'est OK.

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Effectivement, si le contenu de la cellule change en raison d'une formule ou d'une macro, l'évènement Worksheet_Change ne sera pas déclenché car Excel ne considère pas cela comme une modification “manuelle” de la cellule.
    On pourrait utiliser l'évènement Worksheet_Calculate mais pour 1 cellule, pas pour une colonne, car il faudrait ajouter du code pour suivre la valeur précédente de chaque cellule de la colonne, ce qui serait très lourd en termes de temps.
    Personnellement je ne vois pas de solution satisfaisante.

  11. #11
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut
    Ce n'est pas toute la colonne qui change mais seulement certaines cellules. Quelle est la programmation pour copier la valeur d'une variable dans une cellule et la coller dans une autre cellule?
    Ce copier/coller se faisant par exemple toutes les secondes

  12. #12
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour

    tu pourrais par exemple créer un sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub CopieSiModif(MaSource As Range, MaCible As Range)
    If MaSource.Value <> MaCible.Value Then MaCible.Value = MaSource.Value
    End Sub
    et l'appeler depuis le workseet_calculate de la feuille qui contient la ou les cellules à surveiller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Calculate()
    CopieSiModif me.range("A1"), ThisWorkbook.Sheets("Feuil2").Range("C3")
    CopieSiModif me.range("A22"), ThisWorkbook.Sheets("Feuil2").Range("C4")
    End Sub

  13. #13
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Voilà qui fonctionne aussi bien quand la cellule est modifiée manuellement ou via une macro. Pour l'exemple, je surveille les 3 cellules A1, A5 et A10. Tu devras évidemment changer en fonction de tes besoins et recopier la portion de code qui vérifie la valeur des cellules autant de fois que nécessaire. Il faudra aussi dimensionner "Dim PreviousValues(1 To 3) As Variant" en fonction du nombre de cellules à surveiller.
    A l'ouverture du classeur, je stocke les valeurs des cellules surveillées pour pouvoir les comparer avec les nouvelles valeurs, et celles-ci sont à leur tour stockées pour de prochains changements éventuels. Je pense que les commentaires sont assez clairs pour te permettre de modifier sans trop de difficulté.
    Double clic sur ThisWorkbook et copie le code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Dim PreviousValues(1 To 3) As Variant
     
    Private Sub Workbook_Open()
        ' Initialiser les valeurs précédentes
        PreviousValues(1) = Sheets("Feuil1").Range("A1").Value
        PreviousValues(2) = Sheets("Feuil1").Range("A5").Value
        PreviousValues(3) = Sheets("Feuil1").Range("A10").Value
    End Sub
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        If Sh.Name = "Feuil1" Then
            ' Vérifier si la valeur de la cellule A1 a changé
            If Not Intersect(Target, Sh.Range("A1")) Is Nothing Then
                If Sh.Range("A1").Value <> PreviousValues(1) Then
                    ' Mettre à jour la valeur précédente
                    PreviousValues(1) = Sh.Range("A1").Value
                    ' Copier la ligne modifiée
                    CopyRow Sh, 1
                End If
            End If
     
            ' Vérifier si la valeur de la cellule A5 a changé
            If Not Intersect(Target, Sh.Range("A5")) Is Nothing Then
                If Sh.Range("A5").Value <> PreviousValues(2) Then
                    ' Mettre à jour la valeur précédente
                    PreviousValues(2) = Sh.Range("A5").Value
                    ' Copier la ligne modifiée
                    CopyRow Sh, 5
                End If
            End If
     
            ' Vérifier si la valeur de la cellule A10 a changé
            If Not Intersect(Target, Sh.Range("A10")) Is Nothing Then
                If Sh.Range("A10").Value <> PreviousValues(3) Then
                    ' Mettre à jour la valeur précédente
                    PreviousValues(3) = Sh.Range("A10").Value
                    ' Copier la ligne modifiée
                    CopyRow Sh, 10
                End If
            End If
        End If
    End Sub
     
    Sub CopyRow(Sh As Worksheet, rowNumber As Long)
        ' Récupérer la plage modifiée
        Dim modifiedRange As Range
        Set modifiedRange = Sh.Range(Sh.Cells(rowNumber, 1), Sh.Cells(rowNumber, 6))
     
        ' Définir la ligne cible dans la feuille "Feuil2"
        Dim targetRow As Long
        targetRow = 1
     
        ' Insérer une nouvelle ligne en haut de la feuille "Feuil2"
        Sheets("Feuil2").Rows(targetRow).Insert Shift:=xlDown
     
        ' Copier la plage modifiée depuis la feuille "Feuil1" vers la nouvelle ligne insérée dans la feuille "Feuil2"
        modifiedRange.Copy
        Sheets("Feuil2").Range("A" & targetRow & ":F" & targetRow).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
    End Sub

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut
    Désolé mais Excel ne voit toujours pas le changement de la valeur de la variable???

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    L'evennement Workbook_SheetChange detecte tout changement qui appartienne au modèle objet d'une feuille, que ce soit réalisé manuellement, par formule ou par VBA.
    Cela n'inclue pas les variables VBA, car elle ne font pas partie du modèle objet d'Excel.

    Maintenant, il faut definir précisement ce que tu veux détecter:
    Changement d'un objet Excel ou changement d'une variable ?
    Dans le premier cas, les gestionnaires d'evennements d'Excel te permetrons d'arriver à tes fins.
    Dans le second, il te faudra definir une classe avec des evennements personalisés.

  16. #16
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Citation Envoyé par virloc Voir le message
    Désolé mais Excel ne voit toujours pas le changement de la valeur de la variable???
    Désolé mais je ne comprends pas ce que tu veux dire par changement de la variable, peux-tu être plus précis et donner un exemple ?

  17. #17
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut
    Le tableau Excel est sur un ordinateur en réseau avec une machine. La communication se fait en OPCUA. J'utilise un logiciel OPC Expert pour récupérer des variable et les mettre dans le tableau Excel.
    Voici ce qu'il y a dans la cellule: =RTD("expertrtd";;"192.168.1.192";"opc.tcp://192.168.1.192:4840/";"ns=6;s=::EM63Mapp:pEm63m.ActCntCyc";;1000)
    Cette variable est le nombre de cycle de la machine.
    Sur la même ligne j'ai d'autres variable machine comme le temps de cycle etc..
    A chaque cycle je veux récupérer cette ligne est l'enregistrer et l'insérer dans un tableau pour un suivi de production.

    Cela fonctionne quand je mets une valeur manuellement dans la cellule et que je la change, mais pas si je laisse le lien de la variable.

    Merci pour votre temps passé à m'aider.

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    On a un gros problème de vocabulaire:
    Tu parles de "variables", alors qu'en fait ce sont des cellules, une feuille ou autre.

    Ce n'est pas du tout la même chose, et forcément, on ne se comprend pas.

    Oublie tout l'aspect programmation, et reformule ton besoin du point de vue utilisateur.
    Parles nous de classeur, de feuille, de cellule, de formule, de click, de données, de comportement attendu ect ..., et on commencera à se comprendre.

  19. #19
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2023
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mai 2023
    Messages : 9
    Par défaut
    OK, je vais essayer d'être plus clair, si tu veux tu peux m'appeler 06 49 70 18 30.
    J'ai une cellule "C5" sur la feuille "Production" dont la valeur s'incrémente de 1 en 1. Cette valeur est envoyée par une machine distant.
    Quand cette valeur change je veux recopier la ligne 5 de la colonne A à F de la page "production" et l'insérer dans la page "Presse1" ligne 4.

    J'ai modifier ton code:
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' Vérifier si la modification a été effectuée dans la feuille "Feuil1" et si elle concerne la colonne C
    If Sh.Name = "Production" And Target.Column = 3 Then
    ' Récupérer la plage modifiée
    Dim modifiedRange As Range
    Set modifiedRange = Sh.Range(Sh.Cells(Target.Row, 1), Sh.Cells(Target.Row, 6))

    ' Définir la ligne cible dans la feuille "Feuil2"
    Dim targetRow As Long
    targetRow = 4

    ' Insérer une nouvelle ligne en haut de la feuille "Feuil2"
    Sheets("Presse1").Rows(targetRow).Insert Shift:=xlDown

    ' Copier la plage modifiée depuis la feuille "Feuil1" vers la nouvelle ligne insérée dans la feuille "Feuil2"
    modifiedRange.Copy
    Sheets("Presse1").Range("A" & targetRow & ":F" & targetRow).PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    End If
    End Sub

    Cela fonctionne si je change la valeur de la cellule "C5" sur la feuille "Production" manuellement, mais pas si je laisse la formule pour le lien vers la machine externe. Avec le lien vers la machine externe je vois bien la valeur évoluer dans cette cellule.

  20. #20
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, voici une autre suggestion à tester.
    Insère la macro dans Thisworkbook avec la macro CopyRow que je t'ai fournie précédemment.
    Appelle la macro dans l'évènement Workbook_Open.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Dim PreviousValue As Variant
     
    Sub CheckCellValue()
     
        Dim CurrentValue As Variant
        CurrentValue = Sheets("Production").Range("C5").Value
        If CurrentValue <> PreviousValue Then
            ' La valeur a changé, donc nous déclenchons l'action
            CopyRow Sheets("Production"), 5
            ' Mettre à jour la valeur précédente
            PreviousValue = CurrentValue
        End If
        ' Vérifier à nouveau après un délai
        Application.OnTime Now + TimeValue("00:01:00"), "CheckCellValue"
     
    End Sub
    La macro vérifie en continu la cellule, en fonction de l'intervalle que tu peux spécifier avec Timevalue.
    Si ça ne fonctionne pas, je n'ai pas d'autre idée à proposer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/03/2016, 15h11
  2. Insérer une ligne entre deux autres dans un fichier
    Par c1malabar dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2011, 20h44
  3. Insérer une ligne entre deux lignes
    Par lecroquant dans le forum Débuter
    Réponses: 6
    Dernier message: 01/10/2010, 13h17
  4. [VBA] insérer une ligne dans un fichier excel
    Par cokinoumasterflash dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2005, 19h52
  5. [VBA][Excel]Insérer une ligne
    Par loverdose dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2005, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo