Copier le code VBA d'une feuille vers une autre feuille

Bonjour à tous, j'ai besoin de copier le code VBA associé à une feuille qui me sert de référence vers une autre feuille de travail

J'ai déjà manipulé des copies de code sur des macros avec le code ci dessous mais je ne parviens pas du tout à l'adapter car il ne semble pas fonctionner pour des feuilles. Code que je tente de modifier :

dim LeCodeActuel as string
'effacement du code existant
With ThisWorkbook.VBProject.VBComponents("macrodimensionnementemf").codemodule
    .DeleteLines 1, .CountOfLines
end with
'récupération du code à copier
    With ThisWorkbook.VBProject.VBComponents("macrodimensionnementskid").codemodule
    If .CountOfLines > 0 Then
        LeCodeActuel = .Lines(1, .CountOfLines)
    End If
    End With
'copie du code récupéré vers la destination
    With ThisWorkbook.VBProject.VBComponents("macrodimensionnementemf").codemodule
    .AddFromString LeCodeActuel

merci d'avance à toute personne qui puisse me guider

Bonjour,

Alors c'est normal que ça ne fonctionne pas car votre code se réfère à un module VBA, pas un module de feuille.

Mais avant d'aller plus loin on devrait se poser quelques questions :

  • Pourquoi copiez-vous le code via du code ? Ne pouvez-vous pas le faire manuellement ?
  • La question qui suit est : si vous devez l'automatiser c'est probablement qu'il y a beaucoup de feuilles, dans ce cas pourquoi ne pas réfléchir à déplacer ce code dans un module VBA et/ou dans l'objet workbook ?

Si vous pouviez préciser l'objectif du code copié, et partager un fichier d'exemple, je pense qu'on pourrait avancer plus productivement.

Bonjour et merci de vous intéresser à mon sujet.

le but de ce code est de gérer ce qu'il se passe dans la feuille type, on coche une cas de réalisation et la couleur de la ligne change (ce n'est qu'un exemple), on me demande régulièrement d'ajouter des fonctions à ce code.

J'ai bien pensé à transféré ce code qui se trouve dans "Private Sub Worksheet_Change(ByVal Target As Range)" vers une macro ce qui règlera le problème à l'avenir toutefois il reste un souci :

