VBA erreur d'objet

Résolu
mcou -  
 mcou -
Bonjour,

Nouveau problème aujourd'hui pour moi. J'ai créé une macro intermédiaire qui effectue un copier/coller et supprime une ligne. Voici le code :

Sub copiecom() 'Permet de copier une cellule dans une autre (cette macro est une sous-macro / macro intermédiaire)

Dim Plage2 as range

Set Plage2 = Application.InputBox("Veuillez sélectionner la cellule à copier correspondant au commentaire initial de la ligne (colonne J). ", "Sélection de cellules", Type:=8)
MsgBox ("La plage que vous avez sélectionné est : " & Plage2.Address) 'indique l'adresse de la cellule sélectionnée
Range(Plage2.Address).Copy 'copie la cellule sélectionnée
ActiveSheet.Paste 'déjà programmée dans une autre macro, la cellule plage2 est collée
Range(Plage2.Address).Select
Selection.EntireRow.Delete 'supprime entièrement la ligne de la cellule qui a été copiée

End Sub

Le problème : la macro fonctionne un coup sur trois... et je pense que le souci vient de la cellule qui doit être copiée. Un erreur sur "Set Plage2 = ..." intervient. Je ne comprend pas pourquoi. Est-ce que quelqu'un aurais une solution pour que n'importe qu'elle cellule copiée n'engendre pas une erreur dans la macro.

Merci encore et encore pour les aides que vous m'apporter.

