Se connecter avec
S'enregistrer | Connectez-vous

Macro pour supprimer ligne d'un feuillet à partir autre feuillet

Dernière réponse : dans Programmation

Chers internautes,

Je suis bien dans la mouise avec les macros et j'en appelle à votre aide.

Pour vous expliquer mon problème. J'ai deux feuillets dans un fichier excel. Les deux feuillets donnent des infos sur des contacts (nom, prénom, title, etc...). Il y a une ligne par contact, et la colonne g sert de clé car elle correspond aux emails (un email ne peut correspondre qu'à un contact) .La première ligne correspond à l'en tête et définit ce qu'il y a dans les 8 colonnes. Cette première ligne est similaire dans les deux feuillets.

Je veux supprimer toutes les lignes du premier feuillet (appelé "newsletter") qui correspondent à des contacts présents dans le deuxième feuillet (appelé "pro").

Ce que je veux demander à excel, c'est ça :

1. prends connaissance dans le feuillet "pro" de la cellule g2 (c'est a dire l'email du premier contact).
2.cherche dans dans la colonne g du feuillet "newsletter" si il y a une cellule qui correspond à la cellule g2 du feuillet "pro".
3. si tu la trouves, supprime la ligne qui correspond à cette celulle.

4. on recommence, prends dans le feuillet "pro" la cellule g3.
5......etc...g4, etc....

Le truc, c'est que le fichier newsletter fait 30 000 lignes et le pro fait 23 000. Donc une macro me ferait bien kiffer. J'ai cherché sur tous les forums, mais y a pas de truc qui réponde à ma question.

Et j'ai des vagues notions en vba qui datent, mais je connais pas trop la syntaxe. Par contre, j'ai l'impression que la structure de mon programme va dans le bon sens.

Qu'en pensez vous ?

Je vous donne le prog que j'ai fait :

Private Sub SupprimerLIGNE

Dim i As Integer
Dim j As Integer
Dim emailcontact as string

boucle1:
For i = 2 To 23000
Sheets("pro").Select
Cells(i, “g”).Value = emailcontact
Sheets("newsletter").Select
Columns("g:g").Select
For j=2 To 30000
If cells(j,”g”).value=emailcontact Then
Cells(j, “g”).EntireRow.Delete
End if
next j
next i
GoTo boucle1
End Sub
Lassé par la pub ? Créez un compte

