VBA avec fonction SI, Message #NOM? dans Excel et Erreur13 de VBA : incompréhensible
Bonjour à tous,
Je débute avec l’utilisation de VBA et j’ai fait quelques lignes de programme pour faire une macro avec Excel (version 2007). J’ai commencé en faisant des enregistrements de macro et en puisant à droite et à gauche. Mon programme écrit une formule SI dans des cellules et malheureusement Excel me renvoie le message d’erreur «# NOM? » et VBA le message « Erreur d’exécution 13 », » Incompatibilité de type » et je ne comprends pas pourquoi.
Mon besoin : supprimer de mon tableau les lignes inutiles. Celles-ci sont identifiées grâce à une ou deux dates, donc deux cellules différentes de la même ligne. Les dates antérieures à aujourd’hui doivent générer l’écriture d’un « x », puis à chaque fois qu’une cellule contient un « x » la ligne correspondante est supprimée.
Pour les identifier j’utilise donc la formule ci-dessous dans la colonne « D » :
=SI(C2<>"";"x";SI(B2<AUJOURDHUI();"x";""))
Cette formule dans ma macro est : "=IF(RC[-1]<>"""",""x"",SI(RC[-2]<TODAY(),""x"",""""))"
Je l’ai reprise de la macro que j’avais enregistrée.
L’imbrication respecte scrupuleusement le modèle proposé dans l’aide d’Excel.
En saisissant la formule ou en faisant un copier/coller de la formule écrite par la macro dans une autre cellule cela fonctionne parfaitement (ayant besoin de références relatives j’utilise l’apostrophe que j’ajoute en début d’écriture devant le signe = avant de faire le copier/coller pour garder les numéros des cellules. Une fois la formule collée je supprime l’apostrophe et récupère ainsi la formule issue de la macro).
Par contre, lorsque je fais glisser la cellule afin de copier la formule issue de la macro sur plusieurs lignes, l’erreur se répète pour chaque cellule vide de la colonne "C" (c'est-à-dire dans deux cas de figure sur trois possibles).
Pourtant je ne change rien par ailleurs et le format des cellules contenant la formule est « Standard ».
N’ayant trouvé aucune information traitant de ce problème je suis dans une impasse. Aussi, je serai vraiment heureux de trouver des personnes pour m’aider, et je remercie d’avance toutes celles qui auront l’amabilité de me donner un coup de main.
Ci-joint mon fichier, il contient :
- une feuille « Copies » avec les copies d’écrans au cas où cela aiderait
- une feuille « Démarche » où je présente le résultat final attendu et les résultats obtenus en mettant un point d’arrêt à la ligne n°15 « If ActiveCell.Offset(0, 3).Value = "x" Then »
- une feuille « Tri » qui est celle que j’ouvre pour lancer la macro et qui contient le résultat de la macro
- une feuille « Données » qui contient les données
Je voulais joindre un fichier contenant la macro mais celui-ci est non valide (format .xlsb) ce qui me paraît étrange pour un site dédié aux développeurs..:?. . J'ai donc ajouté au fichier Macro_problème.xls joint une feuille "Code" qui contient mon programme.
A toutes fins utiles en voici une autre copie :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Sub Tri_obsolete ()
' Pour lancer cette macro j'ouvre manuellement la feuille « Tri »
' copier des données venant de la feuille "Données"
Sheets("Données").Select
Range("A:A,B:B,C:C").Select
Selection.Copy
Sheets("Tri").Select
Range("A1").Select
ActiveSheet.Paste
' supprimer les lignes des contrat qui n'ont plus cours
Range("A2").Select
Do While ActiveCell <> ""
If ActiveCell <> "" Then
ActiveCell.Offset(0, 3).Formula = "=IF(RC[-1]<>"""",""x"",SI(RC[-2]<TODAY(),""x"",""""))"
If ActiveCell.Offset(0, 3).Value = "x" Then
ActiveCell.EntireRow.Delete
Else: ActiveCell.Offset(1, 0).Range("A1").Select
End If
End If
Loop
End Sub |
Merci.
Cordialement
1 pièce(s) jointe(s)
Suppression en descendant
Bonjour à tous
mercatog tu dis
Citation:
Ensuite pour les suppressions de lignes il faudra commencer de la dernière ligne et remonter ...
Certe on le faire en remontant mais ce n'est pas une obligation moi je fais comme ça
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Sub sup_lign()
Dim Lign As Long
Dim Plag As String
Dim Famille As String
Lign = 2
Famille = InputBox("Veuillez saisir la famille à supprimer", "Suppression d'une famille")
Do While Cells(Lign, 2).Value <> ""
If Cells(Lign, 2).Value = UCase(Famille) Then
Plag = Lign & ":" & Lign
Rows(Plag).Select
Selection.Delete Shift:=xlUp
'On reste sur la même ligne car tout remonte d'un cran
Else
Lign = Lign + 1
End If
Loop
End Sub |
Voici mon fichier Exemple :
Pièce jointe 153875
A+
Un grand merci. Problème résolu.
Tout d’abord un grand merci à chacun d’entre vous pour vos réponses votre diligence.
En réponse à :
bbil,
merci beaucoup d’avoir des yeux pour moi et mille excuse de vous mobiliser pour ça. J’aurais dû repérer une erreur comme celle là. J’ai fait plein d’essais en faisant mon code que j’ai dû me mélanger les pinceaux entre Excel et VBA. J’essaierai d’être plus rigoureux la prochaine fois.
mercatog,
merci pour votre proposition de code avec l’utilisation des filtres. En fait, j’ai utilisé cette méthode auparavant pour des tris beaucoup plus difficiles que justement les filtres ne permettent pas de faire où bien avec de nombreuses manipulations. Comme je n’avais jamais essayé les macros, ma méthode était beaucoup plus rapide car une fois la formule créée un seul filtre suffit pour éliminer toutes les lignes indésirables. Ici par contre la macro est là, donc le choix du filtre où autre à vrai dire je ne vois pas trop la différence, comme par exemple remonter plutôt que de descendre (utilisation des ressources et de la mémoire ?). En tous, cas je vais essayer avec votre méthode avec les filtres.
Je précise que dans mon cas j’ai utilisé le While parce que le nombre de ligne de mon tableau est variable. La méthode For Next oblige à créer un compteur avec une variable, alors quel est son avantage par rapport à un While ?
Enfin, j’extrais les données car mon fichier initial est sensible et je dois garder l’historique. Donc je fais une exportation plusieurs fois par semaine, dans le fichier où j’exécute la macro. Pour ce qui est des messages d’erreurs, la solution m'a été donnée par bbil. J’ai remplacé Formula par Formula R1C1 et cela n’a rien changé, cela fonctionne dans les deux cas.
Igloobel,
merci pour votre code cette autre façon de trier me servira sûrement.
Cordialement
PS: je ne sais pas comment déclarer que le problème est résolu, donc je l'ai mentionné dans l'intitulé de ma présente réponse.