Problème macro complexe (pour moi :D)

  • Initiateur de la discussion Initiateur de la discussion Rhaly
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Rhaly

XLDnaute Nouveau
Bonjour à tous et au forum,

Voila je continue à bosser sur une macro permettant d'automatiser certaines taches :

Ma macro consiste à demander à l'utilisateur de rentrer le nom et prénom du nouveau conseiller et cela lui crée une feuille à son nom selon un modèle.

Mon problème se situe au niveau de la feuille "PROD" dans laquelle je souhaite ajouter une ligne dans chacun des 2 tableaux selon un modèle situé ligne 49 et 50.

Pour cela, j'ai crée la macro Ajout_ligne_Prod (situé dans le modèle 2) qui fait le nécessaire quand je la lance moi-meme mais quand je l'introduis dans la macro principale Ajout_Conseiller ca me crée les 2 lignes dans la feuille du conseiller.

Help! 😀
 

Pièces jointes

Re : Problème macro complexe (pour moi 😀)

Salut Rhaly,

Dans ton code, tu ne qualifie pas l'objet conteneur, il ne faut pas oublier le "." point

VB:
Sub Ajout_Conseiller()
  Dim Nom As String
  Dim Prenom As String
  Dim Initiales As String
  Dim NomConseiller As String
  Dim Modele As Worksheet
  Application.EnableEvents = False
  With Sheets("PARAMETRES")
    'Récuperer les variables
    Nom = InputBox("Nom du conseiller?", "Nom")  'Variable nom entré par utilisateur
    Prenom = InputBox("Prénom du conseiller", "Prénom")  'Variable prénom entré par utilisateur
    NomConseiller = Nom & " " & Prenom   'Concaténation variable nom et prénom pour variable nomconseiller
    .Range("A200").End(xlUp).Offset(1, 0).Value = NomConseiller  'Entrée de la variable nomconseiller dans la 1ere ligne vide
    Initiales = .Range("A200").End(xlUp).Offset(0, 1).Value  'Variable initiales
    'Inserer une feuille
    Set Modele = Sheets("MODELE")
    Modele.Select
    Modele.Copy After:=Sheets(1)    'Copie de la feuille MODELE
    ActiveSheet.Name = NomConseiller    'Nomme la feuille avec le nom du conseiller
    .[A1].Sort key1:=.[A1], Order1:=xlAscending, Header:=xlGuess
    For Compteur = .Range("A65536").End(xlUp).Row To 2 Step -1
      NomDeLaFeuille = .Range("A" & Compteur)
      Sheets(NomDeLaFeuille).Move Before:=Sheets(1)
    Next
  End With
  With Sheets(NomConseiller)
    .Range("A6:A500").Name = Initiales & "_" & "Type"
    .Range("B6:B500").Name = Initiales & "_" & "Centre"
    .Range("D6:D500").Name = Initiales & "_" & "Date"
    .Range("I6:I500").Name = Initiales & "_" & "Imprimer"
    .Range("J6:J500").Name = Initiales & "_" & "Mens"
    .Range("K6:K500").Name = Initiales & "_" & "Dom"
    .Range("L6:L500").Name = Initiales & "_" & "GesteCo"
    .Range("M6:M500").Name = Initiales & "_" & "Visa"
    .Range("A1").Value = Initiales
    .Range("H5").Value = Prenom & " " & Nom
  End With
  Dim DerniereLigneFeuille As Range
  Dim AvantDerniereLigneFeuille As Range
  Dim DerniereLigneDmt As Range
  Dim AvantDerniereLigneDmt As Range
  Dim DerniereLigneProd As Range
  Dim AvantDerniereLigneProd As Range
  With Sheets("PROD")
    Set DerniereLigneFeuille = .Range("E200").End(xlUp)
    Set AvantDerniereLigneFeuille = .Range("E" & Range("E200").End(xlUp).Row - 1)
    Set DerniereLigneDmt = .Range("A5").End(xlDown)
    Set DerniereLigneProd = .Range("A200").End(xlUp)
    .Rows(DerniereLigneDmt.Row).Insert shift:=xlUp
    .Rows(DerniereLigneProd.Row).Insert shift:=xlUp
    Set AvantDerniereLigneDmt = .Range("A" & Range("A5").End(xlDown).Row - 1)
    Set AvantDerniereLigneProd = .Range("A" & Range("A200").End(xlUp).Row - 1)
    DerniereLigneFeuille.EntireRow.Copy Destination:=AvantDerniereLigneProd
    AvantDerniereLigneFeuille.EntireRow.Copy Destination:=AvantDerniereLigneDmt
  End With
  Application.EnableEvents = True
