Macro excel

Résolu
Bonjour à tous, je voudrai réaliser un outil de gestion via excel, jusque la pour le tableau pas de problème mais pour la macro aïe....

Je vous le donne en français si quelqu'un pouvais me le traduire en VBA parceque la je rame et c'est assez urgent.

j'ai deux feuilles l'une qui sera rempli par les personnes concernées et l'autre pour archiver qui sera en lecture seule sauf pour la macro bien sur.

Ce que je souhaiterai c'est une macro qui quand elle apercois dans la feuille 1 le mot "achevée" dans la colonne M mais sur n'importe quelle ligne
copie la ligne dans l'autre feuille sur la première ligne vide disponible, supprime la ligne dans la feuille numéro 1, puis inscrit la date de modification dans la colonne N de la 2ème feuille

il y'a une autre condition aussi les colonnes de la feuille 2 ne coresponde pas exactement à la feuille 1 c'est a dire il faut qu'elle copie: colonne I vers G; J vers H; K vers I; L vers J; N vers K; O vers L; P vers M puis ajoute la date de modification dans la colonne N. De A à F les deux feuilles ont les même colonnes.

Voilà j'espère que ce sera assez compréhensible pour vous je débute dans excel et j'ai beau regarder sur les forum je n'arrive pas à trouver la solution peux être aussi ce n'est pas possible mais je ne suis pas convaincu. Si c'est le cas merci de m'avertir.

Merci d'avance pour votre aide elle m'a souvent été précieuse.
Configuration: Windows XP
Internet Explorer 6.0

