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 pour supprimer cellule [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut VBA pour supprimer cellule
    Bonjour,

    J'ai mon fichier Macros qui me permet d'exécuter une macro pour supprimer dans mon fichier Banque de la colonne B les codes BANQUES BNP458 et POUY985.
    Le code ne s'exécute pas correctement. Pourriez-vous me venir en aide ?

    Voici mon code :

    Sub Suppr()

    Dim i As Integer
    With ThisWorkbook.Sheets("BASE")

    For i = .Range("B" & .Rows.Count).End(xlUp).Row To 2 Step -1


    If .Range("B" & i).Value = "BNP458" Then .Rows(i).Delete
    If .Range("B" & i).Value = "POUY985" Then .Rows(i).Delete

    End If
    Next i
    End With
    End Sub

    En vous remerciant beaucoup de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut
    Bonjour,

    Je me permets quelques petites indications en préambule , en toute bienveillance :

    1. La plupart des utilisateurs n'ouvre pas les pièces jointes par soucis de sécurité.
    2. Utilise les balises de code # pour afficher du code, ce qui rendra le code plus lisible, tu recevras donc plus facilement de l'aide.
    3. "Le code ne s'exécute pas correctement" -> Cela revient à aller voir un médecin en disant "je suis malade". Il faut nous expliquer quels sont tes "symptômes", qu'est-ce qui ne fonctionne pas ou fonctionne mal ? As-tu un message d'erreur ? Etc.


    Cela étant dit, pour faire ce que tu souhaites faire, plutôt que de passer par une boucle, moi je ferai un filtre sur les valeurs que tu souhaites supprimer, et je supprimerais les lignes affichées par le filtre. Et si cela est possible pour ton jeu de données, je ferai même au préalable un tri sur la colonne B, ce qui rendrait le code beaucoup plus rapide si tu as beaucoup de lignes.

  3. #3
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut
    Bonsoir Matt955,

    Je ne peux pas vraiment faire de filtre puis supprimer les lignes, car dans mon fichier j'aurais plusieurs code Banque à supprimer.
    Le code erreur qui s'affiche est le suivant : "Erreur de compilation, End If sans bloc if".
    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 Suppr()
     
    Dim i As Integer
    With ThisWorkbook.Sheets("BASE")
     
    For i = .Range("B" & .Rows.Count).End(xlUp).Row To 2 Step -1
     
     
    If .Range("B" & i).Value = "BNP458" Then .Rows(i).Delete
    If .Range("B" & i).Value = "POUY985" Then .Rows(i).Delete
     
    End If
    Next i
    End With
    End Sub

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut, comme ceci:

    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
    Sub SupprimeCodes()
     
    Dim ws As Worksheet
    Dim lastrow As Long
    Dim i As Long
     
    'Définition feuille de travail
    Set ws = ThisWorkbook.Worksheets("BASE")
    'Dernière cellule colonne B
    lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
     
    Application.ScreenUpdating = False
     
    'Parcours de la colonne B, de bas en haut
    For i = lastrow To 2 Step -1
        ' Si code trouvé alors suppression de la ligne
        If Range("B" & i).Value = "BNP458" Or Range("B" & i).Value = "POUY985" Then
            Range("B" & i).EntireRow.Delete
        End If
    Next i
     
    Application.ScreenUpdating = True
     
    MsgBox "Traitement terminé!", vbInformation
     
     
    End Sub
    En relisant ton code, je vois que tu as 2 lignes if then, c'est ok, puis juste en dessous tu as un end if qui ne sert à rien.

  5. #5
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut
    Bonsoir Franc,

    Merci beaucoup pour ta proposition de réponse.
    La macro s'exécute depuis le fichier Macros. Est-ce que je peux inclure ce code au début 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
     
    Sub SupprimeCodes()
     
    Workbooks.Open filename:="C:\chemin du fichier\Banque.xlsx"
     
     
    Dim ws As Worksheet
    Dim lastrow As Long
    Dim i As Long
     
    'Définition feuille de travail
    Set ws = ThisWorkbook.Worksheets("BASE")
    'Dernière cellule colonne B
    lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
     
    Application.ScreenUpdating = False
     
    'Parcours de la colonne B, de bas en haut
    For i = lastrow To 2 Step -1
        ' Si code trouvé alors suppression de la ligne
        If Range("B" & i).Value = "BNP458" Or Range("B" & i).Value = "POUY985" Then
            Range("B" & i).EntireRow.Delete
        End If
    Next i
     
    Application.ScreenUpdating = True
     
    MsgBox "Traitement terminé!", vbInformation
     
     
    End Sub

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Ha, je n'avais pas compris que tu lançais la macro depuis un autre classeur. Je l'ai modifiée pour en tenir compte.
    Intègre la macro dans un module standard et lance-la manuellement ou tu peux l'affecter à un bouton.

    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
    Sub SupprimeCodes()
     
        'Ouvrir le classeur
        Dim wb As Workbook
        Set wb = Workbooks.Open(Filename:="C:\chemin du fichier\Banque.xlsx")
     
        Dim ws As Worksheet
        Dim lastrow As Long
        Dim i As Long
     
        'Définition feuille de travail
        Set ws = wb.Worksheets("BASE")
        'Dernière cellule colonne B
        lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
     
        Application.ScreenUpdating = False
     
        'Parcours de la colonne B, de bas en haut
        For i = lastrow To 2 Step -1
            ' Si code trouvé alors suppression de la ligne
            If ws.Range("B" & i).Value = "BNP458" Or ws.Range("B" & i).Value = "POUY985" Then
                ws.Range("B" & i).EntireRow.Delete
            End If
        Next i
     
        Application.ScreenUpdating = True
     
        MsgBox "Traitement terminé!", vbInformation
     
        'Fermer le classeur et sauvegarder les modifications
        wb.Close SaveChanges:=True
     
    End Sub

  7. #7
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut
    Bonjour Franc,

    La macro ci-dessous fonctionne quand le fichier banque est fermé :
    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
    Sub SupprimeCodes()
     
        'Ouvrir le classeur
        Dim wb As Workbook
        Set wb = Workbooks.Open(Filename:="C:\chemin du fichier\Banque.xlsx")
     
        Dim ws As Worksheet
        Dim lastrow As Long
        Dim i As Long
     
        'Définition feuille de travail
        Set ws = wb.Worksheets("BASE")
        'Dernière cellule colonne B
        lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
     
        Application.ScreenUpdating = False
     
        'Parcours de la colonne B, de bas en haut
        For i = lastrow To 2 Step -1
            ' Si code trouvé alors suppression de la ligne
            If ws.Range("B" & i).Value = "BNP458" Or ws.Range("B" & i).Value = "POUY985" Then
                ws.Range("B" & i).EntireRow.Delete
            End If
        Next i
     
        Application.ScreenUpdating = True
     
        MsgBox "Traitement terminé!", vbInformation
     
        'Fermer le classeur et sauvegarder les modifications
        wb.Close SaveChanges:=True
     
    End Sub
    Cependant, quand je teste cette macro ci-dessous quand le fichier est déjà ouvert, j'ai le message d'erreur "Erreur d'exécution '9' : L'indice n'appartient pas à la sélection". Je ne comprends pas pourquoi.
    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
    Sub SupprimeCodes()
     
    Dim ws As Worksheet
    Dim lastrow As Long
    Dim i As Long
     
    'Définition feuille de travail
    Set ws = ThisWorkbook.Worksheets("BASE")
    'Dernière cellule colonne B
    lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
     
    Application.ScreenUpdating = False
     
    'Parcours de la colonne B, de bas en haut
    For i = lastrow To 2 Step -1
        ' Si code trouvé alors suppression de la ligne
        If Range("B" & i).Value = "BNP458" Or Range("B" & i).Value = "POUY985" Then
            Range("B" & i).EntireRow.Delete
        End If
    Next i
     
    Application.ScreenUpdating = True
     
    MsgBox "Traitement terminé!", vbInformation
     
     
    End Sub

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Ok, on vérifie alors si le classeur est ouvert avant traitement, comme ceci:

    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
    Sub SupprimeCodes()
     
        Dim wb As Workbook
        Dim ws As Worksheet
        Dim lastrow As Long
        Dim i As Long
     
        'Vérifier si le classeur est déjà ouvert
        On Error Resume Next
        Set wb = Workbooks("Banque.xlsx")
        On Error GoTo 0
     
        'Si le classeur n'est pas ouvert, l'ouvrir
        If wb Is Nothing Then
            Set wb = Workbooks.Open(Filename:="C:\chemin du fichier\Banque.xlsx")
        End If
     
        'Définition feuille de travail
        Set ws = wb.Worksheets("BASE")
        'Dernière cellule colonne B
        lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
     
        Application.ScreenUpdating = False
     
        'Parcours de la colonne B, de bas en haut
        For i = lastrow To 2 Step -1
            ' Si code trouvé alors suppression de la ligne
            If ws.Range("B" & i).Value = "BNP458" Or ws.Range("B" & i).Value = "POUY985" Then
                ws.Range("B" & i).EntireRow.Delete
            End If
        Next i
     
        Application.ScreenUpdating = True
     
        MsgBox "Traitement terminé!", vbInformation
     
        'Fermer le classeur et le sauvegarder
        wb.Close SaveChanges:=True
     
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut
    Franc,

    Merci beaucoup pour tes propositions de réponses. La macro fonctionne parfaitement sur le fichier test, qu'il soit ouvert ou non.

    Cependant, je rencontre le problème suivant lorsque je veux l'adapter à mon fichier.
    J'ai le code code "Erreur d'exécution 13 : Incompatibilité de type". Qu'est ce que celà peut signifier ?

  10. #10
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Je ne peux pas te donner de réponse précise sans savoir le type de données traitées. Exécute le code pas à pas et lorsqu'une ligne provoque cette erreur, vérifie que la variable qui reçoit la donnée est du même type.

  11. #11
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut
    Bon, je crois que j'ai trouvé d'où vient le problème. C'est qu'à la fin de la colonne B, j'ai des lignes #N/A#. En les supprimant, le code fonctionne.

    Une dernière question, je ne veux pas que le fichier se ferme après le lancement de la macro . J'ai mis ce code, mais çà ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    .

  12. #12
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    rien à voir, ça c'est pour figer l'affichage pour gagner du temps à l'execution. Refais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True
    Sinon tu risques de voir (ou ne pas voir, justement) des choses bizarres.

    La modif à faire est vers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'Fermer le classeur et le sauvegarder
        wb.Close SaveChanges:=True
    à remplacer par exemple par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     'Sauvegarder le classeur sans le fermer
        wb.Save

  13. #13
    Membre averti
    Homme Profil pro
    FINANCIER
    Inscrit en
    Juillet 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : FINANCIER

    Informations forums :
    Inscription : Juillet 2014
    Messages : 18
    Par défaut
    Bonjour Franc,

    Merci beaucoup pour ces précieux points.

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

Discussions similaires

  1. [XL-2007] VBA pour supprimer onglet en fonction du texte d'une cellule
    Par karlgina dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/01/2017, 08h32
  2. Code VBA pour compter cellules
    Par pierrotyahoo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/02/2013, 17h23
  3. [XL-2007] Code VBA pour supprimer des lignes sous condition - problème
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/06/2011, 09h09
  4. [XL-2010] Macro VBA pour supprimer des caractère situés après une valeur
    Par Guillaume_PMO dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/03/2011, 17h06
  5. [WD-2000] Technique pour supprimer cellule contenant un certain texte
    Par ruliann dans le forum Word
    Réponses: 13
    Dernier message: 12/01/2011, 10h34

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