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 lignes et colonnes si condition - correction de macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut Suppression lignes et colonnes si condition - correction de macro
    Bonjour,


    Suite à ce topic,

    http://www.developpez.net/forums/d15...s/#post8317611

    Je reviens vous demander un peu d'aide, je pense être pas loin de la fin de mon problème.

    J'ai un code qui lorsqu'il est exécuté, m'indique erreur d'exécution 13: incompatibilité de type

    J'ai regardé sur le net, il pourrait s'agir très certainement d'une mauvaise déclaration de variable, mais je ne vois pas mon erreur.
    Il peut s'agir de quelque chose de tout bête, étant donné que je suis novice en 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
    Sub supprimer_lignes_et_colonnes_vides()
     
    Dim i As Long, Lig%
     
    For i = Range("A65536").End(xlUp).Row To 2 Step -1
    If Cells(i, 1) = 0 Then Rows(i).Delete
    Next i
     
     
    For Lig = [C65536].End(xlUp).Row To 2 Step -1
    If Range("AR" & Lig).Value = 0 Then Rows(Lig).Delete
    Next
     
     
    For j = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column To 3 Step -1
     
    If Application.WorksheetFunction.CountA(Range(Cells(1, j), Cells(110, j))) = 1 Then
     
    Columns(j).Delete
     
    End If
      Next
    A savoir que mon code marchait à partir de "FOR LIG =...." jusqu'à la fin, le problème devrait donc provenir de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = Range("A65536").End(xlUp).Row To 2 Step -1
    If Cells(i, 1) = 0 Then Rows(i).Delete
    Next i
    qui me permet de supprimer des lignes en plus dont je n'ai pas besoin.


    Je remercie par avance quiconque pourra m'aider !

    Cordialement,

    Jon

  2. #2
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Lors de la déclaration de tes variable tu ecris :
    Dim i As Long, Lig%

    Tu as donc i de type Long et Lig de type Integer (%). Un Integer est une varibable de type numérique codé sur 2 Octets donc de -32768 à 32767.
    Si tu as plus de 32767 ligne la variable Lig prend une valeur trop grande avec For Lig = [C65536].End(xlUp).Row.

    Donc je te conseil de changer de type de variable.
    Dim Lig As Long (&)

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim i As Long, Lig As Long
    ou pour avoir les deux en Long.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut
    Bonjour Antonysansh, merci pour ta réponse

    J'ai compris et modifié selon ce que tu m'as dit, mais cela ne résout pas mon problème, l'erreur d'exécution 13 est toujours présente

    Aurais-tu une idée de la provenance ?

    Merci

    Cordialement,

    Jon

  4. #4
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Uniformise ce bout la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = Range("A65536").End(xlUp).Row To 2 Step -1
    If Cells(i, 1) = 0 Then Rows(i).Delete
    Next i
     
     
    For Lig = [C65536].End(xlUp).Row To 2 Step -1
    If Range("AR" & Lig).Value = 0 Then Rows(Lig).Delete
    Next
    Pourquoi une fois tu mets Range et l'autre [] ? Tu peux aussi en profiter pour spécifier la feuille c'est toujours conseillé.
    Ensuite une fois Cells et l'autres Range, pourquoi ?

    En plus comme i n'est en fait qu'un indice de boucle tu peux t'en resservir, pas besoin de 3 indice pour 3 boules.

    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
    Sub test()
        Dim i&
            'Boucle 1
            For i = ActiveSheet.Cells(Application.Rows.Count, 1).End(xlUp).Row To 2 Step -1
                If ActiveSheet.Cells(i, 1) = 0 Then Rows(i).Delete
            Next i
            'Boucle 2
            For i = ActiveSheet.Cells(Application.Rows.Count, 3).End(xlUp).Row To 2 Step -1
                If ActiveSheet.Cells(i, 44) = 0 Then Rows(i).Delete
            Next i
            'Boucle 3
            For i = ActiveSheet.Cells(1, Application.Columns.Count).End(xlToLeft).Column To 3 Step -1
                If Application.WorksheetFunction.CountA(Range(Cells(1, i), Cells(110, i))) = 1 Then _
                    Columns(i).Delete
            Next i
    End Sub
    Ah et avec un For i, il ne faut pas oublier le Next i.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut
    2 personnes différentes m'avaient aidé, d'où la différence de méthode qu'il y a.

    D'accord, je ne savais pas pour le i, je pensais qu'une fois défini il fallait le changer.

    Je vais jeter un coup d'oeil sur le code écrit, je t'en remercie, je reviendrai vers toi au besoin.

    Cordialement,

    Jon

  6. #6
    Membre expérimenté Avatar de Denis la Malice
    Homme Profil pro
    FabManager
    Inscrit en
    Février 2013
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : FabManager
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 133
    Par défaut Une autre version de codage
    Bonjour,
    j'ai vu que dans un des codes, tu testes la colonne "AR", (la colonne 44) pour détruire la ligne si cette colonne est vide. Mais dans ton ménage, tu supprimes les colonnes qui n'ont aucune valeur. Cela veut dire que la colonne "AR" ne reste pas colonne "AR".
    Et tu de dis rien à propos de ce critère de destruction de ligne.

    Au lieu de parcourir 3 fois les lignes et faire un test dans chaque boucle, parcours 1 fois les lignes et fais tes 3 tests dans la boucle. Si test tests sont simple, tu peux les combiner avec un OU ai lieu d'enchainer les ElseIf. C'est juste une question de lisibilité du code.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                   If .Cells(Ligne, 1) = "" Or .Cells(Ligne, 44) = 0 Then
    Voici un exemple de codage, bien que je ne sois pas persuadé que le test sur la colonne 44 soit pertinent. Ce code n'est pas mieux ou moins bien que les autres. C'est une autre version.

    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
    Sub Menage()
         Dim DerniereLigne As Long, DerniereColonne As Long, Ligne As Long, Colonne As Long
     
         With ActiveSheet
              DerniereLigne = .Cells.SpecialCells(xlCellTypeLastCell).Row
              DerniereColonne = .Cells.SpecialCells(xlCellTypeLastCell).Column
     
              ' Boucle sur les lignes
              For Ligne = DerniereLigne To 2 Step -1
                   ' Ligne dont la première colonne est vide
                   If .Cells(Ligne, 1) = "" Then
                        .Rows(Ligne).Delete
                   ' Ligne n'ayant aucune valeur entre la colonne 3 et la fin
                   ElseIf WorksheetFunction.CountA(Range(.Cells(Ligne, 3), .Cells(Ligne, DerniereColonne))) = 0 Then
                        .Rows(Ligne).Delete
                   ' Autre critère (colonne AR vide)
                   ElseIf .Cells(Ligne, 44) = 0 Then
                        .Rows(Ligne).Delete
                   End If
              Next Ligne
     
              ' Boucle sur les colonnes
              For Colonne = DerniereColonne To 3 Step -1
                   ' Colonne n'ayant aucun valeur entre la ligne 2 et la derniere ligne
                   If WorksheetFunction.CountA(Range(.Cells(2, Colonne), .Cells(DerniereLigne, Colonne))) = 0 Then
                        .Columns(Colonne).Delete
                   End If
              Next Colonne
         End With
    End Sub
    Pour l'erreur d'incompatibilité de type, utilise le débogueur pour savoir quelle ligne de code génère l'erreur et quelles sont les valeurs des variables au moment de l'erreur.

    Et antonysansh a raison sur l'uniformisation de ton écriture. Ne fais pas un bête copier-coller des codes que tu glanes à droite et à gauche. Approprie-toi le code, comprend-le, adopte les meilleures pratiques. Et puis commente ton code pour t'y retrouver quand tu feras des modifications dans quelques mois.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut
    Bonjour Denis la Malice,

    Cela veut dire que la colonne "AR" ne reste pas colonne "AR".
    C'est exact, c'est pour cela que je cherche une macro qui me fasse tout cela d'un coup, pour éviter tout problème dû au décalage.

    Pour mieux comprendre, mon cas de figure est le suivant:
    1) J'ai un fichier excel extrait d'un logiciel
    2) Je copie/colle ce fichier extrait dans le template que je souhaite créer, template pour lequel j'ai prévu initialement un nombre de colonnes et de lignes supérieurs qui englobent le fichier extrait dans n'importe quel cas (i.e. j'aurais toujours des colonnes vides à droite et des lignes vides en dessous quand je colle le fichier extrait)
    3) A la droite de cet espace en trop prévu, j'ai calculs et indicateurs que j'ai automatisé sous forme de formule.
    4) Pour rendre le tout lisible intervient alors la suppression du surplus de colonnes et lignes (vides donc, puisque le fichier extrait sera toujours plus "petit")

    Ainsi, je pense que le décalage causé ne me semble pas trop important, puisque mes calculs posés incluent TOUTES les cellules à l'origine: puisqu'elles disparaissent, elles ne seront pas pris en compte mais les calculs sur les chiffres restant seront justes.

    Je sais que mon code est un peu barbare, voire complètement dégueulasse pour quiconque maîtrise le vba, mais je ne pense sincèrement pas être apte à faire du travail totalement propre en passant par le codage, qui j'en suis certain le permettrait.

    Et antonysansh a raison sur l'uniformisation de ton écriture. Ne fais pas un bête copier-coller des codes que tu glanes à droite et à gauche. Approprie-toi le code, comprend-le, adopte les meilleures pratiques.
    C'est l'idéal en effet... Je vais analyser ce que vous m'avez tous les 2 donner, et tenter de l'adapter.

    D'ailleurs un grand merci pour le temps pris.

    Et si par le plus grand hasard en voyant ma description ci-dessus, une autre méthode plus intelligente vous viendrait à l'esprit, je serai ravi que vous m'en fassiez part

    Cordialement,

    Jon

  8. #8
    Membre expérimenté Avatar de Denis la Malice
    Homme Profil pro
    FabManager
    Inscrit en
    Février 2013
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : FabManager
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 133
    Par défaut
    Bonjour,
    ce qui me chagrine avec la destruction de AR c'est que si tu relances la macro, alors elle détruira une colonne qui contient quelque chose de non maitrisé (peut-être des formules qui étaient loin à droite et qui sont du coup "moins loin".

    Personnellement j'aurais plutôt importé (collé) dans une feuille et fait mes calculs dans une autre (avec les verrouillages de cellule et protections de page adéquats).

    As-tu toujours une erreur ? Si oui, à quelle ligne ?

Discussions similaires

  1. Suppression lignes & colonnes sous conditions
    Par jon94400 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/07/2015, 19h51
  2. Macro suppression lignes en fonction plusieurs conditions
    Par edouardM dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/07/2013, 16h32
  3. [XL-2003] Suppression lignes selon colonne de 2 sheets
    Par Vadorblanc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2011, 16h54
  4. Suppression ligne sur condition
    Par cchampion2fr dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/09/2008, 15h39
  5. [VBA-E] Suppression des colonnes avec condition
    Par desdenova dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2007, 13h39

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