Citation :
( Va lire les règles, et corrige ton post. Tu vas l'avoir ta macro ;)  )


excuse moi, mais j'ai pas compris en quoi je ne respecte pas les regles ? je galere avec un prog, et je le poste pour avoir de l'aide (ca fait beuger mon ordi) .

En quoi c''est mal ? En quoi c'est pas dans les règles ?

Stéphane.

Citation :
suffit de lire les règles et tu le sauras ...

Excusez moi, mais j'avais pas compris l'importance de la balise code.
J'ai vraiment beaucoup de temps sur cette macro, mais elle fait buggé excel.
Je vous la redonne dans les règles....

  1. Private Sub SupprimerLIGNE
  2.  
  3. Dim i As Integer
  4. Dim j As Integer
  5. Dim emailcontact as string
  6.  
  7. boucle1:
  8. For i = 2 To 23000
  9. Sheets("pro" ).Select
  10. Cells(i, “g”).Value = emailcontact
  11. Sheets("newsletter" ).Select
  12. Columns("g:g" ).Select
  13. For j=2 To 30000
  14. If cells(j,”g”).value=emailcontact Then
  15. Cells(j, “g”).EntireRow.Delete
  16. End if
  17. next j
  18. next i
  19. GoTo boucle1
  20. End Sub
Expert Programmation


  • Arrrghhhhh x_x Il utilise un GoTo [:thony] TU VEUX MA MORT, A ME FAIRE LIRE DES TRUCS PAREILS ???
    En plus, peut-on savoir pourquoi ?


  • Tu es sûr de ta ligne 10 ?
    Tu veux vraiment mettre le contenu de emailcontact dans la cellule (i, "G")


  • Lignes 10, 14 et 15, tu utilises Cells ( i, "g" ). Va lire l'aide de VBA et comprends pourquoi tu ne peux pas mettre "g".


  • JE HAIS LES SELECT !!!!! :fou: 
    (Mais je me soigne)
    Et je réécris ton code :

    1. For i = 2 To 23000
    2. emailcontact = Sheets("pro").Cells(i, "g").Value
    3. For j = 2 To 30000
    4. If Sheets("newsletter").Columns("g:g").Cells(j,"g").value = emailcontact Then
    5. Sheets("newsletter").Columns("g:g").Cells(j, "g").EntireRow.Delete
    6. End If
    7. Next j
    8. Next i


    Comme ça, on voit mieux. Ligne 5, on va améliorer ça :
    1. For i = 2 To 23000
    2. emailcontact = Sheets("pro").Cells(i, "g").Value
    3. For j = 2 To 30000
    4. If Sheets("newsletter").Columns("G:G").Cells(j,"g").value = emailcontact Then
    5. Sheets("newsletter").Columns("G:G").Delete
    6. End If
    7. Next j
    8. Next i


    La colonne G:G, c'est la colonne 7, on est d'accord :
    1. For i = 2 To 23000
    2. emailcontact = Sheets("pro").Cells(i, "G").Value
    3. With Sheets("newsletter").Columns(7)
    4. For j = 2 To 30000
    5. If .Cells(j, "G").value = emailcontact Then .Delete
    6. Next j
    7. End With
    8. Next i

    ( C'est sympa le With. Comme ça, tu n'es pas obligé de tout te retaper. )

    Tu n'as plus qu'à répondre au point 3, et ta macro fonctionnera :) 

    Citation :
    Oui, j'ai vu, mais j'aurai préféré que zarathoustra nous en parle.... :D 


    Salut Zeb.
    Comme tu m'as dit j'ai lu l'aide sur vba dans l'aide excel. Mais j'ai pas trouvé de solution concernant ce que tu as dit avec les (i,"g").
    Par contre, j'ai l'impression que Then rngCurrentCell.EntireRow.Delete pourrait être bien pour supprimer la ligne.

    En ce qui concerne la boucle go to, c'est vrai que c'était n'importe quoi. Et puis merci aussi pour la boucle with. Mais je n'ai toujours pas trouvé. Connaissez vous des tutoriaux sur le web pour le vba SVP ?
    Expert Programmation

    Concernant les (i, "g"), c'est bien sûr Cells (i, "g") qu'il faut considérer et donc, c'est l'aide concernant Cells que je t'encourage à aller voir.

    Spoiler

    Voici ce que dit l'aide de Cells. C'est pourtant clair non ?

    Cells, propriété

    Propriété Cells telle qu'elle s'applique à l'objet Worksheet.

    Cette propriété renvoie un objet Range qui représente toutes les cellules contenues dans la feuille de calcul (pas seulement les cellules en cours d'utilisation). En lecture seule.
    [i]expression[/i].[b]Cells[/b]

    expression Obligatoire. Expression qui renvoie un objet Worksheet.

    Notes
    La propriété Item étant la propriété par défaut de l'objet Range, vous pouvez spécifier l'index de ligne et de colonne immédiatement après le mot clé Cells. Pour plus d'informations, consultez la rubrique relative à la propriété Item et les exemples correspondants.

    Utilisée sans identificateur d'objet, cette propriété renvoie un objet Range représentant toutes les cellules contenues dans la feuille de calcul active.

    Exemples
    Cet exemple montre comment affecter une taille de caractères de 14 points à la cellule C5 dans la feuille Sheet1.
    Worksheets("Sheet1").Cells(5, 3).Font.Size = 14


    Cet exemple montre comment supprimer la formule dans la cellule 1 de la feuille Sheet1.
    Worksheets("Sheet1").Cells(1).ClearContents


    Cet exemple montre comment affecter une police de caractères Arial et une taille de 8 points pour toutes les cellules dans la feuille Sheet1.
    With Worksheets("Sheet1").Cells.Font
    .Name = "Arial"
    .Size = 8
    End With


    Cet exemple montre comment effectuer une boucle sur les cellules A1:J4 dans la feuille Sheet1. Si une cellule contient une valeur inférieure à 0,001, la valeur est remplacée par 0 (zéro).
    For rwIndex = 1 to 4
    For colIndex = 1 to 10
    With Worksheets("Sheet1").Cells(rwIndex, colIndex)
    If .Value < .001 Then .Value = 0
    End With
    Next colIndex
    Next rwIndex


    Cet exemple montre comment affecter le style italique aux cellules A1:C5 dans la feuille Sheet1.
    Worksheets("Sheet1").Activate
    Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True

    Cet exemple montre comment balayer une colonne de données intitulée « myRange ». Si une cellule contient la même valeur que celle située immédiatement au-dessus, l'adresse de la cellule contenant le doublon est affichée.

    Set r = Range("myRange")
    For n = 1 To r.Rows.Count
    If r.Cells(n, 1) = r.Cells(n + 1, 1) Then
    MsgBox "Duplicate data in " & r.Cells(n + 1, 1).Address
    End If
    Next n




    Je ne connais pas de bons tutoriels sur VB sur la toile. Si certains peuvent nous en communiquer, je ne manquerais pas de les ajouter aux premiers sujets de la catégorie.

    Ton petit texte est vraiment très intéressant pour comprendre ceci.
    Sinon, je vais chercher un tutorial vba bien sur le net.

    A part ça, j'ai trouvé un code bon je pense. Le voici (ça peut servir à beaucoup de gens qui ont besoin de trier des énormes fichiers).

    1. Sub Macro2()
    2. '
    3. ' Macro2 Macro
    4. '
    5.  
    6. Dim i As Integer
    7. Dim j As Integer
    8. Dim emailcontact As String
    9.  
    10. For i = 2 To 23262
    11. emailcontact = Sheets("pro").Cells(i, "G").Value
    12. 'With Sheets("newsletter")
    13. For j = 2 To 35294
    14. If StrComp(Sheets("newsletter").Cells(j, "G").Value, emailcontact) Then
    15. Sheets("newsletter").Cells(j, "G").EntireRow.Delete
    16. End If
    17. Next j
    18. 'End With
    19. Next i
    20.  
    21. End Sub



    Voilà, ca roule.
    Mais un dernier problème.

    Integer s'arrête à 32000,et comment fait on pour le pousser jusqu'à 35294 ?

    Expert Programmation

    M'enfin, ce n'est pas mon texte, c'est la page d'aide de Cells dans l'aide de Excel/VBA que je t'avais proposé de lire !!!! :o 

    Ca roule ? J'en suis ravi :) 

    Dixit l'aide de Excel/VBA :
    Citation :
    Les variables de type Integer sont stockées sous la forme de nombres de 16 bits (2 octets) dont la valeur est comprise entre -32 768 et 32 767.


    Toujours sur le même principe, si tu veux savoir quoi utiliser, demande à Excel l'aide sur Integer ( [F1] sur le mot Integer ), dans la rubrique Voir aussi, tu trouveras ton bonheur, à la longue ( :lol:  )

    Citation :
    M'enfin, ce n'est pas mon texte, c'est la page d'aide de Cells dans l'aide de Excel/VBA que je t'avais proposé de lire !!!! :o 

    Ca roule ? J'en suis ravi :) 

    Dixit l'aide de Excel/VBA :
    Citation :
    Les variables de type Integer sont stockées sous la forme de nombres de 16 bits (2 octets) dont la valeur est comprise entre -32 768 et 32 767.


    Toujours sur le même principe, si tu veux savoir quoi utiliser, demande à Excel l'aide sur Integer ( [F1] sur le mot Integer ), dans la rubrique Voir aussi, tu trouveras ton bonheur, à la longue ( :lol:  )


    Re Zeb.

    Mon problème c'est que la macro ne marche jamais. La macro ne finit jamais de fonctionner.
    Qu'en penses tu?
    Pourquoi ne s'arrête t elle jamais ?

    Stéphane.
    Expert Programmation

    Elle doit s'arrêter !
    Elle est peut être très lente [:spamafote]

    Ajoute la ligne suivante entre la 18 et la 19 de ton code.
    Debug.Print i, j


    Exécute ta macro, et au bout d'un moment, arrête-là. ( [Ctrl+Pause] par exemple ). Dans l'éditeur VB, affiche la fenêtre d'exécution ( [Ctrl+G] ) et constate (ou pas) que ta macro avance.

    Le problème, c'est que mon feuillet newsletter est complètement vide, ce qui mathématiquement impossible (car les lignes des deux feuillets sont uniques et que le fichier pro a un nombre inférieur de lignes que le fichier newsletter)

    Ca doit venir de la formule

    qu'en pensez vous ?
    Lassé par la pub ? Créez un compte