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
- Erreur 0x80070643 - Accueil - Windows
- Objet interdit en cabine ryanair - Guide
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Trouver objet avec photo - Guide
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.