La méthode copy de la classe range a échoué

RONIBO

XLDnaute Impliqué
Bonjour,

J'aimerais éviter cette erreur (La méthode copy de la classe range a échoué) lorsque j'essaye d'insérer ou de supprimer une ligne à partir des cellules déverrouillées.

J'utilise un bouton de commande qui me permet d'insérer des lignes seulement dans mon tableau ou il y a "Qté" "Uté" "Désignation" etc...

Pour éviter les erreurs lorsque j'insère une ligne en dehors de mon tableau cité ci-dessus, j'aimerais qu'un message (msgbox) comme "Vous ne pouvez pas insérer des lignes ici" apparaisse à l'écran.

Voici le code et un fichier exemple :

Code:
Private Sub TAjouter_Click()
ActiveSheet.Unprotect
ligne = Selection.Row
Application.ScreenUpdating = False
For n = 1 To CInt(NombreLigne.Value)
Selection.Offset(1, 0).EntireRow.Insert Shift:=xlShiftDown
Range("A" & ligne & ":I" & ligne).Copy
Rows(ligne + 1).RowHeight = 15
Range("A" & ligne + 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("G" & ligne).Copy Destination:=Range("G" & ligne + 1)
Range("I" & ligne).Copy Destination:=Range("I" & ligne + 1)
ligne = ligne + 1
Next
Range("TotalH.T.").FormulaR1C1 = "=SUM(R21C:R[-1]C)"
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingRows:=True
Unload Me
End Sub
Private Sub TSupprimer_Click()
ActiveSheet.Unprotect
Selection.EntireRow.Delete
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingRows:=True
Me.Hide
End Sub

Merci d'avance aux personnes qui vont se pencher sur mon problème

a+
 

Pièces jointes

  • Facture N° - TEST ().xlsm
    195.9 KB · Affichages: 112
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : La méthode copy de la classe range a échoué

Bonjour à tous

RONIBO:
Inutile d'utiliser les Select, Selection, Activate dans ton code.

Pourquoi tu passes par cjoint?
Postes-ton fichier directement sur XLD. C'est plus simple.
Et me dis Pas que ton fichier est trop gros.:rolleyes:
Si tu as lu la charte du forum, tu dois savoir ce que doit être un fichier exemple sur XLD. ;)

PS: Un dernier tit conseil, utilises plutôt les balises [NOPARSE]
Code:
[/NOPARSE][/COLOR][/B][COLOR=#0000ff]Code VBA ici[/COLOR][COLOR=#b22222][B][NOPARSE]
[/NOPARSE]
C'est plus lisible ainsi, non ?
En prime je t'ai ajouté une paire de Dim ;)
Code vba:
Private Sub TAjouter_Click()
'Déclarations des variables
Dim ligne As Long, n As Long
ActiveSheet.Unprotect
ligne = Selection.Row
Application.ScreenUpdating = False
For n = 1 To CInt(NombreLigne.Value)
Selection.Offset(1, 0).EntireRow.Insert Shift:=xlShiftDown
Range("A" & ligne & ":I" & ligne).Copy
Rows(ligne + 1).RowHeight = 15
Range("A" & ligne + 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("G" & ligne).Copy Destination:=Range("G" & ligne + 1)
Range("I" & ligne).Copy Destination:=Range("I" & ligne + 1)
ligne = ligne + 1
Next
Range("TotalH.T.").FormulaR1C1 = "=SUM(R21C:R[-1]C)"
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingRows:=True
Unload Me
End Sub



Code:
Private Sub TSupprimer_Click()
ActiveSheet.Unprotect
Selection.EntireRow.Delete
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingRows:=True
Me.Hide
End Sub
 
Dernière édition:

RONIBO

XLDnaute Impliqué
Re : La méthode copy de la classe range a échoué

Bonjour Staple1600

Promis la prochaine fois je ferais plus attention ;)

J'ai modifier mon post :)

Je te remercie pour ma prime :d

J'attends une solution pour mon problème :)

Elle sert à quoi "une paire de Dim " :)
 

Staple1600

XLDnaute Barbatruc
Re : La méthode copy de la classe range a échoué

Re


Normalement il est d'usage dans un code VBA de déclarer ses variables en début de procédure
C'est ce j'ai ajouté dans ton code VBA dans mon message précédent.

Je finis ma soupe froide et puis je vais voir ta PJ puisqu'elle est désormais dans ta discussion. ;)
 

Staple1600

XLDnaute Barbatruc
Re : La méthode copy de la classe range a échoué

Re

RONIBO:
Un fichier exemple c'est un fichier simplifié pas l'appli entière jointe telle quelle sans aucune modif...
car voilà ce qui arrive sinon...
Public Const Fichier As String = "Clients.xlsm"
Et on ne mets pas de WorkBook_Open() active dans un fichier exemple.
Donc c'est à bibi de mettre en commentaires les lignes VBA qui posent problème ou tu t'en charges ? ;)

Tiens pour ma peine, je me ressers un bol de soupe , nah ! ;)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : La méthode copy de la classe range a échoué

Re

