VBA erreur d'objet

Résolu/Fermé
mcou - 5 juil. 2012 à 12:28
 mcou - 10 juil. 2012 à 14:44
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

Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 289
Modifié par Bidouilleu_R le 5/07/2012 à 15:20
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
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
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 289
9 juil. 2012 à 23:01
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
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
10 juil. 2012 à 09:21
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
c'est à dire ?! je dois déclarer une variable nouvelle auquelle j'affecterais la plage ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
10 juil. 2012 à 09:49
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
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 289
10 juil. 2012 à 10:21
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
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
je comprend parfaitement vos remarques. mais ma macro fonctionne bien :)
0
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
10 juil. 2012 à 14:07
ok,
n'oublie pas de mettre en résolu stp
eric
0
sur ce sujet, je n'y arrive pas. je ne trouve plus le lien "marqué comme résolu"
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
10 juil. 2012 à 14:40
Sans doute parce que tu n'es pas inscrit. C'est en haut, vers ton titre.
Je le fais pour toi.
eric
0
Merci pour tout !
0