23 réponses

  1. Contributeur
    Bonjour,

    Désolé de n'avoir pu te répondre mais je vois que tu y es arrivé tout seul. C'est bien.
    En fait le .unprotect et .protect ne doivent pas etre necessaires pour toi.
    J'avais été dérangé en te repondant et j'ai du faire une compil de 2 discussions...
    N'oublie pas de mettre résolu stp
    eric
    0
    1. c'est bon les gars je suis parvenu à mes fin et ca fonctionne nikel ca donne ca:

      Option Explicit
      Private Sub Worksheet_Change(ByVal Target As Range)
      If Cells(Target.Row, 17).Value = "ok" Then
      Dim lig As Long
      Sheets("archive").Select
      ActiveSheet.Unprotect
      With Sheets("archive")
      lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
      .Cells(lig, 1).Resize(1, 6).Value = Cells(Target.Row, 1).Resize(1, 6).Value
      .Cells(lig, 7).Resize(1, 4).Value = Cells(Target.Row, 9).Resize(1, 4).Value
      .Cells(lig, 11).Resize(1, 3).Value = Cells(Target.Row, 14).Resize(1, 3).Value
      .Cells(lig, 14).Resize(1, 1).Value = Date
      Cells(Target.Row, 1).EntireRow.Delete
      ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
      , AllowSorting:=True
      ActiveWorkbook.Save
      End With
      End If
      End Sub

      et une macro pour le trie de la feuille archive par numéro avec un raccourci dans la barre d'outil:

      Option Explicit

      Sub trier_par_numéro_de_commande__Ctrl_t()
      '
      ' trier_par_numéro_de_commande__Ctrl_t Macro
      ' Macro enregistrée le 18/10/2007 par a672700
      '
      ' Touche de raccourci du clavier: Ctrl+t
      '
      ActiveSheet.Unprotect
      Cells.Select
      Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
      DataOption1:=xlSortNormal
      Range("A2").Select
      ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
      , AllowSorting:=True
      End Sub

      Merci beaucoup pour votre aide à charge de revanche.
      A+
      0
      1. sinon je n'arrive pas à le faire fonctionner avec activate
        0
        1. j'ai réussi à l'intégrer dans le code ca donne:

          Option Explicit
          Private Sub Worksheet_Change(ByVal Target As Range)
          If Cells(Target.Row, 17).Value = "ok" Then
          Dim lig As Long
          Sheets("archive").Select
          ActiveSheet.Unprotect
          With Sheets("archive")
          lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
          .Cells(lig, 1).Resize(1, 6).Value = Cells(Target.Row, 1).Resize(1, 6).Value
          .Cells(lig, 7).Resize(1, 4).Value = Cells(Target.Row, 9).Resize(1, 4).Value
          .Cells(lig, 11).Resize(1, 3).Value = Cells(Target.Row, 14).Resize(1, 3).Value
          .Cells(lig, 14).Resize(1, 1).Value = Date
          Cells(Target.Row, 1).EntireRow.Delete
          ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
          , AllowSorting:=True
          End With
          End If
          End Sub

          mais il demande le code pour dévérouiller mais pas pour vérouiller comment je peux faire pour qu'il rentre le code automatiquement?
          0
          1. bonjour ericcc comment voit-on le numéro du tableau dynamique
            0
            1. non mais je ne veux pas me spécialiser dans le développement mais dans la maintenance informatique pour aider les novices réparer les pc et tout
              0
              1. Technicien de maintenance informatique n'est peut pas le bon choix pour faire du développement ... >>°^°<<
                0
                1. je vais essayé ca demain la j'ai pas d'excel sius la main, merci je vais essayé l'enregistrement parce que la dernière partie de ton message n'est pas très clair à mes yeux j'ai vraiment du mal avec le language informatique et l'anglais c'est pourquoi je me lance dans cet formation de technicien de maintenance informatique
                  je vais quand même essayé de comprendre ton message demain sur gogole mais comme j'ai déjà dit il y'à beaucoup trop de chose à lire pour rien alors qu'une simple explication de base corespondrai mieux aux attente de tous je sais pas si tu vois ce que je veux dire un site d'exemple le site du zero certe peu enrichie pour le moment mais c'est parceque la présentation est mal faite ce qu'il faut c'est un tuto pour les bases et des sous forum pour les à coté:"paramétrage, utilisation, problème fréquement rencontré, forum problème et forum discussion et ca classé par type comme dans "CCM" tu vois le genre
                  bon je te tiens au courant
                  A +
                  0
                  1. Contributeur
                    Pour la protection:

                    en début de macro déprotèger la feuille :
                    ActiveSheet.Unprotect

                    en fin de macro re-protéger
                    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

                    Ces actions sont facile a retrouver en enregistrant une macro par 'outils / macro / nouvelle macro' sans oublier d'arreter l'enregistrement une fois les actions faites. Il suffit ensuite d'aller dans le module et recuperer les lignes interessantes

                    Comme ça tu peux retrouver comment rafraichir le TCD. Chez moi c'est : ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotCache.Refresh (si tu reprends sur un classeur neuf le tien devrait s'appeler Tableau croisé dynamique1").
                    A mettre, après reflexion, dans l'evenement activate de ta feuille du TCD.
                    Clic-droit sur 'longlet de cette feuille, 'visualiser le code. En haut 2 listes déroulantes, celle de gauche choisir 'worksheet', celle de droite choisir 'activate' et coller la ligne ...refresh pour obtenir :
                    Private Sub Worksheet_Activate()
                    ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotCache.Refresh
                    End Sub
                    en remplaçant 4 par le bon n°

                    eric
                    0
                    1. tu sais quoi tu m'a éclairer sur un bon point et dis comme ca ca vaut bien mieux que les cours qui nous embrouille sur le net
                      je suis parvenu a mes fin grace a vous les gars merci beaucoup et en plus grace a vos conseil je comprend un peu mieux le VB
                      il ne me manque plus que la dernière chose protéger en écriture la feuille2 sauf pour la macro est ce que c'est faisable?
                      je vais quand même me renseigner sur le net bien sur mais si vous avez la réponse n'hésiter pas
                      (désolé pour les fautes d'orthographe)
                      0
                      1. Contributeur
                        Bonjour,

                        .cells(ligne,colonne) te défini la position de la 1ere cellule concernée
                        .resize(ligne, colonne) te défini la taille de la zone. Par exemple .Resize(1, 4) te sélectionne 1 ligne sur 4 colonnes.
                        Adapte en fonction de tes besoin.

                        Pour la 1ère ligne sautée soit tu t'embetes à tester si c'est la 1ere sauvegarde et tu ne fais pas le +1 dans lig = ...., soit tu en profites pour mettre un nom en tete de colonne à chaque champ

                        eric
                        0
                        1. je vous redonne le code actuel:

                          Option Explicit
                          Private Sub Worksheet_Change(ByVal Target As Range)
                          If Cells(Target.Row, 17).Value = "ok" Then
                          Dim lig As Long
                          With Sheets("archive")
                          lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
                          .Cells(lig, 1).Resize(1, 6).Value = Cells(Target.Row, 1).Resize(1, 6).Value
                          .Cells(lig, 7).Resize(1, 4).Value = Cells(Target.Row, 9).Resize(1, 4).Value
                          .Cells(lig, 11).Resize(1, 3).Value = Cells(Target.Row, 14).Resize(1, 3).Value
                          .Cells(lig, 14).Resize(1, 3).Value = Date
                          Cells(Target.Row, 1).EntireRow.Delete
                          End With
                          End If
                          End Sub
                          0
                          1. rectification il ne saute pas une ligne à chaque fois mais il le fais pour la première ligne que j'archive?
                            0
                            1. ah oui j'ai oublié la commande me copie bien la ligne sur une ligne vierge mais a chaque fois il y'a un saut d'une ligne
                              0
                              1. y'à du nouveau c'est ok pour pratiquement toute la commande seulement il me copie bien la date dans la colonne N mais il me la mais aussi sur la O et la P ca ne me serre pas a grand chose d'avoir trois fois la date lol
                                ensuite j'aurai voulu que la feuille sois protéger en écriture mais pas pour la macro c'est possible?
                                Merci Eric et gbinforme pour votre aide, vous assurez!!!
                                0
                                1. Contributeur
                                  Tu as remplacé sel par target, il faut le remplacer partout
                                  eric
                                  0
                                  1. c'est bon j'ai compris déjà pourquoi je galéré je ne rentré pas le code au bon endroit maintenant j'ai fait ca:

                                    Option Explicit
                                    Private Sub Worksheet_Change(ByVal Target As Range)
                                    If Cells(Target.Row, 17).Value = "ok" Then
                                    Dim lig As Long
                                    With Sheets("archive")
                                    lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
                                    .Cells(lig, 1).Resize(1, 6).Value = Cells(sel.Row, 1).Resize(1, 6).Value
                                    .Cells(lig, 7).Resize(1, 4).Value = Cells(sel.Row, 9).Resize(1, 4).Value
                                    .Cells(lig, 11).Resize(1, 3).Value = Cells(sel.Row, 14).Resize(1, 3).Value
                                    .Cells(lig, 14).Resize(1, 3).Value = Date
                                    Cells(sel.Row, 1).EntireRow.Delete
                                    End With
                                    End If
                                    End Sub

                                    Donc quand je l'essai j'ai un message d'erreur "erreur de compilation: variable non définie"
                                    je fais ok la ligne private...... se met en jaune et sur la ligne .Cell(lig,1)....... sel est sélectionné
                                    j'espère que j'ai été clair et que quelqu'un pourra m'aidé aussi
                                    merci
                                    0
                                    1. très bien alors je ne demande qu'à comprendre ça me fait pareil:
                                      alors d'abord quand je crée une macro via VBA il lui faut un nom je dois mettre ce que je veux ou "Worksheet_Change"?
                                      en gros à quoi corespond la première ligne que tu me donnes? c'est quoi private?
                                      quand je rentre un nom VBA me met automatiquement la première ligne "Sub nom de la macro ()" est ce que je dois la remplacer par la tienne?
                                      Trop de question et malheuresement pas de réponse sur les forums je sais que ca doit etre simple mais cette macro je ne l'ai trouvé exposer dans aucun forum et pourtant j'ai cherché.
                                      Merci encore pour votre aide
                                      0
                                      1. Contributeur
                                        Bonjour,

                                        le début doit plutôt ressembler à ça:
                                        Private Sub Worksheet_Change(ByVal Target As Range)
                                        If Cells(Target.Row, 13).Value = "achevée" Then

                                        eric
                                        0
                                        1. Sub Worksheet_Change()
                                          If Cells(sel.Row, 13).Value = "achevée" Then
                                          Dim lig As Long
                                          With Sheets("archive des commandes cloturées")
                                          lig = .Cells.SpecialCells(xlCellTypeLastCell).Row + 1
                                          .Cells(lig, 1).Resize(1, 6).Value = Cells(sel.Row, 1).Resize(1, 6).Value
                                          .Cells(lig, 7).Resize(1, 4).Value = Cells(sel.Row, 9).Resize(1, 4).Value
                                          .Cells(lig, 11).Resize(1, 3).Value = Cells(sel.Row, 14).Resize(1, 3).Value
                                          .Cells(lig, 14).Resize(1, 3).Value = Date
                                          Cells(sel.Row, 1).EntireRow.Delete
                                          End With
                                          End If
                                          End Sub

                                          j'ai copié ca et l'execution s'arrete sur la 2ème ligne "erreur d'execution 424":objet requis

                                          ca fait deux heure que je cherche l'erreur pas trouvé si tu pouvais me mettre sur la voie ce serait sympas merci beaucoup
                                          0
                                          • 1
                                          • 2