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 :

Macro vba Cellule= "x" si cellule de la même ligne = "toto" (action sur 500 lignes)


Sujet :

Macros et VBA Excel

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Bonjour le forum, Joe le.vrai

    Si tu travailles sur une plage filtrée, il faut donc travailler sur les cellules visibles uniquement, en passant par SpecialCells(XlCellTypeVisible) sur la plage d'écriture
    J'utilise ton code qui jusqu'à présent fonctionnait bien, même avec les filtres

    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
     
    Sub toto()
    Dim Formule As String, ListeVal(), i As Long
        ListeVal = Array("TOTO", "TINTIN", "TATA")
        Formule = "=IF(OR("
     
        For i = LBound(ListeVal) To UBound(ListeVal)
            Formule = Formule & "RC[-8]=""" & ListeVal(i) & ""","
        Next i
     
        Formule = Mid(Formule, 1, Len(Formule) - 1) & "),""þ"",""o"")"
     
        With ThisWorkbook.Worksheets("Feuil1").Cells(2, 13).Resize(ThisWorkbook.Worksheets("Feuil1").UsedRange.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
            .Value = [Formule]
            '.Value = .Value
            .Font.Name = "Wingdings"
        End With
    End Sub
    Depuis aujourd'hui, je recontre un problème lorsque les colonnes sont filtrés, pourtant il y a bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .SpecialCells(xlCellTypeVisible)
    .Value = [Formule]
    Je comprend pas car cela fonctionnai avant grrr

    Serais-tu de quoi cela peu venir stp?

  2. #22
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Pas sur d'avoir compris mais je vais me baser sur que j'ai proposé, tu pourras adapter en fonction des propositions de Joe

    en haut de module (avant les Sub)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim ListFiltre()
    Dim FiltreCourant As String, f, VFiltre As Boolean
    le code que je proposais, modifié avec les lignes en rouge
    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
    Private Sub CommandButton1_Click()
    Dim a, b As String, d As String, e As String, c As Integer
    Dim Dcel As Range, x As Long, Tb, TbI()
    Dim ReturnFiltre As AutoFilter
    a = Array("TOTO", "TINTIN", "TATA")
    d = "þ"
    e = "o"
    VFiltre = True
    If ActiveSheet.AutoFilterMode Then
      Filtre
    Else
      VFiltre = False
    End If
    ActiveSheet.AutoFilterMode = False
    Set Dcel = Range("E" & Rows.Count).End(xlUp)
    Tb = Range("E2", Dcel(1, 9))
    ReDim TbI(1 To UBound(Tb, 1))
    For x = 1 To UBound(Tb, 1)
      TbI(x) = e
      For c = 0 To UBound(a)
        If UCase(Tb(x, 1)) = a(c) Then
          TbI(x) = d
        End If
      Next c
    Next x
    Range("M2", Dcel(1, 9)).ClearContents
    Range("M2").Resize(UBound(TbI)) = Application.Transpose(TbI)
    If VFiltre = True Then
      RestaureFiltre
    End If
    End Sub
    End Sub
    2 codes ci-dessous pris sur l'aide
    un code en dessous pour enregistrer le filtre
    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
    Sub Filtre()
    Set Ws = ActiveSheet
    With Ws.AutoFilter
        FiltreCourant = .Range.Address
        With .Filters
            ReDim ListFiltre(1 To .Count, 1 To 3)
            For f = 1 To .Count
                With .Item(f)
                    If .On Then
                        ListFiltre(f, 1) = .Criteria1
                        If .Operator Then
                            ListFiltre(f, 2) = .Operator
                            ListFiltre(f, 3) = .Criteria2
                        End If
                    End If
                End With
            Next
        End With
    End With
    Ws.AutoFilterMode = False
    End Sub
    et enfin un code pour le restaurer
    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
    Sub RestaureFiltre()
    Dim col As Integer
    Ws.AutoFilterMode = False
    For col = 1 To UBound(ListFiltre(), 1)
        If Not IsEmpty(ListFiltre(col, 1)) Then
            If ListFiltre(col, 2) Then
                Ws.Range(FiltreCourant).AutoFilter field:=col, _
                    Criteria1:=ListFiltre(col, 1), _
                        Operator:=ListFiltre(col, 2), _
                    Criteria2:=ListFiltre(col, 3)
            Else
                Ws.Range(FiltreCourant).AutoFilter field:=col, _
                    Criteria1:=ListFiltre(col, 1)
            End If
        End If
    Next
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #23
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Ci-joint le fichier qui me pose problème lorsque je filtre sur "TINTIN" dans la colonne N la macro ne fonctionne plus comme elle devrait.
    bug filtre macro.xlsm

    Merci pour ta réponse et tout ton travail je test ça au plus vite.

    Good night!

  4. #24
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour

    à toi d'adapter car j'ai ouvert ton fichier et ça a bien changé, il faudra remettre les procédures au bon endroit

    EDIT : revu le 29 à 11h37

    après avoir revu tes codes de la feuille "COMMANDES", tu les supprimes et colles ceux-ci (j'ai laissé la proposition à Joe.Levrai)
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Dim Ws As Worksheet
    Dim ListFiltre()
    Dim FiltreCourant As String, f, VFiltre As Boolean
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Y As String, N As String
    Y = "þ"
    N = "o"
    If Target.Column = 22 And Target.Count = 1 Then
        Target = IIf(Target = Y, N, Y) 'Police Wingdings
        Cancel = True
        Exit Sub
        End If
    End Sub
    Private Sub UNSELECT_AUTO_Click()
    Dim N As String
    N = "o"
    Range("V3:V500").Value = N
    End Sub
    Private Sub AUTO_SELECT_Click()
    'Start = Timer
    Application.ScreenUpdating = False          'Désctive le rafraîchissement de l'écran
    Application.EnableEvents = False            'Désactivation des procédures événementielles
    Unprotect
    VFiltre = True
    If ActiveSheet.AutoFilterMode Then
      Filtre
    Else
     VFiltre = False
    End If
    Dim Formule As String, ListeVal(), i As Long
        ListeVal = Array("TINTIN", "TOTO", "TATA")
        Formule = "=IF(OR("
     
        For i = LBound(ListeVal) To UBound(ListeVal)
            Formule = Formule & "RC[-8]=""" & ListeVal(i) & ""","
        Next i
     
        Formule = Mid(Formule, 1, Len(Formule) - 1) & "),""þ"",""o"")"
     
        With ThisWorkbook.Worksheets("COMMANDES").Cells(2, 22).Resize(ThisWorkbook.Worksheets("COMMANDES").UsedRange.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
            .Value = [Formule]
            .Value = .Value
            .Font.Name = "Wingdings"
        End With
    If VFiltre = True Then
      RestaureFiltre
    End If
    Protect AllowFiltering:=True
    Application.ScreenUpdating = True          'Désctive le rafraîchissement de l'écran
    Application.EnableEvents = True            'Désactivation des procédures événementielles
    'MsgBox "durée du traitement: " & Timer - Start & " secondes"
    End Sub
    Sub Filtre()
    Set Ws = ActiveSheet
      With Ws.AutoFilter
        FiltreCourant = .Range.Address
        With .Filters
            ReDim ListFiltre(1 To .Count, 1 To 3)
            For f = 1 To .Count
                With .Item(f)
                    If .On Then
                        ListFiltre(f, 1) = .Criteria1
                        If .Operator Then
                            ListFiltre(f, 2) = .Operator
                            ListFiltre(f, 3) = .Criteria2
                        End If
                    End If
                End With
            Next
        End With
      End With
    Ws.AutoFilterMode = False
    End Sub
    Sub RestaureFiltre()
    Dim col As Integer
    Ws.AutoFilterMode = False
    For col = 1 To UBound(ListFiltre(), 1)
        If Not IsEmpty(ListFiltre(col, 1)) Then
            If ListFiltre(col, 2) Then
                Ws.Range(FiltreCourant).AutoFilter field:=col, _
                    Criteria1:=ListFiltre(col, 1), _
                        Operator:=ListFiltre(col, 2), _
                    Criteria2:=ListFiltre(col, 3)
            Else
                Ws.Range(FiltreCourant).AutoFilter field:=col, _
                    Criteria1:=ListFiltre(col, 1)
            End If
        End If
    Next
    End Sub

    ça devrait être bon

    Perso, j'ai travaillé sur ce fichier
    Fichiers attachés Fichiers attachés
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Bonsoir Dom,

    Une fois de plus merci pour ton travail.
    J'ai testé tout tes codes. Ceux concernant les filtres vont mettre utiles pour un autre fichier. Top !
    Sinon je pense que je me suis mal exprimé car je souhaitais que la macro s'applique uniquement sur les lignes visible .
    Exemple si je filtre sur TINTIN (colonne N), la macro s'applique uniquement en sur ligne visible.( donc coche en colonne V que les lignes ou il y a TINTIN (colonne N)).

    Mais pas de souci t'inquiet ça ira comme ça merci encore pour ton aide, ton investissement et ta réactivité.
    C'est vraiment super sympas.

    Grace a toi, tous ceux qui on participé à mes discussions et le forum, j'ai quasiment finalisé mon fichier (je le dois présenter fin de semaine ). Il me reste à travailler encore un peux sur la protection des macros (j'utilise la protection propriété projet VBA), des feuilles et les boutons Mode user Mode admin et de navigation entre les feuilles.
    Les finitions quoi ! J'ai trouver des codes je ne sais pas si se sont les mieux mais ils fonctionnent donc c'est cool !

    Merci pour tous bonne soirée

  6. #26
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici où trouver l'origine quoi qu'il arrive :

    Depuis aujourd'hui, je recontre un problème lorsque les colonnes sont filtrés

    n'aurais-tu pas, par hasard, décidé d'ajouter une ligne d'en-têtes supplémentaire ?
    si tel est le cas, les données commencent donc en ligne 3, et cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With ThisWorkbook.Worksheets("COMMANDES").Cells(2, 22).Resize(ThisWorkbook.Worksheets("COMMANDES").UsedRange.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
    Doit-être retravaillée sur deux points.
    En décomposant la ligne, on obtient les deux modifications :

    - Thisworkbook : Le Classeur

    - .Worksheets("COMMANDES") : La Feuille

    - .Cells(2,22) : La Cellule V2, là où commencent les données

    - Resize(ThisWorkbook.Worksheets("COMMANDES").UsedRange.Rows.Count - 1,1) : on part du début des données, et on descend d'un nombre de lignes égale aux nombres de lignes de la plage active diminué de(des) ligne(s) d'en-têtes

    - .SpecialCells(xlCellTypeVisible) : De cette sélection, on ne retient que les cellules visibles


    Il suffirait de corriger respectivement le 2 en 3 et le 1 en 2 sur les deux parties que j'ai mis en gras

    Mais cette approche t'oblige à ne pas oublier de modifier ce point si tu changes encore la structure.

    Ainsi, il est préférable d'utiliser une variable ou une constante, placée en début de procédure, pour identifier la ligne de début des données, si tu n'as aucun point d'attache fixe pour calculer cela (tu pourrais te baser sur le positionnement de ton bouton auto_click puisqu'il est juste au dessus des données... mais il suffit de changer la position du bouton et c'est fichu)

    Dans le cas de données qui débutent en ligne 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const LIG_DATA as Long = 3
    Et puisqu'on a identifié la ligne de commencement, soyons fous et identifions la colonne d'insertion des formules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const COL_DATA as Long = 22
    Vu où on en est, autant finir !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Const DECALAGE_CELLULE as Long = -8

    Et tu te facilites ainsi la maintenance et l'évolution du 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
    Private Sub AUTO_SELECT_Click()
    Dim i As Long
    Dim Formule As String: Formule = "=IF(OR("
    Dim ListeVal(): ListeVal = Array("TINTIN", "TOTO", "TATA")
     
    Const LIG_DATA As Long = 3           ' numéro de ligne de début des données
    Const COL_DATA As Long = 22          ' colonne où on met la formule
    Const DECALAGE_CELLULE As Long = -8  ' décalage entre la formule et la colonne à analyser
     
        Application.ScreenUpdating = False
        Application.EnableEvents = False
            For i = LBound(ListeVal) To UBound(ListeVal)
                Formule = Formule & "RC[" & DECALAGE_CELLULE & "]=""" & ListeVal(i) & ""","
            Next i
     
            Formule = Mid(Formule, 1, Len(Formule) - 1) & "),""þ"",""o"")"
     
            With ThisWorkbook.Worksheets("COMMANDES")
                With .Cells(LIG_DATA, COL_DATA).Resize(.UsedRange.Rows.Count - LIG_DATA - 1, 1).SpecialCells(xlCellTypeVisible)
                    .Value = [Formule]
                    .Value = .Value
                    .Font.Name = "Wingdings"
                End With
            End With
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End Sub

    Ps : la folie ne m'a pas suffisamment gagné pour passer en constante les deux caractères à écrire, ainsi que la police d'écriture

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Bonjour Joe le.vrai,

    Merci pour ces explication, et oui tu a raison j'avais ajouté une ligne au dessus des filtres ......
    Grrrr j'avais zappé "ce petit détail" .
    Vue que j'ai pas tous compris du code je suis passé à coté ! ce n'était pas si compliqué en faites ..... grrr

    Super merci c'est top je vais tester dans l'aprèm mais je te fait confiance la dessus.

    Une fois plus merci et bonne journée

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Re Joe le.vrai,

    J'ai testé ton code .

    Dans un premier temps j'ai uniquement passé le 2 en 3 et le 1 en 2 puis testé sur le fichier que j'ai joint résultat ok.

    Ensuite je fait un test avec le code version maintenance et évolution projet, ( j'ai remarqué que le UsedRange.Rows.Count - 1 n'était pas changé en 2 je l'ai donc fait ).
    test ok.

    Enfin j'ai fait un dernier test en ajoutant plus de valeur "TINTIN" (une dizaine) dans la colonne N histoire de tester sur une plus grande plage et là le resultat n'est pas bon = #N/A apparait à la 25 ème ligne...
    J'ai essayé de trouver par moi même mais franchement j'en ai aucune idée.
    snif snif

  9. #29
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il n'y a normalement rien à modifier à l'intérieur du code, ce sont les trois Constantes déclarées au début qui contrôlent tout

    UsedRange.Rows.Count - 1 a été remplacé par .UsedRange.Rows.Count - LIG_DATA - 1
    LIG_DATA vaut 3 si tes données commencent en ligne 3 ... ce qui donne par simplification .UsedRange.Rows.Count - 3 - 1 = .UsedRange.Rows.Count - 2

    Peux-tu montrer le code exact que tu as utilisé et qui renvoie #N/A ? Je n'arrive pas à visualiser un contexte où la formule tombe en erreur comme ça ... cette erreur signifiant qu'excel n'arrive pas à trouver l'une des valeurs de la fonction

  10. #30
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    ci-joint le fichierbug filtre macro2.xlsm

  11. #31
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Je pensais avoir correctement expliqué et démontré qu'il n'y a RIEN à changer dans la procédures, ce sont les Constantes qui sont les paramètres à modifier.
    Par précaution, j'ai précisé que les deux caractères à écrire et la police d'écriture étaient les seuls paramètres résiduels qu'il fallait, si besoin, changer dans la procédure


    Or, tu as modifié cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With .Cells(LIG_DATA, COL_DATA).Resize(.UsedRange.Rows.Count - LIG_DATA - 2, 1).SpecialCells(xlCellTypeVisible)
    tu reviens donc au problème précédent, quand tu as ajouté une ligne d'en-tête sans modifier la procédure.

    il faut laisser le chiffre 1 quoi qu'il arrive, et modifier la constante LIG_DATA quand la ligne de début des données change (chose qui n'est pas censée arriver tous les jours ... voir jamais)

  12. #32
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    OK, j'ai bien compris ton explication, je pense pourtant avoir fait le test sans toucher a ton code n'ayant pas le bon résultat j'ai en effet essayé cette modif.
    Je re contrôle ça de suite.

  13. #33
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Je suis désolé Joe mais il y a tout de même le problème "N/A"
    avec le code :
    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
    Private Sub AUTO_SELECT_Click()
    Dim i As Long
    Dim Formule As String: Formule = "=IF(OR("
    Dim ListeVal(): ListeVal = Array("TINTIN", "TOTO", "TATA")
     
    Const LIG_DATA As Long = 3           ' numéro de ligne de début des données
    Const COL_DATA As Long = 22          ' colonne où on met la formule
    Const DECALAGE_CELLULE As Long = -8  ' décalage entre la formule et la colonne à analyser
     
        Application.ScreenUpdating = False
        Application.EnableEvents = False
            For i = LBound(ListeVal) To UBound(ListeVal)
                Formule = Formule & "RC[" & DECALAGE_CELLULE & "]=""" & ListeVal(i) & ""","
            Next i
     
            Formule = Mid(Formule, 1, Len(Formule) - 1) & "),""þ"",""o"")"
     
            With ThisWorkbook.Worksheets("COMMANDES")
                With .Cells(LIG_DATA, COL_DATA).Resize(.UsedRange.Rows.Count - LIG_DATA - 1, 1).SpecialCells(xlCellTypeVisible)
                    .Value = [Formule]
                    .Value = .Value
                    .Font.Name = "Wingdings"
                End With
            End With
        Application.ScreenUpdating = True
        Application.EnableEvents = True
    End Sub
    bug filtre macro2 (1).xlsm

    comme tu peux le constater dans ce fichier les données commence en ligne 3 et j'ai laisser ton code tel quel

  14. #34
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Je dois effectivement reconnaître qu'il y a un petit problème quand tu filtres les TINTIN.

    L'erreur ne se produit pas si ont laisse la formule (et qu'on utilise pas la ligne .Value = .Value)

    c'est assez étrange, quand je regarde les formules écrites sur la feuille de calcul, elles sont correctes.

    je ne trouve pas la raison exacte, mais ça pourrait être un mélange entre la plage qu'on utilise (exclusion des cellules masquées) et la plage réelle de la feuille (avec les cellules masquées) ... et d'autres paramètres peut être


    Je n'ai pas de solution ou d'explication plus précise là
    J'ai bidouillé plusieurs modifications sans succès (y compris en passant par la propriété FormulaR1C1)
    La seule situation stable que j'ai trouvé c'est de laisser les formules ... pas terrible.

    D'ailleurs, si tu filtres sur "TINTIN" et "Non géré", tu verras que ça part aussi en sucette, mais avec un autre comportement

  15. #35
    Nouveau membre du Club
    Homme Profil pro
    Concepteur CAO
    Inscrit en
    Décembre 2014
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Concepteur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2014
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Bon, ok j'ai testé tes remarques et je confirme...
    Dans tous les cas je te remercie pour ton code et tes recherches.
    Ton dernier code version maintenance et l'évolution du projet est très agréable à utiliser et tes explication sont très claire.
    A l'avenir j'essaierai d'avoir des messages plus structurés pour mieux me faire comprendre

    Je présente mon fichier demain ! Je pense que pour le moment il est plus sage de ne pas utiliser les filtres pour éviter tout risque d'erreur. (même si la version avec formule a l'air de fonctionner)
    C'est dommage mais c'est déjà très bien.

    Merci encore et si jamais tu as du nouveau fait moi signe

    Passe une bonne soirée

  16. #36
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Citation Envoyé par giragu03 Voir le message

    Sans passer par une macro, est-ce que la formule suivante ne te conviendrait pas : =SI(OU(E2="TOTO";E2="TINTIN";E2="TATA");"þ";"o") ?
    je me suis inspiré de ta formule!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    ThisWorkbook.Sheets("Feuil1").Range("M2:M500").FormulaR1C1 = "=IF(OR(RC[-8]=""TOTO"",RC[-8]=""TINTIN"",RC[-8]=""TATA""),""þ"",""o"")"
    ThisWorkbook.Sheets("Feuil1").Range("M2:M500").Value = ThisWorkbook.Sheets("Feuil1").Range("M2:M500").Value
    End Sub

  17. #37
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ah non tu triches ! Et le filtre appliqué sur sa feuille tu en fais quoi ? Et s'il a 50 valeurs différentes ?



    je suis ok pour te laisser la main, mais faut résoudre là où j'ai séché

  18. #38
    Invité
    Invité(e)
    Par défaut
    Bonjour le forum et bonjour Joe,
    et la est-ce que je triche?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(SIERREUR( TROUVE(("©" & A1 & "©";"©TINTIN©©TOTO©©TATA©";1);0)=0;""; TROUVE("©" & A1 & "©";"©TINTIN©©TOTO©©TATA©";1))
    je concatène mon array et je fais un Instr! le "©" c'est pour évite des ambiguïté lié à la concaténation!
    Dernière modification par AlainTech ; 05/07/2016 à 07h44. Motif: Suppression de la citation inutile

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [XL-2010] Macro VBA - Titre du classeur correspond à une cellule
    Par paulclv dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/07/2015, 19h08
  2. Macro VBA pour mettre colonne en ligne avec cellule fusionnée
    Par dany13 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/01/2008, 07h09
  3. Requete SQL via macro vba changeant le format de la cellule
    Par laville dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/08/2007, 11h26
  4. [VBA] Macro qui envoie une formule dans une cellule
    Par Okoss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2007, 23h32
  5. [VBA-E] Lancement d'une macro en fonction du contenu d'une cellule
    Par Zak Blayde dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2007, 16h13

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