Déterminer la valeur d'une cellule précise du rang Target

Bonjour à tous,

J'aimerais savoir comment bien déterminer la valeur d'une cellule de la plage Target lorsque ce dernier contient plus d’une cellule suite à une insertion de valeurs depuis un USF ?

Merci d'avance.

Bonjour,

Si tu veux la 1ère en haut à droite :

target.range("A1").value

eric

Bonsoir eriiic,

parce que j'ai essayé avec :

Target.Cells(1,6).Value

pour déterminer la cellule en colonne F avec la première ligne de la plage Target, mais ça n'a pas marché

Non, ce n'est pas forcément la colonne F.

C'est la 6ème colonne de target que tu lis, c'est relatif à la position de target. Si target est C4:K17 tu lis H4

Si tu veux connaitre la position de sa 1ère colonne c'est target.column, et sa largeur est target.columns.count

eric

Bon, peut-être avec l'exemple joint, le problème pourra mieux s'éclairer :

Un peu d'explications où il faut tout deviner ?

eric

L'insertion des valeurs depuis l'USF dans la feuille "BDD".

Les valeurs sont insérées une par une.

Mais voila, un moment donné, une erreur est affichée :

Erreur d'exécution '13':

Incompatibilité de type

Sur cette ligne :

        Case 1

            If Application.CountIf([Sites], Target.Value) = 0 Then

Je ne comprend pas trop ce que tu veux faire...

Pourquoi utilises-tu l'événement Change sur une ligne que tu viens juste d'écrire avec ton userform ?

Il faudrait faire tes contrôles en amont dans le userform pour éliminer les saisies invalides et inscrire après en bloquant les événements.

Sinon dans ce cas target.address="$A$9:$F$9"

Si tu veux la 6ème colonne c'est target.[F1] comme je te l'avais écris, ou Target.Cells(1,6) comme tu l'avais mis.

Seulement tu planteras quand tu modifieras une seule cellule puisque target ne fera plus qu'une seule colonne... A moins d'ajouter encore des tests et des traitements différents.

Contrôle en amont pour éviter l'usine à gaz indémerdable.

eric

Bonjour,

eriiic a écrit :

Pourquoi utilises-tu l'événement Change sur une ligne que tu viens juste d'écrire avec ton userform ?

Pour mettre à jour les tableaux dans la feuille "Données".

Bonjour,

Ca je m'en doutais... C'est tout ce que tu as à dire ?

Ok, ben je t'ai dit ensuite comment il fallait faire. Vas-y...

Ta question de départ est résolue, tu peux le cocher dans la 1ère réponse.

eric

J'ai fait cela en début du code validation des entrées :

Private Sub CmdValider_Click()
    Dim Ligne As Long
    Application.EnableEvents = False

.....

    '-
    Application.EnableEvents = True
End Sub

Il n'y a pas déclenchement d'erreur, mais la mise à jour des tableaux dans la feuille "Données" par les nouvelles entrées inexistantes, n'est pas réalisée !!

Ben enlève-le alors, personne n'a dit de mettre ça.

Et reste sur la question de départ...

Sa réponse est dans la réponse 1, et avec plus d'explication ici : https://forum.excel-pratique.com/post338867.html#p338867 , 2ème partie

D'accord ?

eric

Bonjour,

J'ai remplacé cette ligne :

If Application.CountIf([Sites], Target.Value) = 0 Then

Par celle-là :

If Application.CountIf([Sites], Target.[a1]) = 0 Then

Mais j'ai l'erreur sur la nouvelle ligne :

Erreur d'exécution '438':

Propriété ou méthode non gérer par cet objet

Bonjour,

Et si tu mets exactement ce que j'avais mis ?

eric

Bonjour,

J'ai corriger une seule ligne (Rem -- 1)) et ça fonctionne.

