Bug Macro copié-collé

Bonjour,

Avec l'aide d'un ancien collègue, nous avions créé la macro du fichier ci-joint qui permet de couper-coller une ligne d'une feuille à une autre si le statut de la colonne G change en "Annule". J'ai voulu répliquer la même change pour un nouveau statut "Refuse" mais la macro ne s'exécute pas.

Est-ce que vous pourriez m'aider à trouver mon erreur? La macro s'exécute bien manuellement mais pas en automatique.

Merci pour votre aide !

Belle soirée

BOnjour

Inutile de créer une seconde macro

modifier la macro TransfertAnnulation en remplaçant

If Worksheets("CLIENTS").Range("G" & i) = ("ANNULE") Then 'Or Worksheets("CLIENTS").Range("I" & x).Value = "X" Then

par

If Worksheets("CLIENTS").Range("G" & i) = ("ANNULE") or Worksheets("CLIENTS").Range("G" & i) = ("REFUSE")Then 

Mais on peut optimiser en se servant correctement des tableaux structurés (qui ne doivent jamais contenir de ligne vide)

Bonjour,

Une question que je me pose, pourquoi faites vous une boucle dans la macro Transfertannulation alors que la copie de la ligne se fait sur le changement d'une cellule dans la colonne G ?

Cordialement

edit : Une variante à la proposition de Chris78, en modifiant le code dans votre feuille client comme ceci. Du coup plus besoin de votre macro Transfertannulation.

Private Sub Worksheet_Change(ByVal Target As Range)

'With Worksheets("CLIENTS").ListObjects("Tableau1")
With ListObjects("Tableau1")
    If Not Application.Intersect(Target, .ListColumns(6).DataBodyRange) Is Nothing Then
        If Target.Value = "REFUSE" Or Target.Value = "ANNULE" Then
                .ListRows(Target.Row - 3).Range.Copy
                lig = Worksheets("ANNULES").ListObjects("Tableau2").ListRows.Count + 1
                Worksheets("ANNULES").ListObjects("Tableau2").DataBodyRange(lig, 1).PasteSpecial Paste:=xlPasteValues
        End If
    End If
End With
End Sub

Comme Chris78 le souligne, vous êtes en tableau structuré dans vos feuilles, donc il faut éviter les lignes vides et ne pas formater les lignes à l'avance. Le tableau structuré ajoute chaque nouvelle ligne que vous créez à la suite des autres

Bonjour à tous

