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 :

Suppression NA et suppression de colonnes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2015
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2015
    Messages : 78
    Par défaut Suppression NA et suppression de colonnes
    Bonjour,

    Lorsque je fais une copie de valeurs d'une feuille à une autre, j'ai des résultats en #na qui après bloque la suite de la macro.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Sub Erreur_sage()
    Dim i&, J&, K&
    Dim Var As Variant, T As Variant
    Dim Rng As Range
    Dim na As Integer
    
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
      
    Worksheets("Erreurs Sage").Range("A2:I100").ClearContents
     
        Sheets("Erreurs Sage").Range("A2:I202").Value = Sheets("Livret").Range("A1:I201").Value
        Sheets("Erreurs Sage").Range("A203:I283").Value = Sheets("Poste 9 regard+couv").Range("A1:I81").Value
        Sheets("Erreurs Sage").Range("A284:I334").Value = Sheets("Poste 9 aspi").Range("A1:I51").Value
        Sheets("Erreurs Sage").Range("A335:I405").Value = Sheets("Appuis").Range("A1:I71").Value
        Sheets("Erreurs Sage").Range("A406:I446").Value = Sheets("Prélinteaux").Range("A1:I41").Value
        Sheets("Erreurs Sage").Range("A447:I497").Value = Sheets("Poste 10 regards").Range("A1:I51").Value
        Sheets("Erreurs Sage").Range("A498:I538").Value = Sheets("Poste 10 aspi").Range("A1:I41").Value
        Sheets("Erreurs Sage").Range("A539:I589").Value = Sheets("Poste 11 regards").Range("A1:I51").Value
        Sheets("Erreurs Sage").Range("A590:I630").Value = Sheets("Poste 11 aspi").Range("A1:I41").Value
          
    With ThisWorkbook.Sheets("Erreurs Sage")
       
       For na = 1 To 700 Step 1
            If IsError(Cells(na, 3)) Then
                Cells(na, 3).Value = ""
        End If
        
        Next na
        For na = 1 To 700 Step 1
            If IsError(Cells(na, 2)) Then
                Cells(na, 2).Value = ""
        End If
        Next na
      
      For na = 1 To 700 Step 1
            If IsError(Cells(na, 1)) Then
                Cells(na, 1).Value = ""
        End If
        Next na
        
       
        Set Rng = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(3)(1, 9))
        T = Rng
        For i = LBound(T, 1) To UBound(T, 1)
            Var = T(i, 9)
            If Var <> "0" And Var <> "" And T(i, 1) <> "Code" Then
                J = J + 1
                For K = LBound(T, 2) To UBound(T, 2)
                    T(J, K) = T(i, K)
                Next K
            End If
        Next i
       Rng.ClearContents
       If J > 0 Then Rng.Resize(J, UBound(T, 2)) = T
       .Columns("D:K").Delete Shift:=xlToLeft
        
    End With
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
     
    End Sub
    Pour la copie en vert, on n'avait conseillé ici de mettre le With ThisWorkbook.Sheets("Erreurs Sage") plus haut et de supprimer Sheets("Erreurs Sage") devant les copies mais le résultat n'était plus bon.

    J'ai rajouté la partie en jaune pour supprimer les NA, elle fonctionne très bien en manuelle mais en auto, elle ne fait rien et bug ensuite à la ligne If Var <> "0" And Var <> "" And T(i, 1) <> "Code" Then


    Pour supprimer les colonnes la partie en rouge fonctionne sur Excel 2007 mais fait planter Excel 2013. Savez vous pourquoi?

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je n'ai pas réellement compris la toutes les finalités de ta procédure ... ce qui rend compliqué l'aide

    regarde si ainsi c'est pas mieux, sinon une description de l'objectif exact de la macro semble nécessaire
    j'ai mis des commentaires sur les quelques interrogations que j'ai pu avoir en lisant ton code

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Sub Erreur_sage()
    Dim i&, J&, K&
    Dim Var As Variant, T As Variant
    Dim Rng As Range
    Dim na As Integer
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    With ThisWorkbook.Sheets("Erreurs Sage")
     
        .Range("A2:I100").ClearContents
        .Range("A2:I202").Value = Sheets("Livret").Range("A1:I201").Value
        .Range("A203:I283").Value = Sheets("Poste 9 regard+couv").Range("A1:I81").Value
        .Range("A284:I334").Value = Sheets("Poste 9 aspi").Range("A1:I51").Value
        .Range("A335:I405").Value = Sheets("Appuis").Range("A1:I71").Value
        .Range("A406:I446").Value = Sheets("Prélinteaux").Range("A1:I41").Value
        .Range("A447:I497").Value = Sheets("Poste 10 regards").Range("A1:I51").Value
        .Range("A498:I538").Value = Sheets("Poste 10 aspi").Range("A1:I41").Value
        .Range("A539:I589").Value = Sheets("Poste 11 regards").Range("A1:I51").Value
        .Range("A590:I630").Value = Sheets("Poste 11 aspi").Range("A1:I41").Value
     
        ' une boucle qui évite de faire trois fois ta boucle
        For i = 1 To 3
            For na = 1 To 700 Step 1     ' Step 1 est inutile, c'est le Step par défaut d'une boucle For
                If IsError(.Cells(na, i)) Then .Cells(na, i).Value = ""
            Next na
        Next i
     
     
        ' que veux-tu sélectionner exactement ici ? tu as vérifié que ton range est bien celui voulu ?
        Set Rng = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(3)(1, 9))
        T = Rng
        For i = LBound(T, 1) To UBound(T, 1)
            Var = T(i, 9)
            ' tu as tenté de contrôler la valeur de ton T(i,9) pour voir ce qu'elle renvoie quand c'est la valeur d'une cellule qui était en erreur ?
            If Var <> "0" And Var <> "" And T(i, 1) <> "Code" Then
                J = J + 1
                For K = LBound(T, 2) To UBound(T, 2)
                    T(J, K) = T(i, K)
                Next K
            End If
        Next i
       Rng.ClearContents
       If J > 0 Then Rng.Resize(J, UBound(T, 2)) = T
       .Columns("D:K").Delete
     
    End With
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
     
    End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Ton code, tu pourrais l'écrire de cette façon :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    Sub Erreur_sage()
     
        Dim I&, J&, K&
        Dim Var As Variant, T As Variant
        Dim Rng As Range
        Dim na As Integer
     
     
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
     
        With Worksheets("Erreurs Sage")
     
            .Range("A2:I100").ClearContents
     
            .Range("A2:I202").Value = Sheets("Livret").Range("A1:I201").Value
            .Range("A203:I283").Value = Sheets("Poste 9 regard+couv").Range("A1:I81").Value
            .Range("A284:I334").Value = Sheets("Poste 9 aspi").Range("A1:I51").Value
            .Range("A335:I405").Value = Sheets("Appuis").Range("A1:I71").Value
            .Range("A406:I446").Value = Sheets("Prélinteaux").Range("A1:I41").Value
            .Range("A447:I497").Value = Sheets("Poste 10 regards").Range("A1:I51").Value
            .Range("A498:I538").Value = Sheets("Poste 10 aspi").Range("A1:I41").Value
            .Range("A539:I589").Value = Sheets("Poste 11 regards").Range("A1:I51").Value
            .Range("A590:I630").Value = Sheets("Poste 11 aspi").Range("A1:I41").Value
     
            For na = 1 To 700
     
                If IsError(Cells(na, 1)) Then
                    .Cells(na, 1).Value = ""
                End If
     
                If IsError(Cells(na, 2)) Then
                    .Cells(na, 2).Value = ""
                End If
     
                If IsError(Cells(na, 3)) Then
                    .Cells(na, 3).Value = ""
                End If
     
            Next na
     
            Set Rng = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(3)(1, 9))
     
            T = Rng
     
            For I = LBound(T, 1) To UBound(T, 1)
     
                Var = T(I, 9)
     
                If Var <> "0" And Var <> "" And T(I, 1) <> "Code" Then
     
                    J = J + 1
     
                    For K = LBound(T, 2) To UBound(T, 2)
     
                        T(J, K) = T(I, K)
     
                    Next K
     
                End If
     
            Next I
     
           Rng.ClearContents
     
           If J > 0 Then Rng.Resize(J, UBound(T, 2)) = T
     
           .Columns("D:K").Delete Shift:=xlToLeft
     
        End With
     
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
     
    End Sub
    mais ça ne changera probablement rien au problème, si tu as des #N/A c'est que tu as des formules qui te retournent cette valeur d'erreur !
    Donne nous plus d'explications.

    Hervé.

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2015
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2015
    Messages : 78
    Par défaut
    joe.levrai:
    Le but, c'est d'importer les valeurs d'autres feuilles vers la feuille "erreur sage", puis de supprimer les NA et enfin de supprimer les lignes avec I égale à 0 ou vide et avec A égale à "code".
    J'utilise un tableau qu'on m'a conseillé ici car le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = .Range("I" & .Rows.Count).End(xlUp).Row To 2 Step -1
                        If .Cells(i, 9) = "0" Or .Cells(i, 9) = "" Or .Cells(i, 1) = "Code" Then .Rows(i).Delete
     
            Next i
    était très lent (15min mini).
    ' que veux-tu sélectionner exactement ici ? tu as vérifié que ton range est bien celui voulu ?
    toutes les valeurs importées donc de A2 jusqu’à la dernière cellule remplie de I.

    ' tu as tenté de contrôler la valeur de ton T(i,9) pour voir ce qu'elle renvoie quand c'est la valeur d'une cellule qui était en erreur ?
    Lorsque I égale 0 ou est vide, ça veut dire que les valeurs de cette ligne sont bonnes donc je les supprime (vu que cette feuille "erreurs sage" me sert à contrôler les erreurs) et lorsque A égale code, je supprime aussi.

    joe.levrai et Theze:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     With Worksheets("Erreurs Sage")
     
            .Range("A2:I100").ClearContents
     
            .Range("A2:I202").Value = Sheets("Livret").Range("A1:I201").Value
    Comme je l'ai dit, je ne mets plus le with avant l'importation car la copie était mauvaise. Bizarre je sais...

    Theze:
    si tu as des #N/A c'est que tu as des formules qui te retournent cette valeur d'erreur !
    Donne nous plus d'explications.
    Les #NA apparaissent lorsque la cellule de la feuille source est vide(qu'elle soit vraiment vide ou que sa formule revoit le résultat "")

    Aujourd'hui ça va être un peu chaud de faire des tests (je suis en inventaire) mais j'essayerai ta nouvelle boucle pour NA joe, pour voir si elle passe en automatique. Car actuellement je dois: ouvrir une première fois mon fichier, j'ai l'erreur à cause des NA, puis je lance une macro avec juste la boucle, ça supprime les NA, j'enregistre le fichier puis le relance et c'est bon.

    J'ai mis le fichier en pièce-jointe mais faudra désactiver les macro car vous n'avez pas le fichier source du module1.
    Fichiers attachés Fichiers attachés

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Bonjour,

    ce devrait être bien plus judicieux de copier uniquement les données désirées via un filtre avancé

    avec un critère calculé (voir du côté de la fonction de feuille de calculs ESTNUM par exemple) …


    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

Discussions similaires

  1. suppression des donnees d'une colonne
    Par freenight dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/05/2009, 17h35
  2. Réponses: 13
    Dernier message: 10/03/2009, 22h37
  3. Tableau dynamique croisé: suppression de total de sous-colonne
    Par GodGives dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 14/01/2009, 16h21
  4. Suppression de blancs dans une colonne
    Par DreammyKetty dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2007, 11h28
  5. [VBA-E] Suppression du contenu d'une colonne sans perdre ses formules
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/04/2007, 09h08

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