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 :

Aide pour macro de recherche et copie de lignes entière en utilisant un dictionnaire [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Aide pour macro de recherche et copie de lignes entière en utilisant un dictionnaire
    j'ai un code qui me permet de rechercher rapidement la valeur "Obsolète" dans la colonne AC et de récupérer les résultats dans une Listbox mais ce que j'aimerais c'est pouvoir récupérer la ligne entière sachant que le nombre de colonne est variable
    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
    Sub recherchearchive2()
    Dim dico As Object
    Dim vMsn As Variant
    Dim Last_date As Date
    Dim Last_objet As String
    Dim a(), b(), c()
    Dim i As Long, j As Long, n As Long
    Dim lastrow As Long
    Dim tblo As Variant
    Dim tblo2()
    Dim Temp()
    Dim ligne As Long
    Dim Critere1 As String
    UserForm2.ListBox3.Clear
    Application.ScreenUpdating = False
    DoEvents
    rechercheobsolete
    '**************statut**********************
    Critere1 = "Obsolète"
     
     
    lastrow = ThisWorkbook.Sheets("Cvtheque").Range("A" & Rows.Count).End(xlUp).Row
    Temp = ThisWorkbook.Sheets("Cvtheque").Range("A1:AC" & lastrow).Value
    Set dico = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Temp, 1)
            If Temp(i, 29) Like Critere1 Then
                If dico.Exists(Temp(i, 1) & " | " & Temp(i, 14)) = False Then
                    'on ajoute dnas le dico l'objet inexistant
                    dico(CStr(Temp(i, 1)) & "|" & CStr(Temp(i, 14))) = CStr(Temp(i, 14)) & "|" & CStr(Temp(i, 15)) & "|" & CStr(Temp(i, 4)) & "|" & CStr(Temp(i, 2)) & "|" & CStr(i)
                End If
            End If
            Next i
     
    'extraction du resultat
     n = dico.Count
    If n > 0 Then
    ReDim c(1 To n, 1 To 5)
    UserForm2.ALarchive.Visible = False
    ElseIf n = 0 Then
    UserForm2.ALarchive.Visible = True
    Exit Sub
    End If
     
      a = dico.Keys
      b = dico.Items
      For j = 1 To n
     
      'c(i, 1) = a(i - 1)
      c(j, 1) = Split(b(j - 1), "|")(0)
      c(j, 2) = Split(b(j - 1), "|")(1)
      c(j, 3) = Split(b(j - 1), "|")(2)
      c(j, 4) = Split(b(j - 1), "|")(3)
      c(j, 5) = Split(b(j - 1), "|")(4)
     
      Next j
      Call tri(c(), 1, LBound(c, 1), UBound(c, 1))
    UserForm2.ListBox3.ColumnCount = 4
     
      UserForm2.ListBox3.List = c
      UserForm2.Repaint
      UserForm2.LBLwait.Visible = False
    Application.ScreenUpdating = True
    End Sub
    j'ai modifié le début du code pour récupérer uniquement les numéros de lignes qui m'intéressent mais après je vois pas comment alimenter mon tableau c parcourant toutes les lignes dont le numéro est dans le dictionnaire. Voici le début du code modif
    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
    Dim dico As Object
    Dim vMsn As Variant
    Dim Last_date As Date
    Dim Last_objet As String
    Dim a(), b(), c As Variant, k&
    Dim i As Long, j As Long, n As Long
    Dim lastrow As Long
    Dim tblo As Variant
    Dim tblo2()
    Dim Temp()
    Dim dercol As Long
    Dim ligne As Long
    Dim Critere1 As String
    UserForm2.ListBox3.Clear
    Application.ScreenUpdating = False
    DoEvents
    rechercheobsolete
    '**************statut**********************
    Critere1 = "Obsolète"
     
     
    lastrow = ThisWorkbook.Sheets("Cvtheque").Range("A" & Rows.Count).End(xlUp).Row
    dercol = ThisWorkbook.Sheets("Cvtheque").Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    ThisWorkbook.Sheets("Cvtheque").Activate
    Temp = ThisWorkbook.Sheets("Cvtheque").Range(Cells(1, 1), Cells(lastrow, dercol)).Value
    Set dico = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Temp, 1)
            If Temp(i, 29) Like Critere1 Then
                If dico.Exists(Temp(i, 1)) = False Then
                    'on ajoute dnas le dico l'objet inexistant
                    dico(CStr(Temp(i, 1)) & "|" & CStr(Temp(i, 14))) = CStr(i)
                End If
            End If
            Next i
    j'avais pensé à faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     n = dico.Count
    If n > 0 Then
    ReDim c(1 To n, 1 To 5)
    UserForm2.ALarchive.Visible = False
    ElseIf n = 0 Then
    UserForm2.ALarchive.Visible = True
    Exit Sub
    End If
    b=dico.items
    for j=1 to n
    c=thisworkbook.sheets("Cvtheque").range(cells(b(j-1),1)cells(b(j-1),dercol)).value
    next j
    mais seule la première ligne apparaît, auriez-vous une idée ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonjour,
    ceci n'est rien que un exemple, à adapter à ton projet.

    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
    Sub test()
     
        Dim arrLstBox(1 To 100, 1 To 50)
        ListBox5.ColumnCount = 50
        Ligne_Listbox = 1
        Set q = Range("AC1:AC" & Cells(Rows.Count, "AC").End(xlUp).Row).Find("Obsolète")
        F = q.Address
     
        Do
     
            arrLstBox(Ligne_Listbox, 1) = q.Value
            arrLstBox(Ligne_Listbox, 2) = q.Offset(0, -1).Value ' colonne AB
            arrLstBox(Ligne_Listbox, 3) = q.Offset(0, -2).Value ' colonne AA
            arrLstBox(Ligne_Listbox, 4) = q.Offset(0, -3).Value ' colonne Z
            arrLstBox(Ligne_Listbox, 5) = q.Offset(0, -4).Value ' colonne Y
            arrLstBox(Ligne_Listbox, 6) = q.Offset(0, 1).Value ' colonne AD
            arrLstBox(Ligne_Listbox, 7) = q.Offset(0, 2).Value ' colonne AE
            arrLstBox(Ligne_Listbox, 8) = q.Offset(0, 3).Value ' colonne AF
            arrLstBox(Ligne_Listbox, 9) = q.Offset(0, 4).Value ' colonne AG
            '..... et on continue
     
            Ligne_Listbox = Ligne_Listbox + 1
            Set q = Range("C9:C" & Cells(Rows.Count, "C").End(xlUp).Row).FindNext(q)
     
        Loop While Not q Is Nothing And q.Address <> F
     
        ListBox5.List = arrLstBox()
     
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    bonjour gnain et merci pour ta réponse
    elle aurait été parfaite si je connaissait le nombre de colonnes et de lignes mais le nombre de colonnes et de lignes peuvent varier.
    il faudrait que j'arrive à alimenter un tableau mais dynamique du genre Dim arrLstBox() par le nombre de lignes entières trouvées. tu crois que c'est possible ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Voir
    ReDim pour redimensionné le tableau à volonté

  5. #5
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    il faudrait donc que je fasse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    redim arrlistbox (1 to q.row, 1 to dercol)
    dans la boucle do où dercol représente la dernière colonne non vide. C'est çà ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonjour,
    comme cela

    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
     
        Dim arrLstBox()
        ListBox5.ColumnCount = 50
        Ligne_Listbox = 1
        Set q = Range("AC9:AC" & Cells(Rows.Count, "AC").End(xlUp).Row).Find("Obsolète")
        F = q.Address
        Do
     
            Ligne_Listbox = Ligne_Listbox + 1
            Set q = Range("AC9:AC" & Cells(Rows.Count, "AC").End(xlUp).Row).FindNext(q)
            ReDim arrLstBox(1 To Ligne_Listbox, 1 To dercol)
        Loop While Not q Is Nothing And q.Address <> F
     
        Ligne_Listbox = 1
     
        Do
     
            arrLstBox(Ligne_Listbox, 1) = q.Value
            arrLstBox(Ligne_Listbox, 2) = q.Offset(0, -1).Value ' colonne AB
            arrLstBox(Ligne_Listbox, 3) = q.Offset(0, -2).Value ' colonne AA
            arrLstBox(Ligne_Listbox, 4) = q.Offset(0, -3).Value ' colonne Z
            arrLstBox(Ligne_Listbox, 5) = q.Offset(0, -4).Value ' colonne Y
            arrLstBox(Ligne_Listbox, 6) = q.Offset(0, 1).Value ' colonne AD
            arrLstBox(Ligne_Listbox, 7) = q.Offset(0, 2).Value ' colonne AE
            arrLstBox(Ligne_Listbox, 8) = q.Offset(0, 3).Value ' colonne AF
            arrLstBox(Ligne_Listbox, 9) = q.Offset(0, 4).Value ' colonne AG
            '.....ainsi de suite
     
            Ligne_Listbox = Ligne_Listbox + 1
            Set q = Range("AC9:AC" & Cells(Rows.Count, "AC").End(xlUp).Row).FindNext(q)
     
        Loop While Not q Is Nothing And q.Address <> F
     
        ListBox5.List = arrLstBox()

  7. #7
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    j'ai testé la macro mais elle reste trop lente par rapport à ma macro de départ. Je risque facilement de dépasser les 20000 lignes voilà pourquoi je suis obliger de passer par un dictionnaire...

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut



    Bonjour,

    voir la propriété CurrentRegion.

    Les fonctionnalités d'Excel sont rapides comme par exemple un filtre ou un filtre avancé



    __________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    merci d'essayer de m'aider Marc-L et Gnain mais je crois que ma demande a besoin de précision
    - Le fichier est destiné à être partagé donc je ne peux pas utiliser d'autofilter ni de filtre avancé
    - ce que je cherche à faire :
    . recherche le plus rapidement possible toutes les lignes dont la cellules en colonne "AC" contient "Obsolète"
    . La première colonne contient des codes uniques donc je pourrais l'utiliser pour indexer le tableau avec un dictionnaire
    . le gros problème c'est comment récupérer les lignes entières dans une variable tableau qui répondent à mon critère de recherche ?
    .de plus le fichier va contenir plus de 20000 lignes donc je ne peux également utiliser la méthode find...
    . après j'arriverais à me débrouiller pour présenter le résultat dans une listbox nommée listbox3

  10. #10
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Citation Envoyé par magicsismic Voir le message
    j'ai testé la macro mais elle reste trop lente par rapport à ma macro de départ. Je risque facilement de dépasser les 20000 lignes voilà pourquoi je suis obliger de passer par un dictionnaire...
    Je suis curieux,
    c'est comment trop lente par rapport à ta macro de départ ?
    je précise que ta macro de départ n'est pas terminé alors, selon moi, on ne peut comparer.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    je parle de celle-ci qui met environ 6 secondes pour 20000 lignes :
    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
    Sub recherchearchive2()
    Dim dico As Object
    Dim vMsn As Variant
    Dim Last_date As Date
    Dim Last_objet As String
    Dim a(), b(), c()
    Dim i As Long, j As Long, n As Long
    Dim lastrow As Long
    Dim tblo As Variant
    Dim tblo2()
    Dim Temp()
    Dim ligne As Long
    Dim Critere1 As String
    UserForm2.ListBox3.Clear
    Application.ScreenUpdating = False
    DoEvents
    rechercheobsolete
    '**************statut**********************
    Critere1 = "Obsolète"
     
     
    lastrow = ThisWorkbook.Sheets("Cvtheque").Range("A" & Rows.Count).End(xlUp).Row
    Temp = ThisWorkbook.Sheets("Cvtheque").Range("A1:AC" & lastrow).Value
    Set dico = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Temp, 1)
            If Temp(i, 29) Like Critere1 Then
                If dico.Exists(Temp(i, 1) & " | " & Temp(i, 14)) = False Then
                    'on ajoute dnas le dico l'objet inexistant
                    dico(CStr(Temp(i, 1)) & "|" & CStr(Temp(i, 14))) = CStr(Temp(i, 14)) & "|" & CStr(Temp(i, 15)) & "|" & CStr(Temp(i, 4)) & "|" & CStr(Temp(i, 2)) & "|" & CStr(i)
                End If
            End If
            Next i
     
    'extraction du resultat
     n = dico.Count
    If n > 0 Then
    ReDim c(1 To n, 1 To 5)
    UserForm2.ALarchive.Visible = False
    ElseIf n = 0 Then
    UserForm2.ALarchive.Visible = True
    Exit Sub
    End If
     
      a = dico.Keys
      b = dico.Items
      For j = 1 To n
     
      'c(i, 1) = a(i - 1)
      c(j, 1) = Split(b(j - 1), "|")(0)
      c(j, 2) = Split(b(j - 1), "|")(1)
      c(j, 3) = Split(b(j - 1), "|")(2)
      c(j, 4) = Split(b(j - 1), "|")(3)
      c(j, 5) = Split(b(j - 1), "|")(4)
     
      Next j
      Call tri(c(), 1, LBound(c, 1), UBound(c, 1))
    UserForm2.ListBox3.ColumnCount = 4
     
      UserForm2.ListBox3.List = c
      UserForm2.Repaint
      UserForm2.LBLwait.Visible = False
    Application.ScreenUpdating = True
    End Sub
    Cette macro est pas mal mais elle ne permet que de récupérer un nombre défini de colonnes alors que je souhaiterai récupérer la lignes entière avec toutes les colonnes. l'idée serait de plus avoir les split mais de récupérer les lignes entière dont le numéro est enregistré dans le dico d'où ma modification

    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
    Dim dico As Object
    Dim vMsn As Variant
    Dim Last_date As Date
    Dim Last_objet As String
    Dim a(), b(), c As Variant, k&
    Dim i As Long, j As Long, n As Long
    Dim lastrow As Long
    Dim tblo As Variant
    Dim tblo2()
    Dim Temp()
    Dim dercol As Long
    Dim ligne As Long
    Dim Critere1 As String
    UserForm2.ListBox3.Clear
    Application.ScreenUpdating = False
    DoEvents
    rechercheobsolete
    '**************statut**********************
    Critere1 = "Obsolète"
     
     
    lastrow = ThisWorkbook.Sheets("Cvtheque").Range("A" & Rows.Count).End(xlUp).Row
    dercol = ThisWorkbook.Sheets("Cvtheque").Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    ThisWorkbook.Sheets("Cvtheque").Activate
    Temp = ThisWorkbook.Sheets("Cvtheque").Range(Cells(1, 1), Cells(lastrow, dercol)).Value
    Set dico = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Temp, 1)
            If Temp(i, 29) Like Critere1 Then
                If dico.Exists(Temp(i, 1)) = False Then
                    'on ajoute dnas le dico l'objet inexistant
                    dico(CStr(Temp(i, 1)) & "|" & CStr(Temp(i, 14))) = CStr(i)
                End If
            End If
            Next i
    mais pour la suite je sèche j'ai tenté le code suivant mais çà ne marche pas (incompatibilité de type) :
    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
    n = dico.Count
    If n > 0 Then
    UserForm2.ALarchive.Visible = False
    ElseIf n = 0 Then
    UserForm2.ALarchive.Visible = True
    Exit Sub
    End If
     
      a = dico.Keys
      b = dico.Items
      Debug.Print b(2)
    For j = 1 To n
        If Temp(b(j), 29) = "Obsolète" Then
            c = c + 1
            ReDim Preserve tablo(c) 'cas N° 3
            tablo(c) = Application.Index(Temp, j)
        End If
        Next j
      'Call tri(c(), 1, LBound(c, 1), UBound(c, 1))
    UserForm2.ListBox3.ColumnCount = dercol
     
      UserForm2.ListBox3.List = c
      UserForm2.Repaint
      UserForm2.LBLwait.Visible = False
    Application.ScreenUpdating = True

  12. #12
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    excuse moi de te contredire mais je vient tout juste d'essayé la macro que je t'ai donné
    précédemment sur environ 20000 lignes, avec le mot Obsolète sur 1000 lignes dispersées aléatoirement dans les 20000.
    et le résultat s'est affiché dans la listebox en un temps instantané.

    je trouve cela très rapide ..... J'aimerais bien essayé sur ton fichier.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    merci Gnain pour ton aide
    voici donc un fichier exemple. J'ai enlevé toutes les données confidentielles et j'ai laissé les différentes macro que j'ai essayer
    testcvtheque.xlsm

  14. #14
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Citation Envoyé par magicsismic Voir le message
    - Le fichier est destiné à être partagé donc je ne peux pas utiliser d'autofilter ni de filtre avancé
    Dommage car le filtre avancé est le plus rapide, capable de traiter des milliers de lignes de plusieurs colonnes en un instant,
    sans boucle ni dictionnaire et en moins de dix lignes de code !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  15. #15
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    Peut-être comme ça :

    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
    Public Sub Macro1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim I As Integer 'déclare la variable I (Incrément de ligne)
    Dim J As Integer 'déclare la variable J (incrément de colonne)
    Dim K As Integer 'déclare la variable K (incrément de colonne)
    Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
     
    Set O = Sheets("Cvtheque") 'définit l'onglet O
    TC = O.Range("A1").CurrentRegion 'définit le tableau de cellule TC
    J = 1 'initialise la variable J
    For I = 2 To UBound(TC, 2) 'boucle 1 : sur toutes les lignes I du tableau de cellule TC (en partant de la seconde)
        If TC(I, 29) = "Obsolète" Then 'condition si la valeur en ligne I colonne 29 (=> colonne AC) de TC contient "Obsolète"
            'redimensionn le tableau de lignes TL (autant de lignes que TC a de colonnes, J colonnes)
            ReDim Preserve TL(1 To UBound(TC, 2), 1 To J)
            For K = 1 To UBound(TC, 2) 'boucles 2 : sur toutes les colonnes K de TC
                TL(K, J) = TC(I, K) 'renvoie dans la ligne K de TL la valeur de la colonne K de TC (transposition)
            Next K 'prochaine colonne de la boucle 2
            J = J + 1 'incrémente J (ajoute une colonne au tableau TL)
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 1
    If J = 1 Then Exit Sub 'si J=1 (=> aucune occurrence "Obsolète" trouvée), sort de la procédure
    If J = 2 Then 'consition : si J=2 (=> une seule occurrence trouvée)
        ReDim Preserve TL(UBound(TL, 1), 2) 'redimensionne TL pour pouvoir transposer
    Else 'sinon
          UserForm2.ListBox3.List = Application.Transpose(TL) 'alimente la ListBox3 de l'UserForm2 du tableau TL transposé
    End If 'fin de la condition
    End Sub
    Remarque : ayant perdu mon sablier, je ne cours plus après les records de vitesse...
    À plus,

    Thauthème

    Je suis Charlie

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Citation Envoyé par magicsismic Voir le message
    .de plus le fichier va contenir plus de 20000 lignes donc je ne peux également utiliser la méthode find..
    Ah bon, pouquoi ? Là encore c'est se priver d'une méthode bien plus rapide que des boucles !

    Comme il n'est pas question de regroupement ni de doublon, à quoi sert le dictionnaire ?‼
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #17
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    ta macro est super rapide mais ne me renvoie pas toute les lignes. C'est peut être dû au fait qu'il y a des cellules vides dans la colonne 29

  18. #18
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    Si c'est à moi que s'adresse ton dernier post, je te répondrais que : Non car le code ne s'occupe que des cellules de la colonne 29 contenant le mot Obsolète. Comme je n'ai utilisé ni UCase ni Like, il se peut que certaines lignes soient passées à la trappe. Essaie comme ça :

    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
    Public Sub Macro1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim I As Integer 'déclare la variable I (Incrément de ligne)
    Dim J As Integer 'déclare la variable J (incrément de colonne)
    Dim K As Integer 'déclare la variable K (incrément de colonne)
    Dim TL() As Variant 'déclare la variable TL (Tableau de Lignes)
     
    Set O = Sheets("Cvtheque") 'définit l'onglet O
    TC = O.Range("A1").CurrentRegion 'définit le tableau de cellule TC
    J = 1 'initialise la variable J
    For I = 2 To UBound(TC, 2) 'boucle 1 : sur toutes les lignes I du tableau de cellule TC (en partant de la seconde)
        If UCase(TC(I, 29)) Like "OBSOL*" = True Then 'condition si la valeur en ligne I colonne 29 (=> colonne AC) de TC contient "Obsolète"
            'redimensionn le tableau de lignes TL (autant de lignes que TC a de colonnes, J colonnes)
            ReDim Preserve TL(1 To UBound(TC, 2), 1 To J)
            For K = 1 To UBound(TC, 2) 'boucles 2 : sur toutes les colonnes K de TC
                TL(K, J) = TC(I, K) 'renvoie dans la ligne K de TL la valeur de la colonne K de TC (transposition)
            Next K 'prochaine colonne de la boucle 2
            J = J + 1 'incrémente J (ajoute une colonne au tableau TL)
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 1
    If J = 1 Then Exit Sub 'si J=1 (=> aucune occurrence "Obsolète" trouvée), sort de la procédure
    If J = 2 Then 'consition : si J=2 (=> une seule occurrence trouvée)
        ReDim Preserve TL(UBound(TL, 1), 2) 'redimensionne TL pour pouvoir transposer
    Else 'sinon
          UserForm2.ListBox3.List = Application.Transpose(TL) 'alimente la ListBox3 de l'UserForm2 du tableau TL transposé
    End If 'fin de la condition
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

  19. #19
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut


    Je ne comprends pas non plus l'utilité d'un UserForm !

    S'il est question d'archiver / supprimer des lignes avec une codification "obsolète",
    via un filtre ou un filtre avancé c'est instantané en à peine dix lignes de code …

    Là c'est limite une usine à gaz !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  20. #20
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    en fait j'ai trouvé pourquoi toutes les lignes étaient pas prises en compte l'erreur vient de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For I = 2 To UBound(TC, 2)
    vu qu'on boucle sur les lignes je l'ai remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For I = 2 To UBound(TC, 1)
    çà me renvoie la première colonne avec tous les codes correspondant qui correspondent à ma recherche. Maintenant, il me reste plus qu'à récupérer les lignes de ces codes et les recopier dans l'onglet "archives"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Aide pour Macro VBA copie lignes entre 2 classeur
    Par magicsismic dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/03/2015, 21h13
  2. Recherche aide pour macro
    Par piierock dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/01/2015, 21h30
  3. besoin d'aide pour macro test de cellule et copie selon cas
    Par tibofo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/11/2008, 00h15
  4. [VBA-E][débutant]aide pour macro sous excel
    Par julyBL dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/06/2006, 22h42
  5. [VBA-E] aide pour macro sur excel
    Par letoulouzin31 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 24/05/2006, 11h29

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