Erreur d'exécution '13': Incompatibilité de Type [Résolu/Fermé]

Signaler
Messages postés
28
Date d'inscription
vendredi 21 décembre 2012
Statut
Membre
Dernière intervention
7 mai 2015
-
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
-
Bonjour,

J'ai crée une macro VBA qui permet d'attribuer une valeur (texte) dans la colonne D si il trouve une valeur prédéfini dans la colonne B.

Par exemple si dans cellule B6 j'ai "Voiture" alors dans cellule D6 j'aurai automatiquement "Loué".

Ma macro fonctionne très bien pour chaque valeur saisi, Maintenant si j'ai la même valeur à appliquer sur une plage de 10 ligne, en étendant la 1er valeur sur les 9 autres j'obtiens un débogage avec l'erreur Incompatibilité de Type.

Pouvez vous m'aider SVP.

Voici un morceau de code :

Private Sub Worksheet_Change(ByVal Target As Range)

ligne = Target.Row
col = Target.Column

If Target.Column = 2 Then

If Target = "voiture" Then
Cells(ligne, 4).Value = "loué"
End If


<config>Windows XP / Internet Explorer 7.0</config

3 réponses


Bonjour

Il y a bien un problème avec ton code
Quand tu sélectionnes une zone de plusieurs cellules, ton objet Target contient plusieurs cellules et ta comparaison If Target = "voiture" se heurte bien à un problème de type.
Il faut boucler sur toutes les cellules de Target pour ne comparer qu'une seule cellule à la fois.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ligne As Integer, col As Integer
    '
    '
    For ligne = Target.Row To Target.Row + Target.Rows.Count - 1
      For col = Target.Column To Target.Column + Target.Columns.Count - 1
        If col = 2 Then
            If Cells(ligne, col) = "voiture" Then
                Cells(ligne, 4).Value = "loué"
            End If
        End If
      Next col
    Next ligne
End Sub
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 62320 internautes nous ont dit merci ce mois-ci

Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Bonjour le père,

Meilleurs voeux !

Je n'avais pas capté "sur une plage de 10 ligne" car j'ai lu en diagonale (trop pressé ce matin)

Merci pour les explications .. ça me servira de leçon !
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Bonjour,

Cela fonctionne très bien chez moi .. je ne voit pas de problème .. vérifiez:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ligne As Integer, col As Integer
    '
    ligne = Target.Row
    col = Target.Column
    '
    If Target.Column = 2 Then
        If Target = "voiture" Then
            Cells(ligne, 4).Value = "loué"
        End If
    End If
End Sub


Conseils:
- Toujours écrire "Option Explicit" en début de page, de cette façon, obliger de déclarer les variables .. avantage: plus aucune variable passe inaperçu !
- vérifier les "End ..": End If, End Sub, etc
- Indenter le code pour y voir plus clair
...
Messages postés
28
Date d'inscription
vendredi 21 décembre 2012
Statut
Membre
Dernière intervention
7 mai 2015

Bonjour,

Tout d'abord Merci à vous deux pour votre aide.

"Heliotte" En fait mon code fonctionne très bien seulement si sur 10 ligne j'ai "Voiture" au lieu de faire 10 copier coller je veux étendre la cellule de la 1er ligne selectionné sur les 9 autres. Et la j'obtenais l'erreur 13.

"le père." Je te remercie cela fonctionne très bien !! :D

Seulement je n'ai pas très bien compris les deux lignes que tu as ajouté (Je suis débutant en VBA donc désolé pour les question nul ^^) :

For ligne = Target.Row To Target.Row + Target.Rows.Count - 1
For col = Target.Column To Target.Column + Target.Columns.Count - 1
Utilisateur anonyme
Je suppose que tu connais quand même la boucle For ;)
Il faut garder en tête que Target est un objet Range et qu'un objet range peut contenir plusieurs cellules, donc plusieurs lignes et plusieurs colonnes. En fait c'est même plus compliqué car la zone sélectionnée peut être constituée de "morceaux" séparés sans rapport entre eux, mais restons-en aux rectangles.
Target.rows te donne l'ensemble des lignes, Target.rows.count te donne donc le nombre de lignes.
La première ligne de la zone étant donc Target.Row, la dernière est Target.Row + Target.Rows.Count-1
La boucle For va te faire balayer toutes ces lignes
Et pour chaque ligne, on balaye toutes les colonnes avec le même raisonnement
On a donc essayé toutes les cases d'une zone rectangulaire

Au passage, j'ai aussi ajouté deux lignes pour la fin des boucles : les Next
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Bonjour SLM-BHY,

Désolé de vous avoir fait perdre du temps ..
Comme j'ai lu en diagonale ce matin (trop de choses à faire) je n'ai pas capté ce bout de phrase "sur une plage de 10 ligne".

Mille fois désolé !

Meilleurs voeux !
Messages postés
28
Date d'inscription
vendredi 21 décembre 2012
Statut
Membre
Dernière intervention
7 mai 2015

"le père." Très bien merci pour ces explications !! Oui je les ai bien vue.

"Heliotte" il n'y as pas de soucis. Merci et bonne année 2013 à vous deux également.

Bonne journée :).
Messages postés
1492
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
83
Bonne année et tous mes voeux !