Mais ce qui je ne comprend pas si en laissant la même valeur (Target.Value) ou est marqué (Rem-- 2)) et ça ne déclenche pas d'erreur ????

        Select Case Target.Column
        Case 1

            Rem -- 1) ICI il faut corriger pour : Target.Range("A1").Value

            'If Application.CountIf([Sites], Target.Value) = 0 Then
            If Application.CountIf([Sites], Target.Range("A1").Value) = 0 Then
                Set lr = wsd.Range("tblSite").ListObject.ListRows.Add
                lr.Range.Cells(1, 1) = Target.Value
            End If
        Case 2
            '
        Case 6

            If Not Target.Offset(0, -4) = vbNullString Then
                Select Case UCase(Target.Offset(0, -4).Value)
                Case "COMM"
                    Rem -- 2) ICI ca fonctionne même si on laise Target.Value au lieu de corriger vers Target.Range("F1").Value ????
                    If Application.CountIf([Comm], Target.Value) = 0 Then
                        Set lr = wsd.Range("tblComm").ListObject.ListRows.Add
                        lr.Range.Cells(1, 1) = Target.Value
                    End If
                Case "ENV"
                     Rem -- 2) ICI ca fonctionne même si on laise Target.Value au lieu de corriger vers Target.Range("F1").Value ????
                    If Application.CountIf([Env], Target.Value) = 0 Then
                        Set lr = wsd.Range("tblEnv").ListObject.ListRows.Add
                        lr.Range.Cells(1, 1) = Target.Value
                    End If
                Case "TRS"
                     Rem -- 2) ICI ca fonctionne même si on laise Target.Value au lieu de corriger vers Target.Range("F1").Value ????
                    If Application.CountIf([Trs], Target.Value) = 0 Then
                        Set lr = wsd.Range("tblTrs").ListObject.ListRows.Add
                        lr.Range.Cells(1, 1) = Target.Value
                    End If
                End Select
            End If
        End Select

Je t'ai déjà dis que F1 ne ramenait pas la cellule que tu voulais et que nb.si() ne voulait pas de plage de plusieurs colonnes.

Rien à dire de plus.

eric

Bonsoir,

eriiic a écrit :

Je t'ai déjà dis que F1 ne ramenait pas la cellule que tu voulais et que nb.si() ne voulait pas de plage de plusieurs colonnes

EDIT : (Rectification) !

Mais pourquoi la fonction NB.SI() ne marche pas pour le cas de la colonne A (Case 1) et fonctionne pour le cas de la colonne F (Case 6) ?

Bon reprenons

Tu as une plage A1:F1 .

Tu veux quoi au juste ?

Au début c'était : la valeur d'une cellule de la plage Target lorsque ce dernier contient plus d’une cellule

J'avais compris la 6ième valeur.

Si c'est il faut que tu indiques la référence relativement à ta plage, Target.[F1].value

Que ta plage soit A1:F1 ou K:ZZ ça sera toujours Target.[F1].value pour la 6ème valeur de la plage

Si ce n'est pas ça explique-toi mieux.

eric

Bonjour eric,

Mon souci est sur les deux syntaxes suivantes :

1) Target.Value

et

2) Target.Range('A1").Value

Quand on est sur la colonne A (Case 1) et pour mettre à jour le tableau [Sites], le test :

If Application.CountIf([Sites], Target.Value) = 0 Then

déclenche une erreur !

Pour fonctionner il faut remplacer :

Target.Value par Target.Range('A1").Value :

If Application.CountIf([Sites], Target.Range("A1").Value) = 0 Then

Mais par contre, quand on est sur la colonne F (Case 6) et pour mettre à jour les tableaux [Comm], [Env] et [Trs], le même test pour ce cas :

If Application.CountIf([Comm], Target.Value) = 0 Then

Ne déclenche pas d'erreur !!!

Pourtant si le même test a ce qu'on voit !!


Bonjour eric,

Mon souci est sur les deux syntaxes suivantes :

1) Target.Value

et

2) Target.Range('A1").Value

Quand on est sur la colonne A (Case 1) et pour mettre à jour le tableau [Sites], le test :

If Application.CountIf([Sites], Target.Value) = 0 Then

déclenche une erreur !

Pour fonctionner il faut remplacer :

Target.Value par Target.Range('A1").Value :

If Application.CountIf([Sites], Target.Range("A1").Value) = 0 Then

Mais par contre, quand on est sur la colonne F (Case 6) et pour mettre à jour les tableaux [Comm], [Env] et [Trs], le même test pour ce cas :

If Application.CountIf([Comm], Target.Value) = 0 Then

Ne déclenche pas d'erreur !!!

Pourtant si le même test a ce qu'on voit !!

Que fais-tu pour déclencher l'erreur ?

Et si tu pouvais détailler pas à pas ce que ton programme est sensé faire.

eric

Rechercher des sujets similaires à "determiner valeur precise rang target"