Incompatibilité de type [Résolu]

RoverMan 9 Messages postés mercredi 4 juillet 2012Date d'inscription 19 juillet 2012 Dernière intervention - 17 juil. 2012 à 15:12 - Dernière réponse : RoverMan 9 Messages postés mercredi 4 juillet 2012Date d'inscription 19 juillet 2012 Dernière intervention
- 19 juil. 2012 à 21:03
Bonjour tout le monde,

Je m'arrache les cheveux depuis plusieurs jours à essayer de comprendre pourquoi mon code ne fonctionne pas.

Dans ce que je veux faire j'ai une partie "manuelle" et une "automatique". En manuel tout se passe très bien, rien à redire. Par contre, en automatique j'ai le même code hormis le "BeforeDoubleClick" au départ, sinon aucunes différences.

Le problème c'est qu'en automatique ca ne fonctionne pas. Incompatibilité de type à la ligne ----code-----. Je soupçonne la fonction Match mais sans preuves.

Est ce que quelqu'un peut m'expliquer pourquoi c'est ainsi ?




Sub SelectionTouT()

Dim Cel As Range 'colonne F dans "Entrée"

Sheets("Entrée").Select
    For Each Cel In Range("F2:F32") 'traite les cellules colonne F
    If Application.CountA([A1:E1].Offset(Cel.Row - 1)) < 5 Then _
    Cel.Value = "" 'si ligne incomplète aucun transfert
        If Cel <> "" Then 'si x existe
        Cel = ""
        Cel.Offset(0, 1).Value = "" 'effacement repère colonne G
        Range(Cel.Offset(0, -5), Cel.Offset(0, 1)).Interior.ColorIndex = 0 'effacement couleur ligne
--------Sheets("Rapport actuel").Rows(Application.Match(0, _-------------
        Sheets("Rapport actuel").Range("M:M"), 0)).Delete 'suppression de la ligne en feuille "Rapport actuel" si repère = 0
        Else
        Cel.Value = "X"
    End If

    If (Cel.Offset(0, 1) <> 1) Then
            Cel.Offset(0, 1).Value = 1 'repère colonne G
            Range(Cel.Offset(0, -5), Cel.Offset(0, 1)).Interior.ColorIndex = 15 'mise en couleur
                With Sheets("Rapport actuel").Range("A65536").End(xlUp) 'dernière cellule colonne A
                .Offset(1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C1" 'transfert Opération
                .Offset(1, 1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C2" 'transfert Temps"
                .Offset(1, 2).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C3" 'transfert Taux
                .Offset(1, 3).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C4" 'transfert Coût"
                .Offset(1, 4).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C5" 'transfert Sous-Traitance et Achat
                .Offset(1, 12).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C7" 'transfert Repère colonne M
                'Sheets("Rapport").Range("A2:E65536").Sort Key1:=Sheets("Rapport").Range("A1"), Order1:=xlDescending 'tri décroissant
                End With
    End If
    Next
Call Couleur_Fixe

Call SUPPR_DOUBLONS 'Module 1

End Sub


Merci beaucoup, bonne journée.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 juil. 2012 à 19:14
3
Merci
Bonjour, banana32,
Je suis dans le ciment jusqu'au coup...
Voilà de quoi te permettre d'aider :
1)
Sheets("Rapport actuel").Rows(Application.Match(0, _
        Sheets("Rapport actuel").Range("M:M"), 0)).Delete

Appelle 2 observations :
a) le type 0 (3èeme paramètre) utilisé ici est abusif, puisque aucun caractère générique n'est utilisé ! à passer à -1
b) L'erreur de type intervient lorsque aucun 0 trouvé (le 1er argument). Elle est à gérer
2) pour la suppression des lignes : Impossible, tel qu'il s'y prend, de supprimer de bas en haut.
Solution : utiliser Application.Union pour "constituer" la plage des lignes à supprimer), puis appliquer EntireRow.delete à cette plage (si non nothing)

3) VBA et( assez permissif et "laisse passer" Application.Match. Match est toutefois un membre de WorkSheetFunction et non de Application. Je suggère ce corriger cela car VBA pourrait être moins "tolérant" dans de futures versions (et bug à éviter).

Je retourne à mon ciment.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de ucfoutu
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 18 juil. 2012 à 09:59
0
Merci
Salut,

dans ton code on ne voit pas le rapport avec "BeforeDoubleClick"

si avant la ligne qui pose probleme tu ajoutes ceci :

msgbox Application.Match(0, Sheets("Rapport actuel").Range("M:M"), 0))