4 réponses

  1. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    non ce n'est pas set plage2!

    lorsque tu veux copier une valeur par exemple
    tu vas à l'adresse de cette valeur : tu copies dans la mémoire
    tu vas à une autre adresse , tu colles la valeur

    Dans ton code tu n'as pas donné l'adresse ou tu colles.
    Le fait de coller est donné par activesheet.paste.

    Sub copiecom() 'Permet de copier une cellule dans une autre (cette macro est une sous-macro / macro intermédiaire) 
    
    Dim Plage2 As Range 
    
    Set Plage2 = Application.InputBox("Veuillez sélectionner la cellule à copier correspondant au commentaire initial de la ligne (colonne J). ", "Sélection de cellules", Type:=8) 
    MsgBox ("La plage que vous avez sélectionné est : " & Plage2.Address) 'indique l'adresse de la cellule sélectionnée 
    Range(Plage2.Address).Copy 'copie la cellule sélectionnée dans la mémoire 
    'Ici il faut mettre l'adresse de la cible 
    ' c'est à dire la feuille si besoin 
    ' la cellule 
    'puis faire activesheet.paste 
    
    'ex : sheets("Feuil2").select 
    '     range("A5").select
    
    ActiveSheet.Paste 'déjà programmée dans une autre macro, la cellule plage2 est collée 
    Range(Plage2.Address).Select 
    Selection.EntireRow.Delete 'supprime entièrement la ligne de la cellule qui a été copiée 
    
    End Sub
    0
    1. mcou
       
      comme je le disais, cette macro est complémentaire à une autre.
      ma définition du lieu de "collage" est dans ma macro générale. le souci ne vient pas de là puisque cela fonctionne partiellement... et lorsqu'il y a un bug de macro on m"indique : erreur sur objet. et quand je fais déboguage c'est sur la ligne Set PLage2 ... qu'il y a l'erreur... :/
      Tout à l'heure, quand j'ai refait des tests, tout fonctionnait... mais je crains que l'utilisateur final soit confronté à ce problème.
      Merci pour ta réponse.
      0
  2. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    Ben ! Non je suis pas d'accord.

    la structure doit être
    plage(source1) à identifier
    copier cette source (plage ou cellule)
    plage (but) à identifier que tu peux aussi sélectionner
    coller le résultat.

    Dans ton cas il faut savoir comment est déclaré ton objet plage.
    est-il public? accessible depuis n'importe quel module?

    je pense que ton problème vient de là et que du fait que tu n'as pas respecté
    la procédure ... tu as du mal à voir l'origine du problème.

    si tu rencontres cette erreur sur l'objet c'est qu'il n'est pas défini et si à d'autre moment ça marche c'est parce qu'il n'est pas effacer ou libérer.
    0
    1. mcou
       
      en fait, ma plage (source1) est définie par macro principale.
      ce qui fait que j'ai déjà l'adresse de la cellule où je dois copier l'info. (grâce à une active cell).
      si tu veux mieux comprendre, je te mets le code en entier ?
      0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Bizarre, vu que tu utilises InputBox type=8 difficile d'avoir une mauvaise référence...

    A ta place je mettrai inputbox dans une variable avant de l'utiliser pour set plage.
    Ca te permettrait de voir sa valeur lorsque ça plante.

    eric
    0
    1. mcou
       
      c'est à dire ?! je dois déclarer une variable nouvelle auquelle j'affecterais la plage ?
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      ex:
      Sub copiecom()    'Permet de copier une cellule dans une autre (cette macro est une sous-macro / macro intermédiaire)
      
          Dim Plage2 As Range, cel As String
          cel = Application.InputBox("Veuillez sélectionner la cellule à copier correspondant au commentaire initial de la ligne (colonne J). ", "Sélection de cellules", Type:=8).Address
          MsgBox ("La plage que vous avez sélectionné est : " & cel)    'indique l'adresse de la cellule sélectionnée
          Set Plage2 = Range(cel)
          Range(Plage2.Address).Copy    'copie la cellule sélectionnée dans la mémoire
          'Ici il faut mettre l'adresse de la cible
          ' c'est à dire la feuille si besoin
          ' la cellule
          'puis faire activesheet.paste
      
          'ex : sheets("Feuil2").select
          '     range("A5").select
      
          ActiveSheet.Paste    'déjà programmée dans une autre macro, la cellule plage2 est collée
          Range(Plage2.Address).Select
          Selection.EntireRow.Delete    'supprime entièrement la ligne de la cellule qui a été copiée
      
      End Sub

      Ceci dit la remarque de bidouilleur n'est pas infondée. Il y a une logique qui n'est pas respectée mais c'est un autre problème.

      eric
      0
    3. Bidouilleu_R Messages postés 1209 Statut Membre 296
       
      bonjour,
      eriic a raison en utilisant une variable tu pourras assi suivre son état.
      et aussi pour la variable objet que tu as déclaré avec une "activecell" dans la macro principale.
      peux-tu montrer cette partie du code?
      0
    4. mcou
       
      mon code en entier :

      Option Explicit
      
      Dim Plage As Range
      Dim Plage2 As Range
      
      Sub Verif_Solde()
      Dim I   As Long 'déclaration de la variable I comme étant un entier long
      
      'se placer au début de la ligne à solder en sélectionnant toute la ligne
      'il faut que la cellule active soit en colonne A !
      
      Set Plage = Application.InputBox("Veuillez sélectionner la ligne que vous voulez solder. Placez vous de façon à ce que la cellule active soit à l'intersection de la ligne que vous voulez solder et de la colonne A . ", "SELECTION DE LA LIGNE", Type:=8)
      'oblige la saisie d'une plage de donnée et renvoie cette plage à la variable Plage définie auparavant
      MsgBox ("La plage que vous avez sélectionnée est : " & Plage.Address) 'indique l'adresse de la plage sélectionnée
      
      ActiveCell.Offset(0, 12).Select 'sélectionne la cellule de la ligne correspondant à la colonne LN/BW/LR
      ' cette cellule doit être impérativement remplie
      Do While ActiveCell.Value = "" ' la boucle s'exécute tant que la cellule est vide
      MsgBox "La cellule doit être impérativement remplie ", vbCritical
      ActiveCell = UCase(InputBox("Veuillez indiquer l'état de la commande", "LN/BW/LR", ""))
      Loop
      
      ActiveCell.Offset(0, 1).Select 'se place dans la colonne delivery
      Do While ActiveCell.Value <> "Y" ' la boucle s'exécute tant que la cellule est vide
      MsgBox "La cellule doit être impérativement remplie par Y ", vbCritical
      ActiveCell = UCase(InputBox("Veuillez indiquer l'état de la commande.", "DELIVERY", "Y"))
      Loop
      
      ActiveCell.Offset(0, 1).Select 'se place dans la colonne date cegid
      
      I = ActiveCell.Row 'indique que la variable I est le numéro de la ligne active
      Do While ActiveCell.Value < Cells(I, 8).Value 'Si la valeur en Pi est inférieure de la valeur en Hi, avec 8 correspond au numéro de la colonne H
      MsgBox "La date Cegid (colonne P) est inférieure à la date initialement prévue en colonne H. La date Cegid doit lui être impérativement supérieure ou égale.", vbCritical
      ActiveCell = InputBox("Veuillez saisir de nouveau la date Cegid en colonne Q", "DATE CEGID", Cells(I, 8).Value)
      Loop
      
      ActiveCell.Offset(0, 1).Select 'se place dans la colonne montant
      
      I = ActiveCell.Row 'indique que la variable I est le numéro de la ligne active
      Do While ActiveCell.Value <> Cells(I, 7).Value 'Si la valeur en Gi est différente de la valeur en Qi, avec 7 correspond au numéro de la colonne G et 17 à la colonne Q
      MsgBox "Le montant Cegid (colonne Q) est différent du montant saisi initialement (colonne G).", vbCritical
      ActiveCell = InputBox("Veuillez saisir de nouveau le montant Cegid (colonne Q)", "AMOUNT", Cells(I, 7).Value)
      Loop
      
      ActiveCell.Offset(0, 1).Select 'demande SCM
      If MsgBox("Le solde de la ligne s'effectue-t-il en cours du mois ? (SCM)", vbQuestion + vbYesNo) = vbYes Then
      ActiveCell = "SCM"
      End If
      
      If MsgBox("Avez-vous-un commentaire à copier avec une ligne doublon ? La ligne doublon, dont le commentaire sera copié, sera ensuite supprimée", vbQuestion + vbYesNo) = vbYes Then
      ActiveCell.Offset(0, -7).Select
      Call Copie_Comments
      End If
      
      Range(Plage.Address).Select 'sélectionne la ligne initiale
      Selection.Interior.ColorIndex = 15 'solde la ligne initiale en attribuant la couleur grise aux cellules
      
      Calculate 'recalcule la feuille
      
      MsgBox "La vérification du rapprochement est terminée avec succès et la ligne est soldée", vbOKOnly
      
      End Sub
      Sub Copie_Comments()  'Permet de copier le commentaire dans la bonne cellule
      
      Set Plage2 = Application.InputBox("Veuillez sélectionner la cellule à copier correspondant au commentaire initial de la ligne (colonne J). ", "COMMENTAIRE", Type:=8)
      MsgBox ("La plage que vous avez sélectionnée est : " & Plage2.Address)
      Range(Plage2.Address).Copy 'copie le commentaire
      ActiveSheet.Paste 'colle le commentaire dans la cellule active (adresse définie dans la macro principale)
      Range(Plage2.Address).Select 'sélectionne le commentaire à supprimer
      Selection.EntireRow.Delete 'supprime la ligne du commentaire en entier
      
      End Sub
      0
    5. mcou
       
      je comprend parfaitement vos remarques. mais ma macro fonctionne bien :)
      0
  4. mcou
     
    Finalement, j'ai contourné le problème. Voici une macro qui fonctionne bien !

    Option Explicit
    
    Dim Plage As Range
    Dim Noligne As Long
    
    Sub Verif_Solde()
    Dim I   As Long 'déclaration de la variable I comme étant un entier long
    
    'se placer au début de la ligne à solder en sélectionnant toute la ligne
    'il faut que la cellule active soit en colonne A !
    
    MsgBox ("La ligne que vous voulez soldée correspond au numéro de référence : " & ActiveCell.Value)
    Noligne = ActiveCell.Row
    
    ActiveCell.Offset(0, 12).Select 'sélectionne la cellule de la ligne correspondant à la colonne LN/BW/LR
    ' cette cellule doit être impérativement remplie
    Do While ActiveCell.Value = "" ' la boucle s'exécute tant que la cellule est vide
    MsgBox "La cellule doit être impérativement remplie ", vbCritical
    ActiveCell = UCase(InputBox("Veuillez indiquer l'état de la commande", "LN/BW/LR", ""))
    Loop
    
    ActiveCell.Offset(0, 1).Select 'se place dans la colonne delivery
    Do While ActiveCell.Value <> "Y" ' la boucle s'exécute tant que la cellule est vide
    MsgBox "La cellule doit être impérativement remplie par Y ", vbCritical
    ActiveCell = UCase(InputBox("Veuillez indiquer l'état de la commande.", "DELIVERY", "Y"))
    Loop
    
    ActiveCell.Offset(0, 1).Select 'se place dans la colonne date cegid
    
    I = ActiveCell.Row 'indique que la variable I est le numéro de la ligne active
    Do While ActiveCell.Value < Cells(I, 8).Value 'Si la valeur en Pi est inférieure de la valeur en Hi, avec 8 correspond au numéro de la colonne H
    MsgBox "La date Cegid (colonne P) est inférieure à la date initialement prévue en colonne H. La date Cegid doit lui être impérativement supérieure ou égale.", vbCritical
    ActiveCell = InputBox("Veuillez saisir de nouveau la date Cegid en colonne Q", "DATE CEGID", Cells(I, 8).Value)
    Loop
    
    ActiveCell.Offset(0, 1).Select 'se place dans la colonne montant
    
    I = ActiveCell.Row 'indique que la variable I est le numéro de la ligne active
    Do While ActiveCell.Value <> Cells(I, 7).Value 'Si la valeur en Gi est différente de la valeur en Qi, avec 7 correspond au numéro de la colonne G et 17 à la colonne Q
    MsgBox "Le montant Cegid (colonne Q) est différent du montant saisi initialement (colonne G).", vbCritical
    ActiveCell = InputBox("Veuillez saisir de nouveau le montant Cegid (colonne Q)", "AMOUNT", Cells(I, 7).Value)
    Loop
    
    ActiveCell.Offset(0, 1).Select 'demande SCM
    If MsgBox("Le solde de la ligne s'effectue-t-il en cours du mois ? (SCM)", vbQuestion + vbYesNo) = vbYes Then
    ActiveCell = "SCM"
    End If
    
    If MsgBox("Avez-vous-un commentaire à copier avec une ligne doublon ? La ligne doublon, dont le commentaire sera copié, sera ensuite supprimée", vbQuestion + vbYesNo) = vbYes Then
    ActiveCell.Offset(0, -7).Select
    Call Copie_Comments
    End If
    
    Range("A" & Noligne - 1).Select
    Selection.EntireRow.Select 'sélectionne la ligne initiale
    Selection.Interior.ColorIndex = 15 'solde la ligne initiale en attribuant la couleur grise aux cellules
    
    Calculate 'recalcule la feuille
    
    MsgBox "La vérification du rapprochement est terminée avec succès et la ligne est soldée", vbOKOnly
    
    End Sub
    
    Sub Copie_Comments()  'Permet de copier le commentaire dans la bonne cellule
    
    Dim Plage As Range
    Set Plage = Application.InputBox("Veuillez sélectionner la cellule à copier correspondant au commentaire initial de la ligne (colonne J). ", "COMMENTAIRE", Type:=8)
    MsgBox ("La plage que vous avez sélectionnée est : " & Plage.Address)
    Range(Plage.Address).Copy 'copie le commentaire
    ActiveSheet.Paste 'colle le commentaire dans la cellule active (adresse définie dans la macro principale)
    Range(Plage.Address).Select 'sélectionne le commentaire à supprimer
    Selection.EntireRow.Delete 'supprime la ligne du commentaire en entier
    
    End Sub
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      ok,
      n'oublie pas de mettre en résolu stp
      eric
      0
    2. mcou
       
      sur ce sujet, je n'y arrive pas. je ne trouve plus le lien "marqué comme résolu"
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Sans doute parce que tu n'es pas inscrit. C'est en haut, vers ton titre.
      Je le fais pour toi.
      eric
      0
    4. mcou
       
      Merci pour tout !
      0