Quelques remarques (ou manies de ma part)

  • Je déteste l'anonymat des tableaux d'où le renommage de Tableau1 et Tableau2 (cela prend 1/2 seconde à la création d'un tableau et facilite tellement la compréhension et la maintenance...)
  • quand je manipule des tableaux je préfère faire abstraction de sa feuille et de sa position dans celle-ci pour rendre le code plus perenne en cas de déplacement des tableaux ou renommage des onglets, ce que permet :
    • l'utilisation de Range("T_Annules").ListObject
    • l'utilisation du Listrow y

Du coup il faut définir les variables ListObject dans une procédure normale (ou au moins celle concernant l'autre onglet) pour pouvoir tout coder dans le module de la feuille, ce qui est effectivement plus logique

Option Explicit
Public TS As ListObject, TD As ListObject
Sub initV()
    Set TS = Range("t_Clients").ListObject
    Set TD = Range("T_ANNULES").ListObject
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
initV
If Not Application.Intersect(Target, TS.ListColumns("STATUT").DataBodyRange) Is Nothing And Target.Rows.Count = 1 Then

'Declaration des variables
    Dim y As ListRow, cellule As Range
    Dim Lig As Long, Col As Long
    Lig = Target.Row - TS.Range.Row
    Col = Target.Column - TS.Range.Column + 1

    Set cellule = TS.DataBodyRange.Cells(Lig, Col)
    'Si la valeur dans la colonne STATUT est "ANNULE" alors on copie
    If cellule = ("ANNULE") Or cellule = ("REFUSE") Then

        Application.ScreenUpdating = False
        Application.EnableEvents = False
        On Error GoTo Fin
        'On copie/colle les donnees
        Set y = TD.ListRows.Add
        TS.ListRows(Lig).Range.Offset(0, 1).Resize(1, TS.Range.Columns.Count - 1).Copy
        y.Range.Cells(1, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

        'On supprime la ligne
        TS.ListRows(Lig).Delete
    End If

Fin:
Application.EnableEvents = True

End If
End Sub

Re

Comme ce message m'est un peu adressé, enfin si je lis bien...

Je n'ai fait que reprendre l'existant dans le fichier.
Le tout au final est que l'utilisateur s'y retrouve et y comprenne quelque chose et que ce soit un peu dans la continuité de ce qu'il a commencé (enfin si cela est cohérent).

Si cela ne concerne que moi, je fonctionne différemment en utilisant aussi des noms appropriés.

Mais je préfère Range("t_Clients").ListObject plutôt que de nommer Set TS = ..... Après je trouve plus facile de savoir de quoi on parle surtout si le fichier contient plein de codes à droite et à gauche. C'est juste une approche perso bien entendu.

Pour le code proposé, le fait de mentionner Worksheets("Clients") ne sert à rien dans le code que j'ai proposé puisque le code est placé dans la feuille Clients. On peut le supprimer. (j'ai amendé mon code proposé avant)

RE

Cela s'adresse à tous ceux qui manipulent des tableaux

Concernant le nommage c'est assez systématique dans les exemples postés par les demandeurs... Il y a aussi souvent des onglets restés en Feuil1 & co

De façon générale je remarque que beaucoup codent sans tenir compte du tableau qui change beaucoup les choses

Donc c'est plus ma pierre à l'édifice, qu'un message purement destiné à toi

Sauf erreur de ma part, on se croise sur les forums depuis longtemps, toi et moi...

Sauf erreur de ma part, on se croise sur les forums depuis longtemps, toi et moi...

Je pense aussi car je connais un autre Chris (de St Quentin) sur une autre forum et me suis toujours demandé si c'était la même personne. Si oui, cela fait tout de même très très longtemps....

Eh oui, cela ne nous rajeunit pas, lol

Eh oui, cela ne nous rajeunit pas,

Pouf ! effectivement ... et une question.... la rencontre à Lyon (2005), cela te parle ?

RE

Non j'étais à Rennes (2008) mais pas à Lyon.

Bonjour @Dan, @78Chris,

Merci beaucoup pour votre aide!! Certaines informations dépassent un peu mes compétences, je vais donc analyser cela en détails :)
Erreur de ma part de ne pas renommer les tableaux, il est vrai que ca ne prend pas beaucoup de temps et que c'est mieux de le faire.

Un grand merci pour votre temps !!
Belle soirée

RE

Mais je préfère
Range("t_Clients").ListObject
plutôt que de nommer Set TS = .....

En général moi aussi, mais je n'ai pas réussi à la faire pour le tableau T_ANNULES dans le code de la feuille Clients malgré une déclaration en Public dans un module standard. A priori problème de portée

Si tu as une idée...

Bonjour,

@78Chris : J'ai vu quelques photos de cette rencontre. Si mes souvenirs sont bons, à part quelques uns, la majorité des personnes à Lyon n'étaient pas présentes à Rennes.

En général moi aussi, mais je n'ai pas réussi à la faire pour le tableau T_ANNULES dans le code de la feuille Clients malgré une déclaration en Public dans un module standard. A priori problème de portée

Cela m'a donné du fil à retordre ce truc là. je pensais qu'il y avait un bug sur la feuille. Puis je me suis hasardé à mentionner le nom de la feuille parce que le Range concerné fait partie d'une autre feuille (bizarre tout de même car le gestionnaire de noms sait de quelle feuille on parle) et... cela a fonctionné !

Finalement en supprimant le module 1 qui contient le code InitV, j'arrive à ce code ci-dessous

Private Sub Worksheet_Change(ByVal Target As Range)

With Range("t_Clients").ListObject
    If Not Application.Intersect(Target, .ListColumns("STATUT").DataBodyRange) Is Nothing And Target.Rows.Count = 1 Then
        'Declaration des variables
        Dim y As ListRow, cellule As Range
        Dim Lig As Long, Col As Long

        Lig = Target.Row - .Range.Row
        Col = Target.Column - .Range.Column + 1

        Set cellule = .DataBodyRange.Cells(Lig, Col)
        'Si la valeur dans la colonne STATUT est "ANNULE" alors on copie
        If cellule = ("ANNULE") Or cellule = ("REFUSE") Then

            Application.ScreenUpdating = False
            Application.EnableEvents = False
            On Error GoTo Fin
            'On copie/colle les donnees
            Set y = Sheets("Annules").Range("T_ANNULES").ListObject.ListRows.Add
            .ListRows(Lig).Range.Offset(0, 1).Resize(1, .Range.Columns.Count - 1).Copy
            y.Range.Cells(1, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            'On supprime la ligne
            .ListRows(Lig).Delete

        End If
Fin:
    Application.EnableEvents = True   
    End If
End With
End Sub

J'ai laissé le Application.EnableEvents, bien que j'évite toujours cette instruction que je remplace par une variable Boolean ou de l'instruction Static

Bonjour

Merci

Oui en précisant l'onglet on peut depuis un autre s'y référer mais on perd du coup l'objectif qui était de rendre tout déplaçable

Ce n'était pas le sujet de la demande, mais juste une logique que j'aime bien...

Pour Application.EnableEvents c'est vrai qu'on peut faire avec des variables : je le faisais avant et ne sais pas pourquoi j'ai changé...

Pour les réunions, je ne me souviens pas qui avait signalé avoir fait Lyon.

Le plus triste c'est qu'un certain nombre a rejoint d'autre cieux...

Oui en précisant l'onglet on peut depuis un autre s'y référer mais on perd du coup l'objectif qui était de rendre tout déplaçable

De mon coté je ne comprends toujours pas pourquoi il faut préciser le nom de la feuille sachant que le nom la précise. Faudrait creuser .. On est peut être passé à coté d'un truc

Pour les réunions, je ne me souviens pas qui avait signalé avoir fait Lyon. Le plus triste c'est qu'un certain nombre a rejoint d'autre cieux...

A l'époque je pense que certains l'on fait. DidierMdf était au deux, puis Chti160 je crois... comme tu dis dommage que certains nous ont quitté...

Bonjour,
Je me permets de revenir vers vous car depuis que j'ai ajouté des données cela ne fonctionne plus.
Pouriez-vous me dire ou est mon erreur ?
MErci beaucoup

Edit Dan :

Remplacé fichier suite à données confidentielles dans feuille ANN-REF

Bonjour

Le fichier que tu as joint fonctionne : re déroule STATUT et change ou garde le même et le code se déclenche

Ne ferais-tu pas du copier coller au lieu de saisir ?

Rechercher des sujets similaires à "bug macro copie colle"