VBA erreur d'objet
Résolu/Fermé
A voir également:
- VBA erreur d'objet
- Erreur 0x80070643 - Guide
- Vente objet occasion entre particulier - Guide
- Erreur 38 free ✓ - Forum Mobile
- Iptv erreur de lecture - Forum TV & Vidéo
- Erreur 1004 vba ✓ - Forum Excel
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
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.
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
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
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.
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.
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
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
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
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
10 juil. 2012 à 09:49
Bonjour,
ex:
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
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
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
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?
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?
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
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
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
10 juil. 2012 à 14:07
ok,
n'oublie pas de mettre en résolu stp
eric
n'oublie pas de mettre en résolu stp
eric
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
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
Je le fais pour toi.
eric
5 juil. 2012 à 17:45
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.