Copie de données
Bonjour,
Je travaille depuis quelques jours sur la macro ci-dessous qui me sert à copier les données présentes sur une feuille sur une autre feuille après vérifications de certains paramètres.
Lorsque je lance ma macro, j'ai l'erreur d'exécution '91' (variable d'objet ou variable de bloc With non définie) qui apparait sur la ligne 48 (sur 'Enregistrement des modifications, le deuxième paragraphe, le premier cells.find).
J'espère que vous pourrez me donner un coup de main sur ce code, merci d'avance pour votre aide !
Sub Enregistrer_modif()
' Enregistrer_modif Macro
'Appelée par le bouton "Enregistrer les modifications"
'Recherche Macro
Dim rech As Variant
Dim fiche As Variant
'Nom de la fiche courante
fiche = HD_0
'Vérification de la présence d'une date
If Range("C3") = "" Then
MsgBox ("ENREGISTREMENT IMPOSSIBLE : Veuillez préciser la date, au format aaaa/Tx")
GoTo 1
' Cas d'un format incorrect
If Not Range("C3") Like "####[/]T#" Then
MsgBox ("Veuillez saisir une date au format aaaa/Tx.")
GoTo 1
End If
End If
'Vérification de la présence d'une année
If Range("G3") = 0 Then
MsgBox ("ENREGISTREMENT IMPOSSIBLE : Veuillez préciser l'année")
GoTo 1
End If
'Vérification de la présence d'un trimestre
If Range("E3") = 0 Then
MsgBox ("ENREGISTREMENT IMPOSSIBLE : Veuillez préciser le trimestre")
GoTo 1
End If
'Vérification de l'enregistrement de cette fiche
If Range("L32") = "" Then
MsgBox ("MODIFICATION IMPOSSIBLE : ce contrôle n'a pas encore été enregistré.")
GoTo 1
End If
'Enregistrement des modifications
If MsgBox("Le contrôle du " & Range("C3") & " sera modifié. Confirmez-vous les modifications apportées?", vbYesNo, "Confirmation de modification") = vbYes Then
ActiveSheet.Unprotect
rech = Range("L32")
Range("L6:CD6").Select
Selection.Copy
Sheets("HD_1").Select
Cells.Find(What:="rech", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.EntireRow.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Rows("3:3").Select
Application.CutCopyMode = False
Selection.Copy
Cells.Find(What:="rech", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.EntireRow.Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Sheets(" HD_0").Select
Range("C3").Select
'Protection de la feuille et sauvegarde du classeur
MsgBox ("Le contrôle " & Range("C3") & " a été modifié.")
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
End If
1
End SubBonjour Ma, bonjour e forum,
Je pense qu'un simple Activesheet devant le .Cells.Find devrait résoudre ce problème. Toutefois, tu devrais avoir une erreur avec "rech" (du texte) au lieu de rech (la variable).
La règle d'or en VBA c'est d'éviter autant qu'on le peux les Select ou Activate inutiles. Ils ne font que ralentir le code et sont source de nombreux plantages. J'ai repris ton code et si j'ai bien compris, ça donnerait ça :
Sub Enregistrer_modif_2()
Dim rech As Variant '? String peut-être
Dim OS As Worksheet
Dim OD As Worksheet
Dim R As Range
Dim LI As Integer
Set OS = Worksheets(" HD_0")
Set OD = Worksheets("HD_1")
If OS.Range("C3") = "" Then
MsgBox ("ENREGISTREMENT IMPOSSIBLE : Veuillez préciser la date, au format aaaa/Tx")
GoTo 1
If Not OS.Range("C3") Like "####[/]T#" Then
MsgBox ("Veuillez saisir une date au format aaaa/Tx.")
GoTo 1
End If
End If
If OS.Range("G3") = 0 Then
MsgBox ("ENREGISTREMENT IMPOSSIBLE : Veuillez préciser l'année")
GoTo 1
End If
If OS.Range("E3") = 0 Then
MsgBox ("ENREGISTREMENT IMPOSSIBLE : Veuillez préciser le trimestre")
GoTo 1
End If
If OS.Range("L32") = "" Then
MsgBox ("MODIFICATION IMPOSSIBLE : ce contrôle n'a pas encore été enregistré.")
GoTo 1
End If
If MsgBox("Le contrôle du " & OS.Range("C3") & " sera modifié. Confirmez-vous les modifications apportées?", vbYesNo, "Confirmation de modification") = vbYes Then
OS.Unprotect
rech = OS.Range("L32").Value
Set R = OD.Cells.Find(rech, , xlFormulas, xlPart) 'ATTENTION pas "rech" mais la variable rech ! xlFormulas ou xlValues ?
If Not R Is Nothing Then
LI = R.Row
OS.Range("L6:CD6").Copy
OD.Cells(R.Row, "A").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End If
Set R = Cells.Find(rech, OD.Cells(LI, "A"), xlFormulas, xlPart)'ATTENTION pas "rech" mais la variable rech ! xlFormulas ou xlValues ?
If Not R Is Nothing Then
OS.Rows("3:3").Copy
OD.Cells(R.Row, "A").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End If
MsgBox ("Le contrôle " & Range("C3") & " a été modifié.")
OS.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
ActiveWorkbook.Save
End If
1
End SubBonjour ThauThème, merci beaucoup pour ta réponse !
Effectivement j'avais pas pensé à enlever les select et activate que j'avais.
Merci beaucoup pour le code, il marche exactement comme il fallait et tu m'ôte une belle épine du pied !
Bonne journée