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 :

Créer une formule "Concaténer" en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut Créer une formule "Concaténer" en VBA
    Bonjour à la communauté.
    Voilà, je cherche une solution à ce que je pense être un ".formula".
    J'ai des centaines de lignes (colonne A), et je cherche à concaténer les colonnes de 27 (AA) ) à 36 (AJ). Mais en faisant une formule, dans le style "Concatener" de la même ligne...
    Mais je dois recréer cette formule pour beaucoup de ligne (j'ai misé sur 5000).
    J'avais donc pensé à un .Formula, mais je ne m'en sors pas...
    J'ai donc écris ce petit bout de code (que je vais devoir agrandir à l'avenir, car c'est du Excel<>AutoCAD).
    Voici ce bout de 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
    Sub ReinitExcel()
        NomFeuille = ActiveSheet.name
        For L = 2 To 5000
            SelectFormule = ""
            For Col = 27 To 36
                SelectFormule = SelectFormule & "A" & Trim(Str(Col)) & ";"
            Next
            SelectFormule = Left(Trim(SelectFormule), Len(Trim(SelectFormule)) - 1)
            SelectFormule = "=Concatener(" & SelectFormule & ")"
            Selection.Formula = SelectFormule
            Debug.Print "SelectFormule fini = " & SelectFormule
            ActiveWorkbook.Worksheets(NomFeuille).Range(SelectFormule).Select.Formula = SelectFormule
        Next
    End Su
    Si quelqu'un a une réponse, une astuce, une explication... Je suis preneur...
    Bien à toi, la communauté.
    Denis...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    En XL 365, tu as la fonction JOINDRE.TEXTE qui permet de passer une plage... Soit en Excel, soit en VBA (TEXTJOIN)...

    Nom : 2021-12-16_061345.png
Affichages : 377
Taille : 3,4 Ko


    Mon billet sur le sujet: https://www.developpez.net/forums/bl...embler-textes/
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Salut Pierre, et merci pour ton aide.
    Mais j'aimerais que seules les lignes concernées contienne une formule, car je dois gérer le reste ailleurs.
    Je n'ai donc pas le choix, car tout ce que je fais, c'est en VBA, et je dois continuer de le faire.
    Déjà parce-que j'aime ça , et pour que l'utilisateur ne se prenne pas la tête avec les formules...
    J'ai donc fais évoluer mon code, qui donne ceci maintenant :
    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
        NomFeuille = ActiveSheet.name
        Lign = 2
        Do While Sheets(NomFeuille).Cells(Lign, 27).Value <> ""
            SelectFormule = ""
            'Je créé la liste des cellules à concatener selon la 'Lign' en cours
            SelectFormule = "=Concatenate(" & "AA" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AB" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AC" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AD" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AE" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AF" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AG" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AH" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AI" & Trim(Str(Lign)) & ";"
            SelectFormule = SelectFormule & "AJ" & Trim(Str(Lign)) & ")"
            Debug.Print "SelectFormule : " & SelectFormule
            Worksheets(NomFeuille).Range("A" & Trim(Str(Lign))).Formula = SelectFormule
            Lign = Lign + 1
        Loop
        Selection.Columns.AutoFit
    Pour aider, voici le résultat du Debug.Print :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SelectFormule : =Concatenate(AA2;AB2;AC2;AD2;AE2;AF2;AG2;AH2;AI2;AJ2)
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  4. #4
    Membre éprouvé Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 569
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,

    Un truc dans ce goût là ?

    Pour le cas où tu n'aies pas 365.

    Il te suffit de compléter la valeur des variables de ligne et colonne de début et fin (qui pourraient être automatisées par la suite).

    Le premier code te met les valeurs de la concaténation en A. Cela t'évite à passer par les formules mais en contre partie tu perds la partie de remise à jour si les cellules concaténées changent de valeur.
    Les autres codes te mettent les formules de 2 façons (juste une question de syntaxe entre les 2 formules).

    A toi de voir réellement ton besoin entre les 3 codes (qui sont encore optimisables).

    Teste et dis nous.
    Fichiers attachés Fichiers attachés
    C'est toujours sympa de savoir si on vous a aidé ou non. Pensez-y

    N'hésitez pas à marquer le sujet comme résolu le cas échéant.

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Tu tagues 365, donc pourquoi ne pas utiliser =TEXTJOIN("",true,aa2:aj2) comme tu utilises CONCATENATE()?


    Si tu veux pouvoir fonctionner sans 365, ta solution me semble pertinente. Perso, je travaillerais plutôt avec une boucle, mais chacun sa manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim r As Range
      Dim Formule As String
     
      Formule = "concatenate("
      For Each r In Range("aa2:aj2")
        Formule = Formule & r.Address & ";"
      Next
      Formule = Left(Formule, Len(Formule) - 1) & ")"
      Debug.Print Formule
     
    End Sub
    Résultat du Debug.print: concatenate($AA$2;$AB$2;$AC$2;$AD$2;$AE$2;$AF$2;$AG$2;$AH$2;$AI$2;$AJ$2)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonjour à tous, et merci pour votre aide.
    Voilà, j'ai réécris mon code en faisant un mixte de vos propositions. J'ai donc ça maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim r As Range
      Dim Formule As String
      Lign = 2
      Formule = "=concatener("
      For Each r In Range("aa" & Lign & ":aj" & Lign)
        Formule = Formule & r.Address & ";"
      Next
      Formule = Left(Formule, Len(Formule) - 1) & ")"
      Debug.Print Formule
      ActiveSheet.Range("A" & Lign).Formula = Formule
    End Sub
    Mais la ligne "ActiveSheet.Range("A" & Lign).Formula = Formule" (ligne 11), ça plante avec une erreur "1004".
    Je ne comprend pas pourquoi, lorsque je colle dans la cellule le résultat du Debug.Print, il n'y a pas de problème...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  7. #7
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Salut,

    soit tu passes par Formula et tu dois passer par les noms de fonctions en anglais + le caractère "," pour séparer tes paramètres,
    soit tu passes par FormulaLocal et tu peux passer par les noms de fonctions en francais + le caractère ";" pour séparer tes paramètres.

    Bien sûr, si tes utilisateurs travaillent avec des versions autres que francaises, ca ne fonctionnera pas.
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  8. #8
    Membre éprouvé Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 569
    Points : 1 006
    Points
    1 006
    Par défaut
    Jean-Philippe a raison.
    Pour .......formula
    - utilise la "," et pas les ";" dans ta construction de formule en VBA
    - et utilise les noms de fonction en anglais.

    Ce qui te donnera
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =Concatenate(AA2,AB2,AC2,AD2,AE2,AF2,AG2,AH2,AI2,AJ2)

    Évidement si tu copies colles telle quelle cette formule dans une cellule tu auras une erreur mais quand c'est VBA qui l'insère c'est bon.

    À l'inverse pour ...... formulalocal il faut
    Code formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =Concatener(AA2;AB2;AC2;AD2;AE2;AF2;AG2;AH2;AI2;AJ2)
    C'est toujours sympa de savoir si on vous a aidé ou non. Pensez-y

    N'hésitez pas à marquer le sujet comme résolu le cas échéant.

  9. #9
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonjour Alex, et merci pour ton aide.
    Mais j'ai essayé "=concatenate", et j'ai le même résultat...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 266
    Points
    34 266
    Par défaut
    Peut on avoir ta dernière version de code stp ?

    J'aimerai voir comment tu as interprété mes suggestions...
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  11. #11
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonsoir Jean-Philippe,
    Mon code est celui que j'ai posté cet après-midi...
    Il ne fonctionne ni avec les ";" ni avec les ","...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  12. #12
    Membre éprouvé Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 569
    Points : 1 006
    Points
    1 006
    Par défaut
    À 18h44 ?

    Normal. Il te manque les guillemets sur ta ligne d'insertion de formule.

    Exemples simples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").formula="=1+1"
    Donc pour toi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").formula="=concatenete(AA2,AB2)"
    Pour insérer des guillemets dans une chaîne de texte tu as là aussi au moins 2 façons. Sinon par défaut Excel considère que tu clos ta chaîne.
    Soit en cumulant les guillemets "" (en gros le premier sert d'échappement) pour prendre en compte le second dans la chaîne.
    Soit en passant par son code chr(34) --> de mémoire c'est 34 mais à vérifier.

    Tu n'as pas mis les guillemets autour de ta formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("A" & Lign).Formula = chr(34) & Formule & chr(34)
    Ensuite tu autofill vers le bas pour décaler ta formule si tu n'as pas fais de boucle.
    C'est toujours sympa de savoir si on vous a aidé ou non. Pensez-y

    N'hésitez pas à marquer le sujet comme résolu le cas échéant.

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par DenisHen Voir le message
    Bonsoir Jean-Philippe,
    Mon code est celui que j'ai posté cet après-midi...
    Il ne fonctionne ni avec les ";" ni avec les ","...
    tu n'as bien appliqué les conseils.

    Si tu utilises "Concatener", tu dois utiliser FormulaLocal et le ;. Si tu utilises formula, tu dois utiliser Concatenate et la , ...

    Dans le code que tu as donné, tu fais un mix des deux et donc, ça plante.


    Je rappelle que, sauf exercice scolaire ou besoin de travailler avec plusieurs versions d'Excel, ton tag [XL-365] te permet d'utiliser TEXTJOIN(AA2:AJ2) (avec Formula) sans devoir faire de boucle et te préoccuper du séparateur. Pourquoi faire simple lorsque l'on peut faire compliqué?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonjour à tous et merci pour votre aide.
    Voici la dernière version de mon code, qui fonctionne maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim r As Range
      Dim Formule As String
      Lign = 2
      Formule = "=concatener("
      For Each r In Range("aa" & Lign & ":aj" & Lign)
        Formule = Formule & r.Address & ";"
      Next
      Formule = Left(Formule, Len(Formule) - 1) & ")"
      Debug.Print Formule
      ActiveSheet.Range("A" & Lign).FormulaLocal = Formule
    End Sub
    Et merci encore à vous, j'ai appris beaucoup...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'utilisation de la propriété FormulaLocal est toujours dangereux

    Voici une autre approche avec Join et l'esperluette (&) comme opérateur de concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub t()
      Const FirstColumn As Integer = 27 ' Colonne AA
      Const LastColumn As Integer = 36  ' Colonne AJ
      Dim Nc As Integer
      Dim c As Integer
      '
      Nc = LastColumn - FirstColumn ' Nombre de colonnes à traiter
      ReDim ad(Nc)
      For c = 0 To Nc
        ad(c) = Cells(2, c + FirstColumn).Address
      Next
      ' Ecriture de la formule
      ActiveSheet.Range("A" & 2).Formula = "=" & Join(ad, "&")
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonjour Philippe et merci pour ta réponse...
    Mais elle est bien au-delà de mon niveau, même si j'admire ton code, je ne pourrais jamais, si j'en ai besoin, le réécrire pour mes besoin...
    Mais je reste bouche bé devant une telle logique appliquée...
    Merci encore...
    Denis...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  17. #17
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour Dénis,
    Mais elle est bien au-delà de mon niveau, même si j'admire ton code, je ne pourrais jamais, si j'en ai besoin, le réécrire pour mes besoin...
    Cette procédure n'a rien d'exceptionnelle.
    C'est une simple boucle qui rempli une variable tableau et la fonction Join renvoie une chaîne de caractères qui est le résultat de la jonction des éléments du tableau séparés par un caractère, ici l'esperluette (&)

    Exemple
    Le code ci-dessous renverra la chaine "Janvier;Février;Mars".
    L'utilisant d'une variable tableau et la fonction Join me semble bien plus simple que de construire la chaîne en utilisant Left, Len et &
    Ceci étant dit, comme l'a écrit Pierre, que je salue, et étant donné que tu as tagué 365, il serait plus simple d'utiliser TEXTJOIN basé sur le même principe mais il est possible que le code doit être utilisé sur plusieurs versions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub t()
      Dim Trimestre As Variant
      Trimestre = Array("Janvier", "Février", "Mars")
      Debug.Print Join(Trimestre, ";")
    End Sub

    A lire éventuellement Utiliser les variables tableaux en VBA Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  18. #18
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Bonjour Philippe.
    Je ne sais pas si tu connais le Lisp (moi, un peu), mais Join est un peu le MapCar du Lisp...
    Du coup, je comprends mieux...
    Il va falloir que je me renseigne aussi sur le Const, que je ne connais absolument pas...
    Encore merci...
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

  19. #19
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 765
    Points : 28 623
    Points
    28 623
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il va falloir que je me renseigne aussi sur le Const, que je ne connais absolument pas...
    Const est la déclaration d'une constante suivi de sa valeur
    Au lieu de Const FirstColumn As Integer = 27, j'aurais pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim FirstColumn As Integer
    FirstColumn = 27
    A lire éventuellement Utiliser les variables en VBA Excel et tout particulièrement le chapitre VI. Les instructions Const et Enum
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  20. #20
    Membre habitué Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 384
    Points : 198
    Points
    198
    Par défaut
    Donc, Const est un Integer ?
    Windows 7, 8 et 10 / Debian / RaspBian / AutoCAD 3D 2023

    Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
    Davantage d'avantages, avantagent davantage (Bobby Lapointe).
    La connaissance s'accroît quand on la partage (Socrate).
    Tant va la cruche à l'eau que l'habit n'amasse pas mousse. (Moi)
    Un clavier azerty en vaut deux (developpez.net).

Discussions similaires

  1. [XL-2010] Appliquer une formule de concaténation en VBA
    Par JemaCodeur dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 25/09/2020, 09h47
  2. Créer une formule intégrant des " par VBA
    Par Bieffe dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/03/2019, 13h55
  3. [XL-2013] Insérer/Créer une formule en vba dans une cellule
    Par Shiyatsu dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/10/2015, 13h46
  4. Créer une variable de session dos en vba
    Par batama dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2008, 11h30
  5. Créer une formule (Formula R1C1)
    Par manouk dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/10/2008, 11h36

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