Création de macro

T

tangham

Guest
Bonjour,

je fais appel à vos compétences en macro car je suis un peu bloqué.

Je traite un fichier au sein duquel je suis amené à régulièrement supprimer des lignes pour les mettre dans une autre feuille qui me sert de suivi pour les données sorties.

Ma question est donc la suivante:
je souhaite qeu, quand je mets une date (qui me sert à savoir qd la fiche est sortie), ma ligne soit coupée, puis collée dans mon fichier de suivi.
J'ai fait plusieurs tentatives et je n'arrive pas à ce qu'il se mette systématiquement à la fin de mon fichier de suivi et qu la date soit bien celle saisie (il me met celle que j'ai intégrée à la macro).

Si je n'ai pas été assez clair, je vous donnerai toutes les infos dont vous aurez besoin.

Merci d'avance

TANGHAM
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonjour Tangham et merci Pascal,

Je te renvoie ton fichier (je pensais que c'était passé hier ??). La procédure est dans Feuil1 et tu la verras sous VBE en double-cliquant sur la feuille.

Je pense que tout est en ordre :)

A+
Charly

Message édité par: Charly2, à: 30/11/2005 23:27
 

Pièces jointes

  • GESTIONROC_V2.zip
    21.5 KB · Affichages: 19

TANGHAM

XLDnaute Junior
voici ce qui s'inscrit quand j'ouvre le doc.

erreur de compilation
Nom ambigu détecté : in change

et ça fait référence à ça

Private Sub Workbook_Open()
InChange = False
End Sub


et du coup ça marche pas même si je retrouve la macro dans la feille 1

:( :(
 

TANGHAM

XLDnaute Junior
je complète mon test

Après le débogueur fermé la macro marche nickel (bravo et merci à toi c'est parfait)

Par contre petite question de newbie du vba.
Si je me trompe de ligne par exemple, comment je reviens en arrière*???

Si je t'embête tu me le dis, je le mérite :huh:
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir Tangham :)

Pour l'erreur, je ne l'avais pas remarquée car je n'avais pas vu que tu avais copié le code dans Module2 dans la mesure où je me suis contenté d'inclure mon code : tu peux supprimer ce module, c'est même conseillé :)

Je veux bien te proposer une macro pour revenir en arrière si tu me le demandes (c'est un peu de la flemme là, non ? :lol: ). Mais je suis certain que tu ne fais jamais d'erreur, n'est-ce pas ? :) :)

Amitié
Charly
 

TANGHAM

XLDnaute Junior
OK tout est nickel et merci encore.

Pour le retour en arrière, la question n'était pas de savoir si tu savais le faire mais si il n'y avait pas juste une fonction qui le faisait toute seule.

Si c'est pas le cas, no problemo, je ferais pas d'erreur. :p :)

Salut à tous
 

TANGHAM

XLDnaute Junior
je colle ici la ma cro que tu as créée si ça intéresse qqn

Option Explicit

Public InChange As Boolean

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'
Dim LigneDest As Long
'
If Not InChange Then
InChange = True
If Not Intersect(Target, Range('J6:J65536')) Is Nothing And _
Target.Rows.Count = 1 Then
With Sheets('suivi')
LigneDest = .Range('A65536').End(xlUp).Row + 1
Target.EntireRow.Copy
.Cells(LigneDest, 1).Insert shift:=xlShiftDown
Target.EntireRow.Delete
End With
End If
InChange = False
End If
End Sub


Par contre pourrais tu supprimer le fichier que tu as mis en lien car il y a qlq données quine devraient pas être données.

Merci d'avance

TANGHAM
 

Charly2

Nous a quittés en 2006
Repose en paix
Re,

Je ne peux pas moi-même supprimer le fichier mis en lien, il faut que tu en fasses la demande à Pascal76 ou à XlDAdmin1. Je te laisse le faire car il ne faut pas laisser des données confidentielles traîner sur le web.

Sinon, pour la macro, j'ai effectivement tapé le code moi-même et même si l'on peut s'en sortir en enregistrant une macro pour savoir comment supprimer une ligne, il faut savoir comment la modifier et l'intégrer dans une procédure événementielle de la feuille...

Tu y arriveras :)

A+
Charly
 

TANGHAM

XLDnaute Junior
Bonjour
Je suis de retour.

La macro sur le fichier final tourne parfaitement.

Mais, et finalement ma question d'hier avait tout son sens, quand je veux revenir en arrière, ou tout simplement rajouter une ligne dans le premier tableau, la macro s'enclenche tout de même et du coup me la supprime.

Donc au delà de l'erreur, je peux être amené à intercaler des données,, mais je suis bloque.

Qui a dit que j'étais un boulet :p :p

TANGHAM
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir Tangham,

J'ai revu le code et j'ai pris quelques précautions (je me suis fixé un cahier des charges) :

1) Tu peux saisir ce que tu veux dans ta colonne 'Date de sortie', elle n'est pas supprimée si la saisie ne correspond pas à une date ou si la cellule est vide : tu peux donc insérer des lignes sans problème...

