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 :

Remplacer nom de la colonne dans une plage de formules


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Remplacer nom de la colonne dans une plage de formules
    Bonjour

    Imaginons que je doive remplacer "BI" par "BE" dans une plage de cellules, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Range("O9:AE34").Select
    Selection.Replace What:=BI, Replacement:=BE, LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    La plage de cellules contient des formules de type "='Nom de la feuille'!BI8" (nom de la feuille qui varie, nom colonne fixe, numéro ligne varie).

    Dans mon cas, je sais pas d'avance quelle est la colonne (ici "BI") mais je sais par quelle colonne je dois la remplacer. Je me demande si il y a une astuce ou si je suis dans une impasse (ce qui m'obligerait dans mon programme à réécrire toutes les formules avec les noms de feuilles qui vont avec...)

    Merci pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Salut à toi,

    Je ne suis pas certain de bien comprendre ta demande... Mais il est très simple de ne pas spécifier directement la feuille mais plutôt de passer par une variable objet de type feuille excel ou plage de cellules Excel (ou n'importe quel type d'objet...)

    C'est d'ailleurs comme ça qu'il est très préférable de travailler !

    Si tu veux que le nom de la feuille soit variable, alors tu peux, par exemple, procéder ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Feuille As Worksheet
    Dim Plage As Range
     
    Set Feuille = Sheets(1) ' ou Sheets("Feuil1") ou tu peux boucler avec For Each Feuille In ThisWorkbook.Sheets
    Set Plage = Feuille.Range("O9:AE34") 'encore Feuille.Range(Cells(9,"O"),Cells(34,"AE")) ou autre...
     
    'à partir de là, si tu veux inclure le nom de ta Feuille dans une formule, tu peux mettre :
    Feuille.Range("A1").Formula = "='" & Feuille.Name & "'!BI8"
     
    'Pour revenir à ton exemple (j'ai rajouté les guillemets à la première ligne):
    Plage.Replace What:="BI", Replacement:="BE", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

    Bon, je ne pense pas répondre à ton besoin, mais ça peut te donner quelques éléments pour avancer un peu... À mon avis, explique mieux ton problème car j'ai beau le relire, je ne comprends pas vraiment ce que tu as et ce que tu désires obtenir

    Quentin

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Après, un autre petit truc que je bidouille mais y'a peut-être mieux :

    Si tu veux récupérer une colonne à partir d'une cellule sur VBA, tu peux faire :
    Colonne = Range("A1").Column
    MsgBox Colonne

    Mais tu vas récupérer l'index de la colonne, donc dans le cas ci-dessus "1", ce qui n'est pas intéressant dans ton cas car tu as besoin de la valeur en lettres, donc tu peux utiliser ce genre de bidouillage :

    L'adresse de la cellule t'est donnée par VBA sous forme de : $COLONNE$LIGNE ex : Range("A1").Address te donnera "$A$1"
    Ce que je fais à partir de là, est que je décompose cette adresse en utilisant comme séparateur "$" et je récupère la 2ème valeur (la première valant "", la seconde "A" et la troisième "1") comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Décomposition = Split(Range("DI18").Address,"$")
    'à partir de là, Décomposition a 3 valeurs : Décomposition(0) = "",Décomposition(1)="DI",Décomposition(2)="18"
    'donc : 
    Colonne = Décomposition(1)
    MsgBox "La colonne choisie est : " & Colonne
    En espérant que ça t'aide un peu... Si quelqu'un a mieux à proposer, je suis preneur

  4. #4
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Bonjour à tous,

    Voilà une fonction pour remplacer la colonne dans une formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function remplacer_nom_colonne(formule As String, colonne As String) As String
        Dim s1$, s2$, s3$, s4$, i&
        s1 = Mid(formule, 1, InStr(formule, "!"))
        s2 = Mid(formule, InStr(formule, "!") + 1)
        For i = 1 To Len(s2)
            If IsNumeric(Mid(s2, i, 1)) Then
                s4 = s4 & Mid(s2, i, 1)
            Else
                s3 = s3 & Mid(s2, i, 1)
            End If
        Next
        remplacer_nom_colonne = s1 & colonne & s4
    End Function
    Je vous l'accorde, elle peut surement être mieux écrite que ça.

    Ensuite voilà une proc pour changer toutes les formules d'un range à l'aide de la fonction remplacer_nom_colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
        Dim rg As Range, t(), i&, j&
        Set rg = Sheets("Feuil1").[A1:A30]
     
        t() = rg.Formula
        For i = 1 To rg.Rows.Count
            For j = 1 To rg.Columns.Count
                t(i, j) = remplacer_nom_colonne((t(i, j)), "B")
            Next j
        Next i
     
        rg.Formula = t()
    End Sub
    Ici le range [A1:A30] de la feuille 1.

    Je te laisse adapter à ton cas.
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Non tu ne réponds pas à la question (en même temps elle est très tordue) mais merci pour ton aide !

    Autre question qui peut m'aider (pas besoin de lire mon premier message pour y répondre) : comment avoir le numéro de la colonne à partir du nom de la cellule ? Il doit y avoir une fonction (ex : "B1" => la fonction donne la colonne 2).

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ah merci vous avez répondu plus vite que moi.

  7. #7
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Je ne réponds pas à ton problème avec ce post#4 ?
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bon ça marche apparemment Mille fois merci

    Par contre certaines cellules de la plage ne contiennent pas de formule, du coup ça écrit le nom de la colonne dedans. Faudrait voir si je peux mettre un If.

  9. #9
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    C'était une base de réflexion.
    C'est parfois très utile de mettre un Range dans un tableau, de travailler sur le tableau et ensuite remettre le tableau dans le Range.
    Idem avec Range.Formula

    Mon exemple est très succin, mais l'idée est là, tu dois juste modifier la fonction. Si le paramètre formule est vide alors la fonction doit renvoyer vide.
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Problème résolu.

    Je vais essayer d'y penser la prochaine fois que je travaille avec un Range. Mais il y a aussi la fonction qui est astucieuse (séparer ce qu'il y a avant et après "!" et intercaler le nom de la colonne, ce que je cherchais).

  11. #11
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par antonysansh Voir le message
    Bonjour à tous,

    Voilà une fonction pour remplacer la colonne dans une formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function remplacer_nom_colonne(formule As String, colonne As String) As String
        Dim s1$, s2$, s3$, s4$, i&
        s1 = Mid(formule, 1, InStr(formule, "!"))
        s2 = Mid(formule, InStr(formule, "!") + 1)
        For i = 1 To Len(s2)
            If IsNumeric(Mid(s2, i, 1)) Then
                s4 = s4 & Mid(s2, i, 1)
            Else
                s3 = s3 & Mid(s2, i, 1)
            End If
        Next
        remplacer_nom_colonne = s1 & colonne & s4
    End Function
    Je vous l'accorde, elle peut surement être mieux écrite que ça.
    Voilà une fonction un peu plus "propre" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function changer_colonne(formule As String, colonne As String) As String
        If formule = "" Then Exit Function
            Dim t() As String, c1&, c2&
                t() = Split(formule, "!")
                c1 = Range(t(1)).Column
                c2 = Range(colonne & "1").Column
            changer_colonne = t(0) & "!" & Range(t(1)).Offset(0, c2 - c1).Address(0, 0, xlA1)
    End Function
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

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

Discussions similaires

  1. Nom de la colonne dans une fonction
    Par CAMIC dans le forum Développement
    Réponses: 4
    Dernier message: 21/05/2012, 17h09
  2. diverses colonnes dans une plage
    Par flamel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/02/2010, 19h26
  3. [XL-2003] Trouver le min et le max d'une colonne dans une plage filtrée
    Par Gwladys dans le forum Excel
    Réponses: 2
    Dernier message: 06/04/2009, 17h37
  4. Comment récupérer le nom de la cellule dans une plage
    Par DubDub dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2009, 12h26
  5. Noms de colonne dans une colonne
    Par Digirom dans le forum Langage SQL
    Réponses: 14
    Dernier message: 23/04/2004, 11h51

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