VBA erreur d'objet
Résolu
mcou
-
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.
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.
A voir également:
- VBA erreur d'objet
- Vente objet occasion entre particulier - Guide
- Objet interdit en cabine ryanair - Guide
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
4 réponses
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
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.
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
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
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
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.