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 :

Comment faire une liste automatiquement [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 24
    Par défaut Comment faire une liste automatiquement
    Bonjour,
    Dans la feuille 1 j'entre des noms de fournisseurs et dans la feuille 2 j'aimerais que ma liste de fournisseurs s'insère automatiquement. Il doit vérifier si le nom que j'entre existe déjà, s'il n'existe pas il doit s'inscrire dans la feuille 2.

    Merci infiniment pour votre aide et bonne année à tous!
    Aimey

  2. #2
    Membre éprouvé Avatar de Klin89
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 119
    Par défaut
    Bonsoir le forum et bonne année à tous

    Une évenementielle à placer dans le module de la Feuille 1:
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim a, e
        If Intersect(Target, Columns("a")) Is Nothing Then Exit Sub
        a = Range("a1").CurrentRegion
        If Not IsArray(a) Then
            Sheets(2).Columns("a").ClearContents
            Sheets(2).Range("a1").Value = a
            Exit Sub
        End If
        With CreateObject("Scripting.Dictionary")
            For Each e In a
                If Not IsEmpty(e) And Not .exists(e) Then .Add e, Nothing
            Next
            Sheets(2).Columns("a").ClearContents
            Sheets(2).Range("a1").Resize(.Count).Value = Application.Transpose(.keys)
        End With
    End Sub
    klin89

  3. #3
    Membre chevronné
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 214
    Par défaut
    Une variante (très inspirée) qui ajoute les nouveaux fournisseurs saisis dans la feuil1 sans supprimer ceux déjà existants en feuil2

    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
    'Cocher la référence Microsoft Scripting runtime
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim a, e
        Dim dicoFrs As Scripting.Dictionary
        Set dicoFrs = New Scripting.Dictionary
        If Intersect(Target, Columns("a")) Is Nothing Then Exit Sub
        a = Range("a1").CurrentRegion
        If Not IsArray(a) Then
            Sheets(2).Columns("a").ClearContents
            Sheets(2).Range("a1").Value = a
            Exit Sub
        End If
     
        For Each e In a
            If Not IsEmpty(e) And Not dicoFrs.exists(e) Then dicoFrs.Add e, Nothing
        Next
        With Sheets(Feuil2.Name)
            a = .Range("a1").CurrentRegion
            For Each e In a
                If Not IsEmpty(e) And Not dicoFrs.exists(e) Then dicoFrs.Add e, Nothing
            Next e
        End With
        Sheets(2).Columns("a").ClearContents
        Sheets(2).Range("a1").Resize(dicoFrs.Count).Value = Application.Transpose(dicoFrs.keys)
     
    End Sub
    Mais c'est le même principe

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut Variante sans dico -> Mac
    Bonjour,

    je vous propose une autre variante plus optimisée (pas de boucle sur un objet Excel -> ce qui rend inutile l'utilisation du dico en terme de performance ) de plus il n'y a pas besoin de références supplémentaire et donc compatible sur mac.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Option Explicit
     
    Private Const DestinationSheetName = "Feuil2"
    Private Const ColumnToCare = 1
     
    Private lShtDest As Worksheet
    Private lIsSet As Boolean
    Private lItems() As String, lNbItems As Long
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Target.Column <> ColumnToCare Then Exit Sub
     
        If Not lIsSet Then Call Init
     
        If IsNull(Target.Text) Then
            Dim VarTargets() As Variant
            VarTargets = Target.Value2
            Dim i As Long
            For i = 1 To UBound(VarTargets)
                Call CheckItem(CStr(VarTargets(i, 1)))
            Next
        Else
            Call CheckItem(CStr(Target.Text))
        End If
     
    End Sub
     
    Private Sub CheckItem(StrTarget As String)
     
        Dim i As Long
     
        For i = 0 To lNbItems
            If lItems(i) = StrTarget Then Exit For
        Next
     
        If i > lNbItems Then
            lNbItems = lNbItems + 1
            ReDim Preserve lItems(lNbItems)
            lItems(lNbItems) = StrTarget
            lShtDest.Cells(lNbItems + 2, 1) = StrTarget
        End If
     
    End Sub
     
    Private Sub Init()
     
        lIsSet = True
     
        Set lShtDest = ThisWorkbook.Sheets(DestinationSheetName)
     
        Dim NbLignes As Long
        NbLignes = lShtDest.Cells(lShtDest.Rows.Count, 1).End(xlUp).Row
     
        'La première ligne est réservée pour le nom de la colonne (ex : Fournisseurs)
        lNbItems = NbLignes - 3
     
        If lNbItems = -2 Then
            lShtDest.Cells(1, 1) = "Fournisseurs"
            lNbItems = -1
        End If
     
        If lNbItems <> -1 Then ReDim lItems(lNbItems)
     
        Dim VarTab() As Variant
        ReDim VarTab(1 To NbLignes, 0)
        If NbLignes <> 1 Then VarTab = lShtDest.Range(lShtDest.Cells(1, 1), lShtDest.Cells(NbLignes, 1))
     
        Dim i As Long
        For i = 0 To lNbItems
            lItems(i) = VarTab(i + 2, 1)
        Next
     
        Erase VarTab
     
    End Sub
    Evidemment cela est "optimisable" si l'on désire que cela fonctionne pour plusieurs feuilles en même temps.
    Pour 1 000 000 fournisseurs, il faut 0.9 s d'initialisation, puis 0.04 s pour trouver/ajouter un élément.
    Fonctionne également pour une plage copier/collée. -> Edit

    @+

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

Discussions similaires

  1. Comment faire une liste de checkbox "groupée" ?
    Par Tchupacabra dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2008, 10h58
  2. Réponses: 14
    Dernier message: 09/04/2008, 14h45
  3. [Vb.net] Comment faire une liste à partir d'une string
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 1
    Dernier message: 25/10/2006, 14h15
  4. Comment faire une liste d'évènements ?
    Par WebPac dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h36
  5. Comment faire une liste d'image de choix ?
    Par poussinphp dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/10/2005, 00h34

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