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 excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut VBA excel
    Bonjour,

    J'ai créé un formulaire pour saisir, modifier ou supprimer des données dans un classeur excel. Tout fonctionne correctement sauf pour supprimer : je souhaite que lorsque je supprime une ligne dans la feuil 1 (depuis mon formulaire), les données identique soient également effacé dans les autres feuil de mon classeur (la feuil 1 étant ma base de données). Voici le code que j'ai actuellement pour effacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Supprimer_Click()
    Dim i As Integer
    'Supprimer l'employé séléctionné
        i = lstproduits.ListIndex + 5
            Rows(i).Select
        Selection.Delete Shift:=xlUp
        Init_produit
        bnouveau = True
        'réaffichage de la liste
        If bnouveau Then Affiche_produits
    End Sub
    Merci d'avance du coup de main...

    [Balises "Code" ajoutées par AlainTech]
    [Merci d'y penser vous-même à l'avenir.]

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Plusieurs infos seraient nécessaires si on veut t'aider :
    1 - Tu as combien de feuilles dans lesquelles tu dois effacer les mêmes données,
    - toutes les feuilles ?
    - y compris la base de données ?
    2 - Quand tu dis "effacer les données identiques" cela concerne-t-il
    - des cellules ?
    - des lignes ?
    3 - Faut-il
    - les effacer ?
    - les supprimer ?
    Les données sont-elles
    - sur la même lignes ?
    - dans la même colonne ?

    Tu dis

    A+

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut
    Ma base de données concerne des produits qui sont utilisés dans différent "départements" et les feuilles suivantes les différents département.

    Mon formulaire reprend les données dans la base de données et c'est à partir de la que je fais les modifs.

    Par conséquent, le nombre de feuille varie car certains produit sont utilisés dans un département tandis qu'un autre dans tous...

    Lorsque j'efface un produit la ligne complète dois être supprimer dans tous les département qui utilise ce produit.

    Le données d'un produit se trouve sur une seule ligne mais ce n'est pas la même d'une feuille à l'autre.

    Je ne sais pas si c'est assez clair ?

    Merci

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok.
    Si je comprends bien ton code, le produit à effacer est la ligne contenant lstproduits.List(ListIndex) et, dans la feuille de calcul, ce produit se trouve 5 lignes plus bas que l'index... Seulement pour être sûr d'avoir bien compris ton code.
    Un truc me perturbe...
    bnouveau = True
    'réaffichage de la liste
    If bnouveau Then Affiche_produits
    Tu peux remplacer tout ça par "Affiche_produits", ça ne changera rien.

    Ton pb :
    Avant ces trois lignes, tu lances dans une boucle une procédure qui va successivement effectuer sur tes autres feuilles de calcul, une recherche de la donnée à effacer et l'effacement de la ligne.

    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
    Sub EffacerLaDonnéeDansToutesLesFeuilles()
    'NomBaseDeDonnée = "Feuil2"
    'DonnéeAEffacer = "Gugus"
    DonnéeAEffacer = lstproduits.List(ListIndex)
        For i = 1 To ActiveWorkbook.Worksheets.Count
            If Worksheets(i).Name <> NomBaseDeDonnée Then   'On n'efface pas la base de données
                Worksheets(i).Select
                Range("A1").Select
                On Error Resume Next
                Cells.Find(What:=DonnéeAEffacer, After:=ActiveCell, LookIn:=xlFormulas _
                    , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False).Activate
                If Err = 0 Then     'si <> 0, la donnée n'existe pas
                    ActiveCell.EntireRow.Delete
                End If
                Err.Clear
            End If
        Next i
    End sub
    Tu dis

    A+

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut
    Ce n'est pas tout à fait cela... Mon tableau se trouve 5 ligne plus bas que l'index mais étant donné que je "pilote" tout depuis un formulaire je ne sais pas d'avance quelle ligne je vais effacer. la ligne est sélectionnée depuis mon formulaire en fonction du nom du produit (colonne A) de ma base de données.

    Je ne sais pas si c'est ça que tu avais compris ni si c'est plus clair maintenant ?

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ok, mais cela n'a aucune incidence sur ce que je t'ai passé. Et c'est d'ailleurs pour ça que je t'ai laissé ton Delete qui efface la ligne dans une première feuille. C'est aussi pourquoi, ne connaissant pas le nom de la feuille dans laquelle tu as effacé la donnée, j'ai placé un "on error resume next, une feuille au moins n'ayant plus la donnée cherchée. Si tu adaptes, tu peux éviter ces deux lignes
    Rows(i).Select
    Selection.Delete Shift:=xlUp
    et les remplacer par un appel à ma procédure

    Tu dis

    A+

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut
    Désolé je me forme sur le tas et ce n'est pas toujours simple...

    J'ai essayé de l'adapter à ma procédure et je vois bien que la boucle fonctionne mais le produit est effacé uniquement sur la première feuille (base de données)

    Que faire ?

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    As-tu affecté le nom de la feuille "Base de données" à NomBaseDeDonnée ?
    Si tu fais ça, déjà, la donnée ne devrait pas être effacée sur cette feuille non plus.
    Mets-nous ton code, y compris ce que je t'ai passé. On jètera un oeil...
    Précise-nous le nom de ta feuille "Base de données" pour qu'on puisse te donner quelque chose de propre.

    A+

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut
    Voilà ce que j'ai... C'est vraiment cool merci beaucoup

    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
    Private Sub Supprimer_Click()
    Dim i As Integer
    'Supprimer l'employé séléctionné
        i = lstproduits.ListIndex + 5
            Rows(i).Select
        Selection.Delete Shift:=xlUp
            'NomBaseDeDonnée = "Produits"
             For i = 1 To ActiveWorkbook.Worksheets.Count
            If Worksheets(i).Name <> "Produits" Then   'On n'efface pas la base de données
                Worksheets(i).Select
                Range("A1").Select
                On Error Resume Next
                Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas _
                    , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False).Activate
                If Err = 0 Then     'si <> 0, la donnée n'existe pas
                    ActiveCell.EntireRow.Delete
                End If
                Err.Clear
            End If
        Next i
        Init_produit
        bnouveau = True
        'réaffichage de la liste
        If bnouveau Then Affiche_produits
        End Sub
    [2e ajout des balises "Code" par AlainTech]
    [Merci d'y penser vous-même à l'avenir.]

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bien sûr, tu recherches i... ce n'est pas i que tu dois rechercher, c'est le produits et si j'ai bien compris, le produit est sélectionné dans ta listbox
    Donc
    Mets ça :
    DonnéeAEffacer = lstproduits.List(ListIndex)

    et dans ta recherche (find) remplace i par DonnéeAEffacer (What:=DonnéeAEffacer)

    Si tu ne veux pas effacer la donnée dans la base, enlève simplement
    If Worksheets(i).Name <> "Produits" Then 'On n'efface pas la base de données
    Endif
    Mais tu peux également effacer les deux lignes
    Rows(i).Select
    Selection.Delete Shift:=xlUp
    puisque la boucle fait le travail.

    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
    Private Sub Supprimer_Click() 
    Dim i As Integer, NomBaseDeDonnée,DonnéeAEffacer 
    NomBaseDeDonnée = "Produits" 
    DonnéeAEffacer = lstproduits.List(ListIndex) 
        For i = 1 To ActiveWorkbook.Worksheets.Count 
            If Worksheets(i).Name <> NomBaseDeDonnée Then   'On n'efface pas la base de données sauf si tu le souhaites (auquel cas, ligne à effacer ?)
                Worksheets(i).Select 
                Range("A1").Select 
                On Error Resume Next 
                Cells.Find(What:=DonnéeAEffacer, After:=ActiveCell, LookIn:=xlFormulas _ 
                    , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
                    MatchCase:=False).Activate 
                If Err = 0 Then     'si <> 0, la donnée n'existe pas 
                    ActiveCell.EntireRow.Delete 
                End If 
                Err.Clear 
            End If      'à effacer aussi ????? 
        Next i 
    End sub
    A+

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut
    Désolé de vous embêter encore avec mon petit problème...

    Voici à quoi je suis arrivé:

    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
     
    Private Sub Supprimer_Click()
    Dim i As Integer
    Dim j As Integer
    'Supprimer l'employé séléctionné
        For j = 1 To ActiveWorkbook.Worksheets.Count
                Worksheets(j).Select
                Range("A1").Select
        i = lstproduits.ListIndex + 5
                Rows(i).Select
        Selection.Delete Shift:=xlUp
        On Error Resume Next
        Next j
        Init_produit
        bnouveau = True
        'réaffichage de la liste
        If bnouveau Then Affiche_produits
    End Sub
    Ce code marche bien et il efface les ligne dans toutes les feuilles que je veux. Le seul problème c'est que ca ne fonctionne pas si le produit à effacer dans ma base de données n'est pas sur la même ligne dans les autres feuilles... En d'autre terme, si le produit que je dois effacer dans ma base de données ce trouve sur la ligne 10, le produit qui se trouve en ligne 10 dans les autres feuilles seront effacé (que ce soit le même ou non).
    Comment puis-je remédier à cela ?

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as dû sauter mon dernier post qui t'indique la raison pour laquelle ta procédure ne marche pas.

    Tu dis dans un post précédent que les données à effacer ne sont pas forcément sur la même ligne et tu t'évertues à effacer le même N° de ligne... Bien sûr que ça ne marche pas.
    La ligne que tu veux effacer est bien la ligne contenant le nom du produit ?
    Si oui, tu dois rechercher le produit dans les autres feuilles pour effacer la ligne qui le contient.
    Dans mon code, j'ai supposé que le nom du produit était contenu dans lstproduits.List(ListIndex)
    S'il est ailleurs, affecte son libellé à DonnéeAEffacer et reprends ma procédure. La tienne NE PEUT PAS MARCHER !

    A+

    Edit
    J'ai testé ma procédure, avec le nom du produit dans DonnéeAEffacer, elle fonctionne. Si elle ne fonctionnait pas, je ne te l'aurais pas passée

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 113
    Par défaut
    Désolé j'avais collé exactement ce que tu m'avais donné sans penser modifier le libellé de DonnéeAEffacer... J'y ai remédié et... CA MARCHE !

    Merci encore

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Youpi ! et Ouf !

    A+

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

Discussions similaires

  1. [VBA-Excel,VB6,Fichier texte]enregistrer un classeur excel..
    Par Tarul dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 13h09
  2. [vba-excel] Le temps de fermeture trop court ?
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 10h03
  3. [VBA-Excel]
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2005, 10h17
  4. [VBA EXCEL] Réduire/Agrandir UserForms
    Par Fench dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2003, 16h02
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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