2) J'ai ajouté un tableau qui te permet de revenir en arrière en cas d'erreur de saisie (5 derniers transferts). Comme j'y enregistre le numéro des lignes dans Feuil1 et Suivi, je gère le tableau comme une pile LIFO (Last In First Out), ce qui te permet de retrouver les données dans la même ligne qu'auparavant dans Feuil1...

3) Ajout d'un bouton 'Annuler supprimer' dans ta Feuil1 pour effectuer un retour arrière comme expliqué en 2.

Voilà. Il ne me manque que ton adresse e-mail pour te l'envoyer directement. Tu peux me l'indiquer par la messagerie XLD :)

Amicalement
Charly
 

Charly2

Nous a quittés en 2006
Repose en paix
Re,

Si cela intéresse quelqu'un, voici ce qui a été codé pour répondre au cahier des charges ci-dessus :

Worksheet_Change :

Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'
Dim LigneDest As Long
'
  ' Test de InChange afin de ne pas boucler sur la procédure
  ' lors de la modification d'une ligne
  If Not InChange Then
    '
    ' InChange devient VRAI pour indiquer qu'il ne faut pas appeler
    ' une seconde fois cette procédure événementielle ou autres proc
    InChange = True
    '
    ' Si la cellule modifiée (Target) est bien dans la colonne J
    ' après la ligne 6 et qu'il n'y a pas de sélection multiple
    If Not Intersect(Target, Range('J6:J65536')) Is Nothing And _
        Target.Rows.Count = 1 Then
      '
      ' Puis si la cellule modifiée n'est pas vide et qu'elle
      ' contient bien une date...
      If Not IsEmpty(Target.Value) And IsDate(Target) Then
        '
        ' Alors avec la feuille 'Suivi'...
        With Sheets('suivi')
          '
          ' On initialise LigneDest qui contiendra la première
          ' ligne vide après le tableau
          LigneDest = .Range('A65536').End(xlUp).Row + 1
          '
          ' Appel d'une procédure qui permettra de stocker les
          ' informations sur les lignes utilisées dans ce transfert
          ' dans 'Feuil1' et 'Suivi' afin de pouvoir revenir en
          ' arrière.
          AjouteListeUndo LigneSuivi:=LigneDest, Cellule:=Target
          '
          ' Dans 'Feuil1', on copie l'intégralité de la ligne
          ' contenant la cellule modifiée...
          Target.EntireRow.Copy
          '
          ' Puis on l'insère dans la feuille 'Suivi', à la suite
          ' du tableau existant (voir initialisation de LigneDest)
          .Cells(LigneDest, 1).Insert shift:=xlShiftDown
          '
          ' Et enfin, on supprime la ligne contenant la cellule
          ' modifiée
          Target.EntireRow.Delete
        End With
      End If
    End If
    '
    ' InChange devient FAUX. Les procédures qui utilisent cette
    ' variable pourront être exécutées
    InChange = False
  End If
End Sub

AjouteListeUndo :

Code:
Sub AjouteListeUndo(LigneSuivi As Long, Cellule As Range)
'
Dim i As Byte
'
  ' en fonction du nombre de données déjà enregistrées dans
  ' ListeUndo, soit on rajoute directement, soit on supprime
  ' auparavant les données les plus anciennes.
  ' ListeUndo est un peu comme une pile de type LIFO (Last In
  ' First Out). Elle est limitée à 5 retours en arrière.
  If NbItem  0 Then
    '
    ' Alors on modifie la valeur de InChange à VRAI pour que la
    ' procédure événementielle Worksheet_Change ne soit pas
    ' exécutée lors des modifications de valeurs
    InChange = True
    '
    ' On copie la ligne de la feuille 'Suivi' dans laquelle le
    ' dernier transfert a été effectué (voir Worksheet_Change)
    Sheets('suivi').Rows(ListeUndo(NbItem, 2)).Copy
    '
    ' Puis on l'insère dans le n° de ligne de 'Feuil1' sauvegardé
    ' dans ListeUndo
    ActiveSheet.Rows(ListeUndo(NbItem, 1)).Insert shift:=xlShiftDown
    '
    ' On supprime la ligne de la feuille 'Suivi'
    Sheets('suivi').Rows(ListeUndo(NbItem, 2)).Delete
    '
    ' Puis on indique, en décrémentant NbItem, qu'une annulation
    ' (ou 'retour arrière' ou 'undo') du dernier transfert a été
    ' effectuée et que la prochaine annulation ne doit pas tenir
    ' compte des données actuelles dans ListeUndo
    NbItem = NbItem - 1
    '
    ' Enfin, on autorise à nouveau les procédures utilisant InChange
    ' à exécuter leur code
    InChange = False
  End If
End Sub


Dans un module VariablesGlobales :

Code:
Option Explicit

Public NbItem As Byte
Public ListeUndo(1 To 5, 1 To 2) As Long
Public InChange As Boolean

Amicalement
Charly

Edition2 : Il semble que tout le code ne passe pas :(

Message édité par: Charly2, à: 01/12/2005 21:46

Message édité par: Charly2, à: 01/12/2005 21:49
 

Discussions similaires

Réponses
6
Affichages
379

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz