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

Excel Discussion :

Besoin d'aide pour compléter une macro SVP :)


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut Besoin d'aide pour compléter une macro SVP :)
    Bonjour à tous,

    Je débute en macros, aussi, je souhaiterai qu'une âme charitable veuille bien prendre quelques minutes de son temps pour m'appuyer sur le léger script suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
        Dim cell As range
     
        For Each cell In ActiveSheet.UsedRange
            If Left$(cell.Value, 1) = "T" Then cell.EntireRow.Delete
        Next
        MsgBox "Suppression faite"
    End Sub
    Je cherche en fait à supprimer toutes les lignes commençant par T (peu importe la colonne et nombre de lignes). Pour l'instant, tout va bien. Par contre je souhaiterai associer, de plus, une suppression de toutes les lignes avec T (majuscule caractère gras) et enfin celle commençant par "*" (char 42) . Le tout dans une seul macro mais je n'arrive pas à insérer de "or" ou plusieurs "If/Next".

    Merci d'avance de votre aide précieuse.

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Al385 Voir le message
    je n'arrive pas à insérer de "or" ou plusieurs "If.
    Etant donné que tu supprime la ligne que tu scrute, mettre des If successifs serait une mauvaise idée.

    Par contre, tu peux utiliser des Else If

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Condition1 Then
        cell.EntireRow.Delete
    ElseIf Condition2 Then
        cell.EntireRow.Delete
    ElseIf Condition2 Then
        cell.EntireRow.Delete
    End If

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    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 141
    Points : 9 976
    Points
    9 976
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si tu souhaites vraiment utiliser des Or :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Condition1 _
    Or Condition2 _
    Or Condition3 Then
        'Suppression
    End If
    et la version sans les sauts de lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Condition1 Or Condition2 Or Condition3 Then
        'Suppression
    End If

  4. #4
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Bonsoir MM,

    D'abord, je tiens à vous remercier pour ces 2 réponses, votre compréhension et le temps passé. Je ne pourrai pas tester ce soir vos 2 solutions, ce sera fait dès demain matin. Puis-je me permettre de vous demander en plus comment insérer le T(T majuscule caractère gras) en condition? Il s'agit là du dernier maillon manquant.

    Merci d'avance.
    Bien cordialement

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    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 141
    Points : 9 976
    Points
    9 976
    Billets dans le blog
    5
    Par défaut
    Admettons que ce soit ta condition 3 ... elle va en fait se décomposer en trois sous-conditions

    ce qui me permet d'introduire la notion de parenthèse : les trois sous-conditions sont entre parenthèse ... pour constituer la condition 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Condition1 _
    Or Condition2 _
    Or (Cell.Characters(1) = "T" And Cell.Characters(1).Font.Bold = True And UCase(Cell.Characters(1)) = Cell.Characters(1)) Then
    j'ai mis un peu de couleur pour bien comprendre

  6. #6
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces réponses.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Sub test()
        Dim cell As range
     
        For Each cell In ActiveSheet.UsedRange
            If (cell.Characters(1) = "T")
            Or (cell.Characters(1) = "*")
            Or (cell.Characters(1) = "T" And cell.Characters(1).Font.Bold = True And UCase(cell.Characters(1)) = cell.Characters(1)) Then
        cell.EntireRow.Delete
    End If
        Next
        MsgBox "Suppression faite"
    End Sub

    Je bloque toujours mon code ne marche pas ... Pouvez-vous y jeter un oeil svp ?

    Merci d'avance

  7. #7
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Personne pour m'orienter sur ce code dysfonctionnant ? Je ne trouve pas ...

    Merci d'avance

  8. #8
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Al385 Voir le message
    Je bloque toujours mon code ne marche pas
    "Ca ne marche pas", c'est un peu vague comme description de problème.
    Si tu ne prends pas la peine de t'expliquer clairement, il ne faut pas t'étonner qu'il n'y ait personne qui prenne la peine de te répondre.

  9. #9
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Navré, je manque de précisons mais mon blocage est identique à celui exprimé en début de conversation, code dans la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Sub test()
        Dim cell As range
     
        For Each cell In ActiveSheet.UsedRange
            If (cell.Characters(1) = "T")
            Or (cell.Characters(1) = "*")
            Or (cell.Characters(1) = "T" And cell.Characters(1).Font.Bold = True And UCase(cell.Characters(1)) = cell.Characters(1)) Then
        cell.EntireRow.Delete
    End If
        Next
        MsgBox "Suppression faite"
    End Sub
    La première condition If n'est pas acceptée et la continuité avec la condition"OR" n'est donc pas prise en compte également.

    Navré, une nouvelle fois, de ces imprécisions et merci d'avance.

    Cordialement,

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    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 141
    Points : 9 976
    Points
    9 976
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il y a deux problèmes dans ton code

    le premier, qui saute aux yeux quand tu as ton code dans l'éditeur, c'est que tu n'utilise pas de saut de ligne pour lier les trois lignes de ta condition, au moyen du caractère UnderScore que j'ai écrit dans mes exemples

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Condition1 _
    Or Condition2 _
    Or (Cell.Characters(1) = "T" And Cell.Characters(1).Font.Bold = True And UCase(Cell.Characters(1)) = Cell.Characters(1)) Then
    la seconde, un peu plus subtile, provient du test de la valeur de ton premier caractère
    en l'état, tu as une erreur car la propriété ".value" n'existe pas pour .Characters
    j'ai écris le code directement dans le message, et j'ai oublié d'écrire la bonne propriété, qui est ".Text"

    il suffisait de s'aider de la saisie intuitive de VBA, qui ne propose pas de .Value après avoir écrit ".Characters(1)." ... elle propose en revanche .Text

    il est important de comprendre la mécanique qu'on explique ainsi que les outils d'aide qu'offre VBA, ce qui permet de corriger ses erreurs, ou celle des proposants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim Cell As Range
     
    For Each Cell In ActiveSheet.UsedRange.Cells
        If (Cell.Characters(1).Text = "T") _
        Or (Cell.Characters(1).Text = "*") _
        Or (Cell.Characters(1).Text = "T" And Cell.Characters(1).Font.Bold = True And UCase(Cell.Characters(1).Text) = Cell.Characters(1).Text) Then
            Cell.EntireRow.Delete
        End If
    Next Cell
     
    MsgBox "Suppression faite"
     
    End Sub

  11. #11
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces précisions

    Je prends bonne note des 2 remarques : le "-" pour les sauts de ligne et la saisie intuitive pour aide obligatoire.
    Une nouvelle erreur au script, il est indiqué :
    "Impossible de lire la propriété Text de la Classe Characters.

    La propriété Text n'est donc pas reconnue ...

    Merci d'avance

  12. #12
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    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 141
    Points : 9 976
    Points
    9 976
    Billets dans le blog
    5
    Par défaut
    Bon,

    y'avait bien un piège dans ma proposition, pour te forcer à utiliser l'aide

    Characters possède deux arguments : début et longueur

    si tu ne mets pas la longueur, il va utiliser toute la chaine de caractère, regarde l'aide pour bien comprendre

    maintenant, ça ne devrait pas générer d'erreur d'exécution de ne pas spécifier la longueur ... simplement des tests faux

  13. #13
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Al385 Voir le message
    le "-" pour les sauts de ligne
    Non, ce n'est pas un - mais un _ .

  14. #14
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    "_" pour correction, merci.

    Je comprends désormais la logique de characters (début, longueur), mon T, * et T se positionnent toujours en début de séquence donc je renseigne (1, 1).
    Merci de nouveau

    Cependant, une anomalie subsiste, il est indiqué "impossible de lire la propriété Text de la classe Characters".

    Une idée ?

  15. #15
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Est-ce que tu n'aurais pas des cellules vides ?

    Autre détail qui n'a rien à voir avec tes If mais le reste de ta macro.
    Quand on fait une scrutation pour supprimer des lignes, on le fait plutôt du bas vers le haut.
    Avec un For Each, je ne sais pas trop comment ça va se passer quand une ligne sera supprimée (est-ce qu'il reste sur la même ligne pour voir la cellule suivante ou est-ce qu'il passe à la ligne suivante en sautant une cellule) ? Prends le temps de vérifier.

  16. #16
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    merci de cette réponse.

    J'ai des cellules vides effectivement, mais je ne comprends pas l'incidence car avec une seule condition (mon script initial), je ne rencontrais aucun dysfonctionnement malgrè ces cellules vides.

    Je vais tester d'éviter le "For each". Je cherche en espérant résolution . Je vous poste ma solution finale dans tous les cas !!

  17. #17
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    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 141
    Points : 9 976
    Points
    9 976
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il faudrait que tu regardes quelle est la cellule qui plante, et nous indiquer le contenu exact de la cellule.

    la méthode la plus simple pour ton niveau :

    rajoute cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.print Cell.Address
    entre la ligne 4 et 5 de ma proposition

    quand le code plante, tu passes en débogage et tu mets le curseur de ta souris sur le mot "Cell.Address", ce qui te donnera les coordonnées de la cellule, il ne restera plus qu'à relever le contenu et à nous le montrer

  18. #18
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Merci pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.print Cell.Address
    Pour restitution, il peut s'avérer comme un Msgbox en plus précis pour savoir à quelles lignes de codes le scrcipt bug en gros ? (le Msg box a d'autres utilités semble-t-il ... :p)

    Pour ce qui conerne le contenu bloquant, il s'agit de la cellule ="$I7$' qui correspond à une date en tout début de fichier (cellule fusionnée, je ne sais pas si ça a une importance ?). Mon fichier est confidentiel, c'est pour cela que je ne l'ai pas mis en pièce jointe mais je peux vous en faire une copie en effaçant toutes les données et en-têtes si besoin...

    Messieurs, une nouvelle fois, Merci !

  19. #19
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    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 141
    Points : 9 976
    Points
    9 976
    Billets dans le blog
    5
    Par défaut
    Ah oui, c'est le fait que ça soit une date qui coince, je viens de tester

    solution alternative : on exclue les cellules qui contiennent une date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For Each Cell In ActiveSheet.UsedRange.Cells
        If Not IsDate(Cell.Value) Then
            If (Cell.Characters(1).Text = "T") _
            Or (Cell.Characters(1).Text = "*") _
            Or (Cell.Characters(1).Text = "T" And Cell.Characters(1).Font.Bold = True And UCase(Cell.Characters(1).Text) = Cell.Characters(1).Text) Then
                Cell.EntireRow.Delete
            End If
        End If
    Next Cell
     
    MsgBox "Suppression faite"

  20. #20
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Je reviens de nouveau vers vous avec une copie d'un bout de fichier... Le traitement bloque toujours.
    Je suis surpris dans l'exécution :
    $B$1
    $C$1
    $D$1
    $A$1
    $B$1
    $C$1
    $D$1
    $A$1
    $B$1
    $C$1
    $D$1
    $B$2
    $C$2
    $A$1
    $B$1
    $C$1
    $D$1

    Le script bloque en cellule D1 avec une redondance d'exécution.

    Merci de nouveau par avance
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Besoin d'aide pour finir une macro VBA
    Par Poulette44 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/11/2011, 03h48
  2. [XL-2003] Besoin d'aide pour faire une boucle loop sur une macro
    Par spacesheep dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2010, 12h42
  3. Aide pour complèter une macro VBA
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 24/11/2008, 14h07
  4. Réponses: 22
    Dernier message: 20/05/2008, 11h25
  5. Besoin d'aide pour trouver un SGBD SVP
    Par rateub dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 26/01/2005, 21h20

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