RoverMan
Messages postés9Date d'inscriptionmercredi 4 juillet 2012StatutMembreDernière intervention19 juillet 2012
-
17 juil. 2012 à 15:12
RoverMan
Messages postés9Date d'inscriptionmercredi 4 juillet 2012StatutMembreDernière intervention19 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
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
RoverMan
Messages postés9Date d'inscriptionmercredi 4 juillet 2012StatutMembreDernière intervention19 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.
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.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018209 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
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.
RoverMan
Messages postés9Date d'inscriptionmercredi 4 juillet 2012StatutMembreDernière intervention19 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 :)