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 Sub

Bonjour 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 Sub

Bonjour 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

Rechercher des sujets similaires à "copie donnees"