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 Modifier la valeur d'une cellule avec conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Août 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Août 2022
    Messages : 6
    Par défaut VBA Modifier la valeur d'une cellule avec conditions
    Bonjour la communauté,

    Je viens de nouveau solliciter votre aide. Je vais essayer d'être précis car j'ai du mal à tourner ma demande.

    En effet, j'ai une macro qui trouve deux noms de colonnes (via boucle) et filtre ces deux colonnes selon ma demande. Ex : Filtre sur ma colonne nommée "GAM" (avec un critère) et filtre sur ma colonne nommée "Attribution" (avec un critère)

    Ces deux filtres renvoient ou pas à des lignes. Si c'est le cas, j'aimerais modifier le nom des lignes retrouvées avec les deux filtres par une autre valeur. Si par contre ça ne retrouve aucune ligne, je ne veux rien modifier. Ex : Colonne "GAM" filtré sur Codé + colonne "Attribution" filtré sur Sans frais. Imaginons dans cette exemple, j'ai 4 lignes, ce que je souhaiterais, c'est modifier les lignes de la colonne "Attribution" (actuellement avec la valeur Sans frais) par "Absent"

    Ma première difficulté est que je ne sais pas si ça me renvoie des lignes ou pas ? La seconde est de réussir à modifier toutes les valeurs des lignes qui seraient retrouvées.

    J'ai bien essayé quelques choses mais je n'y arrive pas. En gros après mes boucles et filtres, j'ai commencé par sélectionner le nom de colonne nommé "attribution" par le code ci dessous (enregistreur automatique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                  Cells.Find(What:="Attribution", After:=ActiveCell, LookIn:=xlFormulas, _
                  LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                  MatchCase:=False, SearchFormat:=False).Activate
    Ensuite je voulais sélectionner la première ligne retrouvé avec les filtres en dessous avec le code ActiveCell.Offset(1, 0).Select, sauf que comme il y a des filtres, il ne m'a pas sélectionné la première ligne trouvée avec les filtres mais une lignes filtrés. Du coup, je n'ai pas réussi à arriver à ma troisième étape qui était de faire un IF...

    Sauriez vous comment réussir à faire ce que je souhaite ? Y a t il des solutions plus simple que celles que j'ai essayé ?

    Auriez vous d'autres idées

    Merci pour aide une nouvelle fois

    Cordialement

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut
    Bonjour,
    Si ton tableau n'est pas trop "gros" ou que la rapidité d'exécution n'est pas un problème, tu peux très simplement faire des if imbriqués dans un boucle.

    Par exemple :
    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
    Sub RemplaceDuTexte()
        Dim Col1 As Integer, Col2 As Integer, i As Integer
     
        Col1 = NumDeColonneParNom("GAM")
        Col2 = NumDeColonneParNom("Attribution")
     
        If Col1 * Col2 = 0 Then
            MsgBox "Les collone n'ont pas été trouvée"
            Exit Sub
        End If
     
        For i = 2 To Cells(2, 1).End(xlDown).Row
            If Cells(i, Col1).Value = "Codé" And Cells(i, Col2).Value = "Sans frais" Then
                Cells(i, Col2).Value = "Absent"
            End If
        Next i
     
    End Sub
    Function NumDeColonneParNom(intitul As String) As Integer
        NumDeColonneParNom = 0
        Dim i As Integer
        For i = 1 To Cells(1, 1).End(xlToRight).Column
            If Cells(1, i).Value = intitul Then NumDeColonneParNom = i
        Next i
    End Function

  3. #3
    Membre à l'essai
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Août 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Août 2022
    Messages : 6
    Par défaut
    Salut Limace_hurlante,

    Un graaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaannnnnnnnnnnnnnnnnnnnnnnnnnnnd merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii pour ton aide.
    J'avais oublié de préciser que ma colonne A était vide, mais en modifiant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             For i = 2 To Cells(2, 2).End(xlDown).Row
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             For i = 1 To Cells(1, 2).End(xlToRight).Column
    ça a fonctionné quand il retrouve des données à modifier. Par contre, s'il n'y en a pas il me met le message d'erreur d'exécution '6': Dépassement de capacité

    Saurais tu comment régulariser cette erreur ?

    Merci ++++++++++++++++++++++

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Bonjour,

    Une autre façon de faire sur un tableau structuré:
    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
    Option Explicit
     
    Sub Code_sans_frais()
        Dim iGAM As Long, iATT As Long, rngData As Range
        Set rngData = Range("Tableau1[#All]")
        iGAM = Application.WorksheetFunction.Match("GAM", rngData.Rows(1), 0)
        iATT = Application.WorksheetFunction.Match("Attribution", rngData.Rows(1), 0)
        With rngData
            .AutoFilter Field:=iGAM, Criteria1:="Codé"
            .AutoFilter Field:=iATT, Criteria1:="Sans frais"
        End With
        Set rngData = Range("Tableau1[#All]").SpecialCells(xlCellTypeVisible)
        Set rngData = Intersect(Range("Tableau1[Attribution]"), rngData)
        If rngData Is Nothing Then
            Range("Tableau1").Cells(1, 1).Select
        Else
            rngData.Replace What:="Sans frais", Replacement:="Absent", LookAt:=xlWhole
            rngData.Cells(1, 1).Select
        End If
        Range("Tableau1[#All]").AutoFilter
        Set rngData = Nothing
    End Sub
    Cordialemant.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre à l'essai
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Août 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Août 2022
    Messages : 6
    Par défaut
    Salut EricDng,

    Un très grand merci pour ta solution également. J'ai transposé la version sans nommer le tableau sur mon fichier, mais j'ai une erreur d'exécution 9 L'indice n'appartient pas à la sélection sur le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rngData = ActiveSheet.ListObjects(1).Range
    Mais non je n'ai pas un tableau structuré du coup c'est probablement pour celà que ça ne fonctionne pas ?

    Merci pour ton aide,

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut
    LA solution d'EricDgn est clairement plus efficace que la mienne si tu as un tableau structuré.

    Néanmoins si tu veux utiliser ma méthode, la voici avec la correction :

    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
    Sub RemplaceDuTexte()
        Dim Col1 As Integer, Col2 As Integer, i As Integer
     
        Col1 = NumDeColonneParNom("GAM")
        Col2 = NumDeColonneParNom("Attribution")
     
        If Col1 * Col2 = 0 Then
            MsgBox "Les collone n'ont pas été trouvée"
            Exit Sub
        End If
     
        For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
            If Cells(i, Col1).Value = "Codé" And Cells(i, Col2).Value = "Sans frais" Then
                Cells(i, Col2).Value = "Absent"
            End If
        Next i
     
    End Sub
    Function NumDeColonneParNom(intitul As String) As Integer
        NumDeColonneParNom = 0
        Dim i As Integer
        For i = 1 To Cells(1, 1).End(xlToRight).Column
            If Cells(1, i).Value = intitul Then NumDeColonneParNom = i
        Next i
    End Function

  7. #7
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Citation Envoyé par Aaaaarh Voir le message
    Set rngData = ActiveSheet.ListObjects(1).Range
    C'est sans doute que les données ne sont pas dans un "tableau structuré" (onglet Insertion, bouton Tableau) mais dans une plage normale. Un tutoriel sur les tableaux structurés.

    Cordialement.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Août 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Août 2022
    Messages : 6
    Par défaut
    Re bonjour Limace_hurlante,

    J'ai essayé ton nouveau code, mais je ne sais pas trop pourquoi il me met le Msgbox même quand il y a des lignes et il ne les transforme pas.
    J'ai transformé ton code ainsi et ça a l'air de bien fonctionner, mais il ne me présente jamais le Msgbox même quand il n'y a pas de ligne, est ce normal ? Dans l'absolu ça ne me dérange pas du tout, mais je voudrais juste être certain de ne pas avoir une mauvaise surprise un jour :-)

    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
    Dim Col1 As Integer, Col2 As Integer, i As Long
        Col1 = NumDeColonneParNom("GAM")
        Col2 = NumDeColonneParNom("Attribution")
        If Col1 * Col2 = 0 Then
            MsgBox "Les collone n'ont pas été trouvée"
            Exit Sub
        End If
    '
            For i = 2 To Cells(2, 2).End(xlDown).Row
            If Cells(i, Col1).Value = "Codé" And Cells(i, Col2).Value = "Sans frais" Then
                Cells(i, Col2).Value = "Absent"
            End If
        Next i
    End Sub
    Function NumDeColonneParNom(intitul As String) As Integer
        NumDeColonneParNom = 0
        Dim i As Integer
        For i = 1 To Cells(1, 2).End(xlToRight).Column
            If Cells(1, i).Value = intitul Then NumDeColonneParNom = i
        Next i
    End Function
    Encore merci

  9. #9
    Membre à l'essai
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Août 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Août 2022
    Messages : 6
    Par défaut
    Re bonjour EricDgn EricDgn,

    Un grand merci pour ce tuto que je vais ire avec attention. En effet, je n'ai pas un tableau structuré, je vais voir si cette solution peut me convenir car dans ma macro il va chercher la première colonne vide pour y créer une nouvelle colonne et je ne crois pas qu'elle en ferait partie. En tout cas merci pour tout

    Cordialement

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur amateur VBA Excel
    Inscrit en
    Janvier 2013
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur amateur VBA Excel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 69
    Par défaut
    Citation Envoyé par Aaaaarh Voir le message
    mais il ne me présente jamais le Msgbox même quand il n'y a pas de ligne, est ce normal ?
    Oui c'est normal, le msgbox ne doit être vu que si les colonnes sont absente, pas les lignes :-)
    si tu le souhaite pour "controler" ce qui est fait, tu peux rajouter ça à ton code :
    au debut de la sub :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim compte as integer
    compte = 0
    puis dans le if tu rajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Cells(i, Col2).Value = "Absent"
    compte = compte +1
    et tu finit ton code juste avant le end sub par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox "Le programme a effectué " & compte & " remplacements."

  11. #11
    Membre à l'essai
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Août 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire

    Informations forums :
    Inscription : Août 2022
    Messages : 6
    Par défaut
    Salut Limace_hurlante,

    Super merciiiiiiiiiii vraiment 😊

    Au plaisir

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/07/2020, 21h53
  2. [XL-365] Problème VBA: Lire la valeur d'une cellule avec un bouton
    Par New_VBA_User dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/08/2019, 15h22
  3. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  4. Réponses: 15
    Dernier message: 26/01/2015, 19h37
  5. Réponses: 6
    Dernier message: 14/09/2012, 20h29

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