IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA avec fonction SI, Message #NOM? dans Excel et Erreur13 de VBA : incompréhensible [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    logisticien
    Inscrit en
    Août 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : logisticien

    Informations forums :
    Inscription : Août 2014
    Messages : 28
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonjour,

    attention tu as des IF et des SI dans ta formule

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    A première vu il y a à voir la différence entre Formula et FormulaR1C1

    Ensuite pour les suppressions de lignes il faudra commencer de la dernière ligne et remonter

    Enfin, pourquoi exporter et ensuite traiter, il y a l'option des filtres. Filter les données et n'exporter que les lignes désirés

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub Extraction2()
    Dim LastLig As Long
     
    Application.ScreenUpdating = flase
    With Worksheets("Données")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        'On filtre la colonne B sur les dates>= aujourdhui
        .Range("B1:C" & LastLig).AutoFilter Field:=1, Criteria1:=">=" & CLng(Date)
        'on filtre la colonne C sur les cellules vides
        .Range("B1:C" & LastLig).AutoFilter Field:=2, Criteria1:="="
        'on efface la feuille Tri
        Worksheets("Tri").UsedRange.Clear
        'et on y copie les lignes visibles
        .Range("A1:C" & LastLig).SpecialCells(xlCellTypeVisible).Copy Worksheets("Tri").Range("A1")
        .AutoFilterMode = False
    End With
    End Sub

    Edit. Chapeau bbil pour le coup d’œil

  4. #4
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut Suppression en descendant
    Bonjour à tous

    mercatog tu dis
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Sup_Familles.xls

    A+

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    @Igloobel
    Ce n'est pas une obligation, tous les chemins mènent à Rome certes, mais il faudra dans chaque cas de figure, mettre les conditions

    Pour ton code, il faut aussi indiquer que sur l'ensemble de ta plage il n'y a pas de cellule vide (utilisation du While) car généralement on connait le nombre de lignes, et on utilise une boucle For/Next en remontant. J'espère que ma réflexion est passée

    Sans parler du select et de l'utilisation de la variable Plag et d'autres petits détail

    Ton code avec l'hypothèse décrite ci-dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub sup_lign()
    Dim Lign As Long
    Dim Famille As String
     
    'Ce code suppose qu'il n'ya pas de cellule vide dans la colonne 2
    Lign = 2
    Famille = InputBox("Veuillez saisir la famille à supprimer", "Suppression d'une famille")
    Do While Cells(Lign, 2).Value <> ""
        If UCase(Cells(Lign, 2).Value) = UCase(Famille) Then
            Rows(Lign).Delete Shift:=xlUp
        Else
            Lign = Lign + 1
        End If
    Loop
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    logisticien
    Inscrit en
    Août 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : logisticien

    Informations forums :
    Inscription : Août 2014
    Messages : 28
    Par défaut 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.

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Citation Envoyé par pétrin Voir le message
    ...
    Une boucle sur les cellules est toujours plus lente qu'une méthode directe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] Comment supprimer une ligne entiere dans excel
    Par babouoles dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 06/07/2017, 08h34
  2. [VBA-W]prendre des valeurs "texte" dans Excel
    Par teromah dans le forum VBA Word
    Réponses: 12
    Dernier message: 14/06/2007, 16h20
  3. VBA-E Recherche des différents noms dans mon tableau excel
    Par tazmania dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/04/2007, 19h31
  4. [VBA-E]Fonction vb depuis la feuille excel
    Par Pollux dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/02/2006, 18h41
  5. Récupérer une sheets dans excel vers access sous vba
    Par odbee dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/10/2005, 00h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo