Worksheet.change - Génère pb lors de selection multiple

Bonjour,

j'ai une macro, qui me sert à automatiser certaines tâches, en particulier, une qui me permet en fonction de ce qui est écrit dans une cellule de mettre à jour une cellule d'une autre feuille.

J'utilise pour cela l'évenement Worksheet.change().

Cela fonctionne bien lorsque je fais une modification sur une seule cellule à la fois, par contre si je veux supprimer plusieurs cellules en même temps cela me génère une erreur

Run time error 13 - Type mismatch

Voiçi le code problématique :

If Target.Value = vbEmpty Then

Je me doute un peu que je réalise mon test conditionnel sur une cellule, non pas sur une sélection, mais je ne sais pas comment modifier mon code pour qu'il soit compatible avec un test sur une sélection ?

Ou faudrait t'il que je teste une cellule après l'autre dans la plage sélectionnée pour éviter tout pb ?, si oui comment faire ?

Merci d'avance

David

Bonjour, sans voir le reste du code... ceci dit vous pouvez ajouter un test qui sort du code si plusieurs cellule sont "sélectionnées" :

If Target.Count >1 then Exit Sub

à placer en tête du code "Change"

si toutes fois vous vouliez que le Sub se déroule comme même car une des cellules sélectionnées correspond à celle que vous surveillez, alors "si cellule surveillée" fait partie de la sélection => sélectionne la cellule surveillée et déroulement du reste du code, comme cela plus d'erreur par rapport au fait de la sélection multiple qui sera annulée du fait de la sélection de la cellule surveillée... Mais une fois encore sans fichier, sans code "complet"... pas facile

vbMBHB

Bonsoir vbMBHM,

Merci pour ce début de solution, finalement j'ai opté pour une autre solution :

For each C in Target.Cells

Proposé par Patrice dans un autre post et ca fonctionne impeccablement bien.

Meilleurs voeux pour la nouvelle année.

David

Bonsoir, en effet c'est écrit en VBA

si toutes fois vous vouliez que le Sub se déroule comme même car une des cellules sélectionnées correspond à celle que vous surveillez, alors "si cellule surveillée" fait partie de la sélection => sélectionne la cellule surveillée et déroulement du reste du code, comme cela plus d'erreur par rapport au fait de la sélection multiple qui sera annulée du fait de la sélection de la cellule surveillée...

le For Each permet de boucler sur toutes les cellules de la plage, et ainsi on peut trouver celle que l'on veut... C'est une peu ce que je disais...

Bonnes fêtes de fin d'année à vous également !

vbMBHB

Bonsoir, Salut vbMBHB !

Voiçi le code problématique :

If Target.Value = vbEmpty Then

Tu as zappé mes explications sur ton autre sujet !

C'est :

    If IsEmpty(Target) Then

ou :

    If IsEmpty(c) Then

en appliquant la proposition de Patrice.

Et vbEmpty n'est pas une valeur de cellule ou de variable mais une valeur renvoyée par une fonction de test pour indiquer le type de données ! Faut mettre de l'ordre dans les définitions...

Bonsoir MFerrand ! On vous croise souvent ici ?! La retraite peut-être ? C'est un peu comme James007 !

Désolé de mon coté encore du "taf" !

vbMBHB

Salut !

La retraite peut-être ?

Bonjour MFerrand,

Pourtant le code suivant fonctionne parfaitement et je ne suis pas arrivé à le mettre en défaut :

'***************************************
'La boucle for each, permet de passer les cellules de toute la sélection une par une
'ceci est particulièrement important, pour les sélections multiples lorsqu'on souhaite
'supprimer plusieurs cellules en même temps
For Each Cellule In Target.Cells

    '**********************************************
    'Définition de la colonne et ligne qui vient d'être modifiée dans la feuille Assesement test matrix
    'ici je dois déduire 5 à la valeur de la ligne pour considérer le shift des lignes
    col = Cellule.Column
    row = Cellule.row
    row = Round(((row - 5) / 2) - 0.000001)

    If Cellule.Value = vbEmpty Then
        ThisWorkbook.Sheets("Following_test_matrix").Cells(row + 6, col) = "N"
        Else
        '************************************************
        'Définition du décallage par rapport à la cellule de base C6
        'Attention, la cellule A1 correspond à ligne 1 / colonne 1
        'ThisWorkbook.Sheets("Following_test_matrix").cells(ROW, COLUMN)
        'ThisWorkbook.Sheets("Following_test_matrix").Cells(row + 6, col) = "Col " + CStr(Target.Column) + " Ligne " + CStr(Target.row)
        ThisWorkbook.Sheets("Following_test_matrix").Cells(row + 6, col) = "Y"
        'Cells(row, col) = "TEXT"
        End If
    Next

Faut il le modifier pour s'affranchir d'un problème que je n'ai pas encore découvert ?

Merci

Bonjour,

Je ne m'y fierais tout de même pas !

Car si :

    If VarType(cellule) = vbEmpty Then

te fais tester que la valeur renvoyée par la fonction VarType est vbEmpty, signifiant que la cellule est vide,

cela ne sera pas exactement le cas pour :

    If cellule = vbEmpty Then

Les constantes d'énumération sont des valeurs numérique qui prennent leur signification dans un contexte précis, mais hors contexte, leur valeur numérique demeure, et tu testes en fait :

    If cellule = 0 Then

car vbEmpty a la valeur 0 !

Si la cellule est vide ce test renverra VRAI car une cellule vide renvoie 0 en contexte numérique et "" en contexte textuel. Si elle contient le nombre 0, elle n'est pas vide, mais ce test renverra VRAI.

Cordialement.

Ok bien pris, donc pour résumer c'est soit :

If VarType(cellule) = vbEmpty Then

ou éventuellement

If cellule.value = "" Then

qui si j'ai bien compris doit être identique (pour mon cas tout du moins).

Merci

Oui, ou bien :

    If cellule = Empty Then

Mais là on utilise alors plus fréquemment :

    If IsEmpty(cellule) Then

puisqu'une fonction existe !

Cordialement.

Rechercher des sujets similaires à "worksheet change genere lors selection multiple"