End Sub

Testé, ça à l'air de fonctionner 😉

Nota : Attention au copier/coller de ligne sur feuille non active
Si tu fait un "Select" tu auras une erreur
Code:
DerniereLigneFeuille[COLOR=red].Select[/COLOR]
Selection.EntireRow.Copy Destination:=AvantDerniereLigneProd

A+
 
Re : Problème macro complexe (pour moi 😀)

Bonjour et tout d'abord merci pour ta réponse.

Grace à ton conseil, l'insertion dans la macro principale est faite.
Par contre, j'ai un petit problème avec le résultat dans l'onglet PROD.

Les 2 lignes sont bien insérées au bon endroit par contre le problème réside dans les copy des lignes 46 et 47.

La ligne 47 devrait se trouver au dessus du total dans le 2eme tableau et la ligne 46 au dessus du total dans le 1er tableau.

Hors la, la ligne 47 écrase la ligne 5 et la ligne 46 n'est pas du tout copié.

Pourtant en relisant la macro la destination me parait claire. Est-ce un problème du à la suppresion du row.select?
 
Re : Problème macro complexe (pour moi 😀)

Re,

En fait le problème c'est que tu insères des lignes après avoir mémorisé tes numéros, donc tu te retrouves avec 2 lignes d'écart

Voici le code pour la dernière partie
VB:
  With Sheets("PROD")
    Set DerniereLigneDmt = .Range("A5").End(xlDown)
    Set AvantDerniereLigneFeuille = .Range("E" & Range("E200").End(xlUp).Row - 1)
    AvantDerniereLigneFeuille.EntireRow.Copy
    DerniereLigneDmt.Insert Shift:=xlDown
    ' Un ligne a été insérée, récupérer le numéro de la dernière
    Set DerniereLigneFeuille = .Range("E200").End(xlUp)
    Set DerniereLigneProd = .Range("A200").End(xlUp)
    DerniereLigneFeuille.EntireRow.Copy
    DerniereLigneProd.Insert Shift:=xlDown
  End With

A+
 
Re : Problème macro complexe (pour moi 😀)

Grace à tes conseils, je suis arrivé à mes fins. Merci Bruno. J'apprécie 😀

Pour info, j'avais des problèmes avec la variable AvantDerniereLigneFeuille (macro fonctionnait dans un module à part mais pas dans la macro Ajout_Conseiller) donc j'ai modifié le code comme ci-dessous et ça fonctionne.

Code:
  With Sheets("PROD")
  Dim DerniereLigneFeuille As Range
  Dim AvantDerniereLigneFeuille As Range
  Dim DerniereLigneDmt As Range
  Dim AvantDerniereLigneDmt As Range
  Dim DerniereLigneProd As Range
  Dim AvantDerniereLigneProd As Range
    Set DerniereLigneDmt = .Range("A5").End(xlDown)
    Set AvantDerniereLigneFeuille = .Range("H200").End(xlUp)
    AvantDerniereLigneFeuille.EntireRow.Copy
    DerniereLigneDmt.Insert Shift:=xlDown
    ' Un ligne a été insérée, récupérer le numéro de la dernière
   Set DerniereLigneFeuille = .Range("E200").End(xlUp)
    Set DerniereLigneProd = .Range("A200").End(xlUp)
    DerniereLigneFeuille.EntireRow.Copy
    DerniereLigneProd.Insert Shift:=xlDown

Encore merci. Bonne soirée ^^
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
439
Retour