Incompatibilité de type

Résolu
RoverMan Messages postés 9 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 19 juillet 2012 - 17 juil. 2012 à 15:12
RoverMan Messages postés 9 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 19 juillet 2012 - 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.

8 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juil. 2012 à 19:14
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
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
18 juil. 2012 à 09:59
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+
0
RoverMan Messages postés 9 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 19 juillet 2012
18 juil. 2012 à 11:25
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
0
RoverMan Messages postés 9 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 19 juillet 2012
18 juil. 2012 à 11:33
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
18 juil. 2012 à 18:49
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juil. 2012 à 23:59
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
0
Utilisateur anonyme
19 juil. 2012 à 18:31
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 ...
0
RoverMan Messages postés 9 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 19 juillet 2012
19 juil. 2012 à 21:03
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 !!
0
Rejoignez-nous