Ce programme génère des rapports sous forme de feuille excell et ces rapports peuvent être rechargés pour modification (Mise en place d'actions correctives), lors de ce chargement le code de la feuille reste identique à l'original et la solution évoquée ci dessus ne fonctionnerait donc pas si on charge un rapport créé avant modification du programme.

J'espère avoir été plus clair sur mon besoin qui n'existe en effet que dans le cas ou l'on charge un rapport ancien c'est à dire généré avant que je ne renvoie le change de la feuille vers une macro

bonne journée

Voici pour Info le code qui se trouve dans les feuilles :

Private Sub Worksheet_Change(ByVal Target As Range)

Dim KeyCells As Range

Dim ligne, ligne2, ligne3, lignejaune, resultat1, resultat2, resultat12, colonne, question, enregistre, nbimage, nbactmaj, i, numpoint, j As Integer

Dim copier, strnumpoint As String

Dim PhotoPresente, PhotoSupprime, trouvé As Boolean

    'KeyCells contient la zone d'alerte pour point jaunes

    Set KeyCells = Range("H1:J1000")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _

        Is Nothing Then

        ligne = Target.Row

        ligne2 = Target.Row

        ligne3 = Target.Row

        colonne = Target.Column

        If colonne = 8 Then

            'enregistrement d'un point jaune

            resultat1 = InStr(1, Range("H" & ligne).Value, "J")

            resultat2 = InStr(1, Range("H" & ligne).Value, "j")

            If Range("H" & ligne).Value = "R" Or Range("H" & ligne).Value = "r" Then resultat2 = 2

            If resultat1 = 1 Or resultat2 = 1 Then

                'procédure de copie du point jaune

                lignejaune = Worksheets("Skid").Range("B86").Value

                copier = Range("B" & ligne).Value

                Range("L" & 4 + lignejaune).Value = copier

                copier = Range("E" & ligne).Value

                Range("O" & 4 + lignejaune).Value = copier

                'Mise à jour du nombre de lignes jaune

                lignejaune = lignejaune + 1

                Worksheets("Skid").Range("B86").Value = lignejaune

                'passage de la validation en Jaune

                Range("H1").Interior.ColorIndex = 6

            End If

            If resultat2 = 2 Then

                'point rouge

                Range("H1").Interior.ColorIndex = 3

            End If

        End If

        If colonne = 9 Then

            'je regarde déjà si la case est pleine ou vide

            If Range("I" & ligne2).Value = "" Or Range("I" & ligne2).Value = Null Then

                'initialisation

                PhotoSupprime = False

                trouvé = False

                'récupération du nombre de photo enregistrées

                nbimage = Worksheets("Skid").Range("B88").Value

                'pour chaque image enregistrée je regarde si c'est cette ligne

                For i = 1 To nbimage

                    If Worksheets("Skid").Range("B" & 90 + i).Value = ligne2 Then

                        'la ligne est déjà comptée, j'active l'indicateur

                        PhotoSupprime = True

                    End If

                Next i

                If PhotoSupprime = True Then

                    'je dois effacer cette photo, je commence par en enlever une

                    Worksheets("Skid").Range("B88").Value = nbimage - 1

                    'ensuite je balaye chaque ligne et si c'est celle-ci, soit je décale celle du dessous, soit j'efface si c'est la dernière

                    For j = 1 To nbimage

                        If Worksheets("Skid").Range("B" & 90 + j) = ligne2 Or trouvé = True Then

                            'c'est celle ci j'efface ou je décale et j'initialise trouvé

                            trouvé = True

                            If j = nbimage Then

                                'c'est la dernière alors j'efface

                                Worksheets("Skid").Range("B" & 90 + j) = ""

                            ElseIf j < nbimage Then

                                'ce n 'est pas la dernière alors je décale

                                Worksheets("Skid").Range("B" & 90 + j) = Worksheets("Skid").Range("B" & 90 + j + 1)

                            End If

                        End If

                    Next j

                End If

            End If

            'récupération du nombre de photo déjà présentes

            ' initialisation des variables

            PhotoPresente = False

            'enregistrement d'une photo

            resultat12 = InStr(1, Range("I" & ligne2).Value, "")

            If resultat12 = 1 Then

                'test si la photo existe déjà

                nbimage = Worksheets("Skid").Range("B88").Value

                For i = 1 To nbimage

                    If Worksheets("Skid").Range("B" & 90 + i).Value = ligne2 Then

                        'la ligne existe déjà

                        PhotoPresente = True

                    End If

                Next i

                If PhotoPresente = False Then

                    'c'est une nouvelle photo j'enregistre

                    nbimage = Worksheets("Skid").Range("B88").Value

                    nbimage = nbimage + 1

                    Worksheets("Skid").Range("B88").Value = nbimage

                    'enregistrement du N° de ligne

                    Worksheets("Skid").Range("B" & 90 + nbimage).Value = ligne2

                End If

            End If

        End If

        If colonne = 10 Then

            'j'ai des actions à mettre à jour

            'ecriture du nombre d'action à mettre à jour et de leur lignes

            resultat1 = InStr(1, Range("J" & ligne3).Value, "X")

            resultat2 = InStr(1, Range("J" & ligne3).Value, "x")

            If resultat1 = 1 Or resultat2 = 1 Then

                nbactmaj = Worksheets("Skid").Range("C92").Value

                nbactmaj = nbactmaj + 1

                'enregistrement du N° de ligne

                Worksheets("Skid").Range("D" & 91 + nbactmaj).Value = ligne3

                'enregistrement du nombre de ligne mise à jour

                Worksheets("Skid").Range("C92").Value = nbactmaj

                'détermination si c'est un point jaune

                If ActiveSheet.Range("H" & ligne3).Value = "j" Or ActiveSheet.Range("H" & ligne3).Value = "J" Then

                    'détermination du N° de point jaune

                    NumeroPointJaune.Show 1

                    Do While NumeroPointJaune.Visible = True

                    DoEvents

                    Loop

                    numpoint = Worksheets("Skid").Range("G97").Value

                    'effacement du point jaune dans le tableau de synthèse

                    ActiveSheet.Range("L" & 3 + numpoint).Value = ""

                    ActiveSheet.Range("O" & 3 + numpoint).Value = ""

                End If

                'mise en couleur du fond de cellule

                ActiveSheet.Range("A" & ligne3 & ":" & "J" & ligne3).Select

                Selection.Interior.Color = RGB(226, 239, 218)

            End If

        End If

    End If

End Sub

Merci pour vos explications.

Alors comme je le disais, il existe pour le workbook (classeur) l'évènement Workbook.SheetChange event (Excel) | Microsoft Learn qui correspond à Worksheet.Change mais pour l'ensemble du classeur. Ca permettrai de garder votre code quasiment à l'identique, il faudrait juste changer les références de cellules de la feuille active vers le paramètre Sh (avec un With par exemple).

Mais bon un classeur joint serait utile car je n'ai pas bien compris cette histoire de CR.

Voici le fichier en pièce jointe, chaque feuille contient le code cité sauf la feuille "En_cours" qui peut être rechargée d'une ancienne version

j'ai essayé de transférer ce code dans la macro GestionChangementFeuille (Partie 1 de la solution) mais pour le moment cela ne fonctionne pas

encore merci

Ah oui c'est un gros truc…

Donc dans le module de code de ThisWorkbook, si on remplaçait votre WorksheetChange par ceci, le résultat est-il ok ? J'ai essayé de corriger les références comme je l'évoquais plus haut.

Faites un test sur une feuille après avoir supprimé votre ancienne macro dans le code feuille, et en ajouté dans ThisWorkbook celui ci-dessous.

L'intérêt est que ce code se lancerait pour toutes les feuilles donc plus besoin de le c/c partout. Et maintenance/MAJ plus facile du coup.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
  Dim KeyCells As Range
  Dim ligne, ligne2, ligne3, lignejaune, resultat1, resultat2, resultat12, colonne, question, enregistre, nbimage, nbactmaj, i, numpoint, j  As Integer
  Dim copier, strnumpoint As String
  Dim PhotoPresente, PhotoSupprime, trouvé As Boolean
  'KeyCells contient la zone d'alerte pour point jaunes
  Set KeyCells = Sh.Range("H1:J1000")

  If Not Application.Intersect(KeyCells, Sh.Range(Source.Address)) _
     Is Nothing Then
    ligne = Source.Row
    ligne2 = Source.Row
    ligne3 = Source.Row
    colonne = Source.Column
    If colonne = 8 Then
      'enregistrement d'un point jaune
      resultat1 = InStr(1, Sh.Range("H" & ligne).Value, "J")
      resultat2 = InStr(1, Sh.Range("H" & ligne).Value, "j")
      If Sh.Range("H" & ligne).Value = "R" Or Sh.Range("H" & ligne).Value = "r" Then resultat2 = 2
      If resultat1 = 1 Or resultat2 = 1 Then
        'procédure de copie du point jaune
        lignejaune = Worksheets("Skid").Range("B86").Value
        copier = Sh.Range("B" & ligne).Value
        Sh.Range("L" & 4 + lignejaune).Value = copier
        copier = Sh.Range("E" & ligne).Value
        Sh.Range("O" & 4 + lignejaune).Value = copier
        'Mise à jour du nombre de lignes jaune
        lignejaune = lignejaune + 1
        Worksheets("Skid").Range("B86").Value = lignejaune
        'passage de la validation en Jaune
        Sh.Range("H1").Interior.ColorIndex = 6
      End If
      If resultat2 = 2 Then
        'point rouge
        Sh.Range("H1").Interior.ColorIndex = 3
      End If
    End If
    If colonne = 9 Then
      'je regarde déjà si la case est pleine ou vide
      If Sh.Range("I" & ligne2).Value = "" Or Sh.Range("I" & ligne2).Value = Null Then
        'initialisation
        PhotoSupprime = False
        trouvé = False
        'récupération du nombre de photo enregistrées
        nbimage = Worksheets("Skid").Range("B88").Value
        'pour chaque image enregistrée je regarde si c'est cette ligne
        For i = 1 To nbimage
          If Worksheets("Skid").Range("B" & 90 + i).Value = ligne2 Then
            'la ligne est déjà comptée, j'active l'indicateur
            PhotoSupprime = True
          End If
        Next i
        If PhotoSupprime = True Then
          'je dois effacer cette photo, je commence par en enlever une
          Worksheets("Skid").Range("B88").Value = nbimage - 1
          'ensuite je balaye chaque ligne et si c'est celle-ci, soit je décale celle du dessous, soit j'efface si c'est la dernière
          For j = 1 To nbimage
            If Worksheets("Skid").Range("B" & 90 + j) = ligne2 Or trouvé = True Then
              'c'est celle ci j'efface ou je décale et j'initialise trouvé
              trouvé = True
              If j = nbimage Then
                'c'est la dernière alors j'efface
                Worksheets("Skid").Range("B" & 90 + j) = ""
              ElseIf j < nbimage Then
                'ce n 'est pas la dernière alors je décale
                Worksheets("Skid").Range("B" & 90 + j) = Worksheets("Skid").Range("B" & 90 + j + 1)
              End If
            End If
          Next j
        End If
      End If
      'récupération du nombre de photo déjà présentes
      ' initialisation des variables
      PhotoPresente = False
      'enregistrement d'une photo
      resultat12 = InStr(1, Sh.Range("I" & ligne2).Value, "")
      If resultat12 = 1 Then
        'test si la photo existe déjà
        nbimage = Worksheets("Skid").Range("B88").Value
        For i = 1 To nbimage
          If Worksheets("Skid").Range("B" & 90 + i).Value = ligne2 Then
            'la ligne existe déjà
            PhotoPresente = True
          End If
        Next i
        If PhotoPresente = False Then
          'c'est une nouvelle photo j'enregistre
          nbimage = Worksheets("Skid").Range("B88").Value
          nbimage = nbimage + 1
          Worksheets("Skid").Range("B88").Value = nbimage
          'enregistrement du N° de ligne
          Worksheets("Skid").Range("B" & 90 + nbimage).Value = ligne2
        End If
      End If
    End If
    If colonne = 10 Then
      'j'ai des actions à mettre à jour
      'ecriture du nombre d'action à mettre à jour et de leur lignes
      resultat1 = InStr(1, Sh.Range("J" & ligne3).Value, "X")
      resultat2 = InStr(1, Sh.Range("J" & ligne3).Value, "x")
      If resultat1 = 1 Or resultat2 = 1 Then
        nbactmaj = Worksheets("Skid").Range("C92").Value
        nbactmaj = nbactmaj + 1
        'enregistrement du N° de ligne
        Worksheets("Skid").Range("D" & 91 + nbactmaj).Value = ligne3
        'enregistrement du nombre de ligne mise à jour
        Worksheets("Skid").Range("C92").Value = nbactmaj
        'détermination si c'est un point jaune
        If ActiveSheet.Range("H" & ligne3).Value = "j" Or ActiveSheet.Range("H" & ligne3).Value = "J" Then
          'détermination du N° de point jaune
          NumeroPointJaune.Show 1
          Do While NumeroPointJaune.Visible = True
            DoEvents
          Loop
          numpoint = Worksheets("Skid").Range("G97").Value
          'effacement du point jaune dans le tableau de synthèse
          ActiveSheet.Range("L" & 3 + numpoint).Value = ""
          ActiveSheet.Range("O" & 3 + numpoint).Value = ""
        End If
        'mise en couleur du fond de cellule
        ActiveSheet.Range("A" & ligne3 & ":" & "J" & ligne3).Select
        Selection.Interior.Color = RGB(226, 239, 218)
      End If
    End If
  End If
End Sub

merci beaucoup pour votre aide, le code semble fonctionner partiellement, je fais quelques test plus poussé histoire d'essayerv de régler cela moi meme et je reviens vers vous

Ok, bon courage.Je dois avouer que le projet est très lourd et c'est dur pour moi d'en saisir tout le fonctionnement.

Une idée, au début du sub que je vous ai envoyé, ajoutez Application.EnableEvents = False et à la fin avant la dernière ligne Application.EnableEvents = True. Ca évitera que les autres macros interfèrent.

Ensuite je viens de voir que vos déclarations ne font pas ce que vous voulez. Quand vous écrivez Dim a, b As Integer, vous avez a qui est Variant et b qui est Integer. Le As ne s'applique qu'au dernier élément.Donc la déclaration correcte est la suivante :

  Dim KeyCells As Range
  Dim ligne As Integer, ligne2 As Integer, ligne3 As Integer, lignejaune As Integer, resultat1 As Integer, resultat2 As Integer, resultat12 As Integer, colonne As Integer, question As Integer, enregistre As Integer, nbimage As Integer, nbactmaj As Integer, i As Integer, numpoint As Integer, j As Integer
  Dim copier As String, strnumpoint As String
  Dim PhotoPresente As Boolean, PhotoSupprime As Boolean, trouvé As Boolean

OK, merci pour ces informations complémentaire, cela me permets d'en apprendre de plus en plus et pour le code Transmis, tout est OK pour moi, c'est juste que je n'ai pas intégré dans le code transmis une nouvelle fonction ajoutée ce matin

Un très grand merci pour votre aide

Je vous en prie, content d'aider. Si vous avez d'autres questions n'hésitez pas.

Si le problème est résolu, pensez à cloturer le fil.

Bonne journée.

Rechercher des sujets similaires à "copier code vba feuille"