tu devrais voir la valeur qui pose probleme

A+
Commenter la réponse de bigfish_le vrai
RoverMan 9 Messages postés mercredi 4 juillet 2012Date d'inscription 19 juillet 2012 Dernière intervention - 18 juil. 2012 à 11:25
0
Merci
Salut bigfish,

Mon code avec le "BeforeDoubleClick" fonctionne, avec le double click je fais une ligne à la fois. A partir de ce code je suis en train de faire l'automatique, j'appuie sur un bouton et le code traite toutes les lignes une à une. Le code est donc quasiment identique théoriquement.

J'ai inséré ta ligne et ca me donne la valeur 2 dès l'effacement de la première ligne, à chaque fois ca passe à la suivante avec la valeur 2.

Mon problème semblerai s'être réglé sans comprendre pourquoi, de temps à autre je peux avoir une erreur d'incompatibilité de type. Sans doute un manque de stabilité du programme, pas assez structuré et strict, je n'ai sans doute pas paré à toutes les éventualités.


Merci beaucoup pour ton aide

A bientôt
Commenter la réponse de RoverMan
RoverMan 9 Messages postés mercredi 4 juillet 2012Date d'inscription 19 juillet 2012 Dernière intervention - 18 juil. 2012 à 11:33
0
Merci
Re,

Je retire ce que je viens de dire, l'erreur d'incompatibilité de type a ressurgit alors qu'il n'y a eu aucune modification.

Quand il y a une logique je suis à peu près capable de m'en sortir mais là je ne saisi pas la logique. Je ne sais plus quoi faire.

As tu déjà été confronté à cette situation bigfish ?

A plus.
Commenter la réponse de RoverMan
Utilisateur anonyme - 18 juil. 2012 à 18:49
0
Merci
Bonsoir,

Une petite chose me dérange quand je lis ton code.
Je ne suis pas un spécialiste de VBA mais en .NET, le fait de supprimer un élément lors d'une boucle For Each génère une erreur. Ce qui est ton cas apparemment. Je peux me tromper mais essaie de remplacer For Each par une boucle For Next en décrémentant l'index lors de la suppression de la ligne.
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 juil. 2012 à 23:59
0
Merci
Ce qui est de toute manière totalement incompréhensible, c'est que le code de match/delete se trouve dans une boucle et dans une expression conditionnelle
Sheets("Rapport actuel").Rows(Application.Match(0, _
Sheets("Rapport actuel").Range("M:M"), 0)).Delete
aura pour effet, quel que soit le niveau de la boucle et dès que cel <> "", de supprimer la ligne entière de la [u]toute première occurence d'un 0 en colonne M
/u

___________________________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Utilisateur anonyme - 19 juil. 2012 à 18:31
0
Merci
aura pour effet, quel que soit le niveau de la boucle et dès que cel <> "", de supprimer la ligne entière de la toute première occurence d'un 0 en colonne M

Ce qui provoque l'erreur pendant la boucle d'énumération.

Je suis dans le ciment jusqu'au coup...
Tu me rassures, ce n'est que du ciment ...
Commenter la réponse de Utilisateur anonyme
RoverMan 9 Messages postés mercredi 4 juillet 2012Date d'inscription 19 juillet 2012 Dernière intervention - 19 juil. 2012 à 21:03
0
Merci
Bonsoir vous deux,

Merci pour vos conseils et remarques, j'ai réussi à faire ce que je voulais faire grâce, notamment au passage à -1 de mon argument et au changement de bibliothèque dans le match. J'en ai profité pour réorganiser mon code qui est maintenant plus simple.

Banana, visiblement la suppression d'un élément dans une boucle For Each n'a pas d'incidence néfaste sur le fonctionnement. Peut être que c'est le cas mais pas dans mon rayon d'action, donc ca me convient. Si tu veux je t'envoie mon fichier pour que tu vois par toi même, puisque peut être qu'on ne s'est pas très bien compris ;)

Ucfoutu j’espère que tu as finis ton ciment, par ce temps c'est soit la galère, soit la galère :)

En vous souhaitant une bonne continuation.

Merci et à bientôt !!
Commenter la réponse de RoverMan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.