RONIBO
Si tu joins le fichier Clients.xlsm, surtout anonimyses-le avant.
Ou mieux tu crées un fichier exemple qui ne sera concerné que par le problème que tu rencontres avec le code VBA de ton premier message. Et vu ce que fait ton code, pas besoin d'userform
Tu mets tes codes dans deux modules standards comme ci-dessous:
Code vba:
Sub TAJouter()
'copie du code VBA de Private Sub TAjouter_Click()
'ici le reste du code
End Sub
Code vba:
Sub TSupprimer
'code VBA de Private Sub TSupprimer_Click()
End Sub



 
Dernière édition:

RONIBO

XLDnaute Impliqué
Re : La méthode copy de la classe range a échoué

Re,

Pour mon problème je pense pas que y'a besoin du fichier client, en cliquant sur ok dans le message box des l'ouverture du fichier on a accès a l'intégralité des codes, données etc

A+
 

Staple1600

XLDnaute Barbatruc
Re : La méthode copy de la classe range a échoué

Re

Oui et que va-t-il se passer quand je fais fermer ton classeur...
Le chemin va se perdre dans les limbes ;)
Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUI = False
Cancel = True
With Worksheets("Akisti Bat")
Select Case Left(.Range("H10"), 1)
Case "B": Chemin = "C:\Akisti Bat\Bon de Commande\"
Case "D": Chemin = "C:\Akisti Bat\Devis\"
Case "F": Chemin = "C:\Akisti Bat\Factures\"
End Select
MyFile = Chemin & .Range("H10") & .Range("I10") & Chr(160) & "-" & Chr(160) & .Range("A12") & Chr(160) & "(" & .Range("G14") & ")" & ".xlsm"
End With
Application.EnableEvents = False
Me.SaveAs MyFile
Application.EnableEvents = True
MsgBox "La facture ou le devis a bien été enregistrée !"
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : La méthode copy de la classe range a échoué

Re

Voici comment j'écrirai une de tes macros.
Est-ce que cette version fait la même chose que ton code initial?
NB: J'ai nommé la cellule qui contient Total H.T. en bas de tableau, fin

PS:
Vu que je n'utilise pas la méthode copy, ca ne risque pas d'échouer ;)
Code vba:
Private Sub TAjouter_Click()
Dim DerLig As Long
ActiveSheet.Unprotect
If Selection.Count = 0 Or Selection.Row <= 23 Then
MsgBox "Veuillez sélectionner une cellule dans la plage adéquate", vbCritical, "ATTENTION"
Else
Application.ScreenUpdating = False
Selection.Offset(1, 0).Resize(NombreLigne).EntireRow.Insert Shift:=xlShiftDown
DerLig = Range("fin").Row - 1
Range("G24:G" & DerLig).FormulaR1C1 = "=IF(RC[-6]*RC[-1]=0,"""",RC[-6]*RC[-1])"
Range("I24:I" & DerLig).FormulaR1C1 = "=IF(RC[-8]*RC[-3]=0,"""",RC[-8]*RC[-3]*RC[-1])"
Range("TotalH.T.").FormulaR1C1 = "=SUM(R21C:R[-1]C)"
End If
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingRows:=True
Unload Me
End Sub
 
Dernière édition:

RONIBO

XLDnaute Impliqué
Re : La méthode copy de la classe range a échoué

Merci pour ton code, j'ai rencontré quelques soucis :

Je perds la mise en forme des lignes que j'insère (la fusion de la colonne désignation avec alignement à gauche, et les traits vertical du tableau)

Puis j'arrive toujours à insérer des lignes dans la cellule "mode de paiement" et autre cellule lorsque je déverrouille la feuille :(
 

RONIBO

XLDnaute Impliqué
Re : La méthode copy de la classe range a échoué

re,

J'ai pris seulement cette partie de ton code
Code:
If Selection.Count = 0 Or Selection.Row <= 23 Then
MsgBox "Veuillez sélectionner une cellule dans la plage adéquate", vbCritical, "ATTENTION"

Et ca résolu mon problème de mise en forme.

S'qui donne :

Code:
Private Sub TAjouter_Click()
'Déclarations des variables
Dim ligne As Long, n As Long
ActiveSheet.Unprotect
If Selection.Count = 0 Or Selection.Row <= 23 Then
MsgBox "Veuillez sélectionner une cellule dans la plage adéquate", vbCritical, "ATTENTION"
Else
ligne = Selection.Row
Application.ScreenUpdating = False
For n = 1 To CInt(NombreLigne.Value)
Selection.Offset(1, 0).EntireRow.Insert Shift:=xlShiftDown
Range("A" & ligne & ":I" & ligne).Copy
Rows(ligne + 1).RowHeight = 15
Range("A" & ligne + 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("G" & ligne).Copy Destination:=Range("G" & ligne + 1)
Range("I" & ligne).Copy Destination:=Range("I" & ligne + 1)
ligne = ligne + 1
Next
Range("TotalH.T.").FormulaR1C1 = "=SUM(R21C:R[-1]C)"
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
AllowFormattingCells:=True, AllowFormattingRows:=True
Unload Me
End If
End Sub

Qu'en pense tu?
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin