IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Méthode range de l'objet worksheet a échoué (voir message n°3)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Chargée de support assurance
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chargée de support assurance

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut Méthode range de l'objet worksheet a échoué (voir message n°3)
    Bonjour à tous,

    J'apprends le VBA en autodidacte avec les vidéos Youtube et vos multiples contributions, alors tout d'abord MERCI !!

    J'ai réalisé un programme qui doit me permettre d'atteindre 2 objectifs lors de la modification d'une cellule dans ma feuille :
    1- Marquer en couleur + lister les mises à jour d'une plage de cellules définie dans une nouvelle feuille => OK ça marche bien
    2- Détecter les doublons dans les colonnes qui se trouvent à droite dans mon tableau (à partir de J8 jusqu'à environ 1000 en bas et loin à droite) => là j'ai 2 problèmes

    1er problème j'ai du mal à définir la plage de travail de ce 2ème contrôle. Au début j'ai voulu faire un 2ème programme mais comme j'active 2 fois "Worksheet_Change" sur la même feuille il n'a pas l'air d'accord, alors j'ai tout réuni dans le même programme. Une partie du problème vient peut-être de là.
    2ème problème je voudrais faire partir mon contrôle à partir de J8 mais il s'applique aux premières colonnes...

    Voici mon code commenté, cf. lignes 48, 56-57 là où je bloque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Private Sub Worksheet_Change(ByVal Target As Range)
     Dim PlageCellules As Range, Nbr As Integer, RgIndex As Integer, y As Integer
     RgIndex = Target.Row 'pour récupérer l'index présent sur cette ligne
     y = ActiveCell.Column ' pour identifier la colonne sur laquelle contrôler les doublons
     
    ' Cacher le travail d'Excel pour ne pas gêner l'utilisateur :
    Application.ScreenUpdating = False
     
    'Supprimer la protection de la feuille MAJ
    Sheets("MAJ").Select
    ActiveSheet.Unprotect "nath"
     
    ' 1 // Sur la partie gauche, suivre les mises à jour en passant les cellules modifiées en surbrillance
    '       et en les listant dans la feuille MAJ
     
    ' La variable PlageCellules contient les cellules dont les modifications seront suivies
    Set PlageCellules = Sheets("Gestion").Range("C8:I800")
     
    If Not Application.Intersect(Target, PlageCellules) Is Nothing Then
    ' Si l'une de ces cellules a été modifiée, alors
        Target.Interior.Color = RGB(255, 255, 0) 'passer la cellule concernée en jaune
     
    'Récupérer le nombre de ligne existant sur la feuille MAJ pour écrire dessous
    Nbr = Sheets("MAJ").Range("G1").Value + 1 'le nombre de lignes est stocké en G1 de la feuille MAJ (écriture non visible)
     
    'Alimenter la première ligne vide trouvée avec les différents éléments dans le tableau de la feuille MAJ :
    Sheets("MAJ").Range("A" & Nbr) = Now '........................................................Date de modification
    Sheets("MAJ").Range("B" & Nbr) = Environ("username") '................................Utilisateur qui a apporté la modification
    Sheets("MAJ").Range("C" & Nbr) = Target.Worksheet.Name '...........................Matrice concernée
    Sheets("MAJ").Range("D" & Nbr) = Target.Address(False, False, , False, "A1") '.Cellule modifiée
    Sheets("MAJ").Range("E" & Nbr) = Sheets("Gestion").Range("I" & RgIndex) '...Index correspondant
    Sheets("MAJ").Range("F" & Nbr) = Target.Value '............................................Nouveau contenu de la cellule
     
    End If
     
    'Rétablir la protection de la feuille MAJ
    Sheets("MAJ").Select
       ActiveSheet.Protect "nath", DrawingObjects:=True, Contents:=True, Scenarios:=True _
            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
            AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
            AllowUsingPivotTables:=True
     
    'Se repositionner sur la feuille d'origine (pour que ce soit transparent pour l'utilisateur)
    Sheets("Gestion").Select
     
    '2 // Signaler et gérer les doublons à la saisie des numéros dans les colonnes de la matrice
     
    'S'il existe un doublon dans la colonne active des lignes 8 à 1000 /JE VOUDRAIS EXCLURE LES 9 PREMIERES COLONNES = NE MARCHE PAS
    If Application.WorksheetFunction.CountIf(Range(Cells(8, 10), Cells(1000, y)), Target) > 1 Then
    'alors signaler le doublon et proposer d'annuler la saisie :
        If MsgBox("Attention... ce numéro a déjà été utilisé." & Chr(10) & "Voulez-vous l'effacer ?", vbYesNo + vbExclamation, "Doublon") = vbYes Then
            If vbYes Then
            Target.Value = ""   ' si OUI annuler la saisie
            Target.Cells.Select ' et se repositionner sur la cellule saisie pour que l'utilisateur entre directement un nouveau numéro
            Else ' Sinon :
            Target.Interior.Color = RGB(248, 187, 208) ' colorer la cellule en rose / NE MARCHE PAS
            Target.Font.Color = vbRed                  ' colorer le texte en rouge / NE MARCHE PAS
            End If
        End If
    End If
     
    'Remontrer le travail d'Excel
    Application.ScreenUpdating = True
     
     
    End Sub
    A noter que la réponse Oui apporte un résultat satisfaisant : ma cellule est vidée et je reviens dessus.
    La réponse Non n'apporte aucun effet (j'ai tenté de mettre une msgbox à la place et elle ne s'affiche pas. La condition ne s'exécute pas du tout)

    Auriez vous une solution pour moi ?

    Un très grand merci d'avance,

    Cdlt,

    Nathalie

  2. #2
    Futur Membre du Club
    Femme Profil pro
    Chargée de support assurance
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chargée de support assurance

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut
    Citation Envoyé par thany33 Voir le message
    Bonjour à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    '2 // Signaler et gérer les doublons à la saisie des numéros dans les colonnes de la matrice
    
    'S'il existe un doublon dans la colonne active des lignes 8 à 1000 /JE VOUDRAIS EXCLURE LES 9 PREMIERES COLONNES = NE MARCHE PAS
    If Application.WorksheetFunction.CountIf(Range(Cells(8, 10), Cells(1000, y)), Target) > 1 Then
    'alors signaler le doublon et proposer d'annuler la saisie :
        If MsgBox("Attention... ce numéro a déjà été utilisé." & Chr(10) & "Voulez-vous l'effacer ?", vbYesNo + vbExclamation, "Doublon") = vbYes Then
           ' If vbYes Then
            Target.Value = ""   ' si OUI annuler la saisie
            Target.Cells.Select ' et se repositionner sur la cellule saisie pour que l'utilisateur entre directement un nouveau numéro
            Else ' Sinon :
            Target.Interior.Color = RGB(248, 187, 208) ' colorer la cellule en rose / Corrigé ;) 
            Target.Font.Color = vbRed                  ' colorer le texte en rouge /  Corrigé ;) 
            'End If
        End If
    End If
    En me relisant pour voir si ma question était claire, la réponse m'est apparue pour mon 1er problème ! J'avais 2 fois "Si oui"... en corrigeant comme ci-dessus, ça va beaucoup mieux

    Mais je reste à l'écoute de vos suggestions pour parvenir à mieux définir ma zone de travail...

    Merci !

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Chargée de support assurance
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chargée de support assurance

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut
    Bonjour, me revoilà

    Je continue de progresser sur mon code et malgré l'absence de réponse j'ai trouvé mes solutions.

    Du coup je peaufine mon programme.

    Comme je fais des contrôles sur une plage de données dans un tableau et que les utilisateurs sont susceptibles d'insérer des colonnes ou des lignes, tout risque de se décaler.
    J'introduis donc des variables pour que mes contrôles de fassent en fonction de l'emplacement d'une cellule qui contient le mot "Index".

    Presque tout fonctionne, saut ma ligne 41 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     Dim PlageCellules, Rng As Range
     Dim Nbr, RgIndex, x, y, RngRow, RngCol As Integer
     Dim FeuilleCible As Worksheet
     Dim ColIndex As Range
     
     x = Target.Row 'pour récupérer l'index présent sur cette ligne
     y = Target.Column ' pour identifier la colonne sur laquelle contrôler les doublons
     Set FeuilleCible = ThisWorkbook.Worksheets("Gestion") ' pour définir le nom de la feuille de travail en 1 seule fois (faciliter la copie du code dans d'autres feuilles)
     Set Rng = FeuilleCible.Range("A:FA").Find(What:="Index")
     RngCol = Rng.Column
     RngRow = Rng.Row
     
    ' Cacher le travail d'Excel pour ne pas gêner l'utilisateur :
    Application.ScreenUpdating = False
     
    'Supprimer la protection de la feuille MAJ
    Sheets("MAJ").Select
    ActiveSheet.Unprotect "nath"
     
    ' 1 // Sur la partie gauche, suivre les mises à jour en passant les cellules modifiées en surbrillance
    '      et en les listant dans la feuille MAJ
     
    ' La variable PlageCellules contient les cellules dont les modifications seront suivies (La cellule qui contient "Index" sert de référence)
    Set PlageCellules = FeuilleCible.Range(Cells(RngRow + 1, 1), Cells(RngRow + 10, RngCol))
     
    If Not Application.Intersect(Target, PlageCellules) Is Nothing Then
    ' Si l'une de ces cellules a été modifiée, alors
        Target.Interior.Color = RGB(255, 255, 0) 'passer la cellule concernée en jaune
     
    'Récupérer le nombre de ligne existant sur la feuille MAJ pour écrire dessous
    Nbr = Sheets("MAJ").Range("G1").Value + 1 'le nombre de lignes est stocké en G1 de la feuille MAJ (écriture non visible)
     
    'Alimenter la première ligne vide trouvée avec les différents éléments dans le tableau de la feuille MAJ :
    Sheets("MAJ").Range("A" & Nbr) = Now '.........................................Date de modification
    Sheets("MAJ").Range("B" & Nbr) = Environ("username") '.........................Utilisateur qui a apporté la modification
    Sheets("MAJ").Range("C" & Nbr) = Target.Worksheet.Name '.......................Matrice concernée
    Sheets("MAJ").Range("D" & Nbr) = Target.Address(False, False, , False, "A1") '.Cellule modifiée
    'Sheets("MAJ").Range("E" & Nbr) = FeuilleCible.Range("I" & x) '.......Index correspondant / cette commande fonctionne mais je veux identifier la colonne "I" via la variable RngCol
    Sheets("MAJ").Range("E" & Nbr) = FeuilleCible.Range(Cells(x, RngCol)).Value '.......Index correspondant / Cette commande ne fonctionne pas : "méthode range de l'objet worksheet a échoué"
    Sheets("MAJ").Range("F" & Nbr) = Target.Value '................................Nouveau contenu de la cellule
     
    End If
     
    'Rétablir la protection de la feuille MAJ
    Sheets("MAJ").Select
       ActiveSheet.Protect "nath", DrawingObjects:=True, Contents:=True, Scenarios:=True _
            , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
            AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
            AllowUsingPivotTables:=True
     
    'Se repositionner sur la feuille d'origine (pour que ce soit transparent pour l'utilisateur)
    FeuilleCible.Select
     
    '2 // Signaler et gérer les doublons à la saisie des numéros dans les colonnes de la matrice
     
    'S'il existe un doublon dans la colonne active des lignes 8 à 1000 / ne se cantonne pas à la colonne active mais à toute la plage = KO
    If y > RngCol And x > RngRow Then
        If Application.WorksheetFunction.CountIf(Range(Cells(RngRow + 1, y), Cells(1000, y)), Target) > 1 Then
        'alors signaler le doublon et proposer d'annuler la saisie :
            If MsgBox("Attention... ce numéro a déjà été utilisé." & Chr(10) & "Voulez-vous l'effacer ?", vbYesNo + vbExclamation, "Doublon") = vbYes Then
              Target.Value = ""   ' si OUI annuler la saisie
            Target.Cells.Select ' et se repositionner sur la cellule saisie pour que l'utilisateur entre directement un nouveau numéro
            Else ' Sinon :
            Target.Interior.Color = RGB(248, 187, 208) ' colorer la cellule en rose
            Target.Font.Color = vbRed                  ' colorer le texte en rouge
            Target.Cells.Select
            End If
        End If
    End If
     
     
    'Remontrer le travail d'Excel
    Application.ScreenUpdating = True
     
     
    End Sub
    Si quelqu'un à une idée ? Si je remplace par la ligne 40 le programme tourne parfaitement.
    Mais comme j'ai besoin d'appliquer ce code à de nombreux tableaux (avec la même structure autour de cette fameuse cellule contenant le mot "Index") et que les utilisateurs mettent un nombre variable de colonnes et de lignes avant cette cellule...
    Je voudrais que mon code fonctionne toujours quelque soit la feuille sur laquelle je l'applique.

    Merci de votre aide.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comme je fais des contrôles sur une plage de données dans un tableau et que les utilisateurs sont susceptibles d'insérer des colonnes ou des lignes, tout risque de se décaler.
    J'introduis donc des variables pour que mes contrôles de fassent en fonction de l'emplacement d'une cellule qui contient le mot "Index".
    Il est possible de connaître la position d'une colonne en utilisant une recherche sur la ligne des titres soit à l'aide de la méthode Find soit en utilisant WorksheetFunction.Match qui est l'équivalent de la fonction EQUIV d'excel (MATCH pour les versions anglaise).
    Cependant, si vous utilisez les tableaux structurés (ListObject en VBA) ce serait nettement plus simple à gérer en utilisant directement le nom de la colonne.

    Je vous invite donc à lire ces tutoriels si vous ne connaissez les tableaux structurés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Chargée de support assurance
    Inscrit en
    Février 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chargée de support assurance

    Informations forums :
    Inscription : Février 2022
    Messages : 4
    Par défaut
    Bonjour, je vous remercie pour votre réponse mais même en ayant parcouru les liens transmis, j'ai beaucoup de mal à imaginer comment cela pourrait s'adapter à mon besoin.

    Voici à quoi ressemble un aperçu de tableau (que nous appelons "matrices" car il servent à construire des cas de test) :
    Nom : 2022-02-16 12_28_17-test2 - Excel.png
Affichages : 124
Taille : 65,8 Ko
    Les colonnes à droite d'index doivent contenir des numéros distincts pour appeler les différentes lignes dans leur ordre croissant (mais l'ordre est défini par le numéro utilisé et non la disposition initiale des lignes)
    Les colonnes de gauche permettent à l'utilisateur de structurer sa réflexion
    J'ajoute la colonne index et derrière chaque index unique j'ai construit une base de donnée dans un autre tableau
    Tout cela est ensuite "mouliné" par une autre macro pour reconstituer les scénarios de test.

    Mon but ici est donc de sécuriser la construction de ces matrices :
    1- en traçant les modifications structurelles réalisées
    2- en détectant dès la création les anomalies (doublons dans les numéros qui feront ensuite échouer la reconstitution du scénario)

    En fait, j'ai l'impression que je suis presqu'au but et que mon dernier problème doit être tout bête, mais à force d'avoir le nez dessus je ne trouve pas la solution...

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    même en ayant parcouru les liens transmis, j'ai beaucoup de mal à imaginer comment cela pourrait s'adapter à mon besoin.
    Vous pratiquez la lecture rapide pour avoir pu parcourir trois tutoriels en 30 minutes

    L'utilisation des tableaux structurés, aussi bien sans qu'avec le VBA, est tellement simple à utiliser que je ne comprends pas que l'on puisse continuer à utiliser des plages de cellules classiques mais bon chacun fait sa vie comme il se couche.

    Si vous voulez chercher l'index d'une colonne, je vous renvoie à ma réponse précédente
    Il est possible de connaître la position d'une colonne en utilisant une recherche sur la ligne des titres soit à l'aide de la méthode Find soit en utilisant WorksheetFunction.Match qui est l'équivalent de la fonction EQUIV d'excel (MATCH pour les versions anglaise).
    Exemple simple pour trouver l'index de la colonne d'une valeur cherchée dans la ligne des titres à l'aide de Application.WorksheetFunction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub t()
      Const LookupValue As String = "Tva"
      Dim fx As WorksheetFunction
      Dim rngHeader As Range
      Dim Index As Integer
      Set fx = Application.WorksheetFunction
      Set rngHeader = ThisWorkbook.Worksheets("Feuil1").Range("D1:K1")
      Index = fx.Match(LookupValue, Range("D1:K1"), 0)
      MsgBox LookupValue & " se trouve à la colonne " & Index & " de la plage " & rngHeader.Address(external:=True)
      Set fx = Nothing:  Set rngHeader = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [XL-2016] La méthode range de l'objet worksheet a échoué
    Par Mr l'Ashanti dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/09/2019, 17h18
  2. [XL-2007] VBA: erreur "la méthode range de l'objet worksheet a échoué"
    Par kimou75 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/04/2016, 17h12
  3. [XL-2007] Méthode range de l'objet worksheet a échoué
    Par magikmed dans le forum Excel
    Réponses: 5
    Dernier message: 22/07/2015, 16h13
  4. La méthode 'range' de l'objet worksheet à échoué
    Par BERRACHED SAID dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/05/2013, 09h48
  5. [XL-2007] erreur: "la méthode .Range de l'objet worksheet a échoué"
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 28/10/2010, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo