Concatener des cellules d'une autre feuille dans une seule cellule

Bonjour à tous,

J'ai un problème pour récupérer des données d'une colonne dans une cellule d'une autre feuille.

Voici mon code (qui ne fonctionne pas) :

    Dim Debut As Date
    Dim Fin As Date
    Debut = ActiveSheet.Range("B623")
    Fin = Debut + 6

    If Sheets("Quotidien").Range("A:A") >= Debut And Sheets("Quotidien").Range("A:A") <= Fin Then
    Sheets("Hebdo").Activate
    Range("I632").Select
    ActiveCell.FormulaR1C1 = _
        "=TEXTJOIN(CHAR(10),TRUE,Quotidien!C7:C7)"

    End If

Tout fonctionne jusqu'à mon If ...

En fait, je souhaite récupérer les cellules uniquement si la date de la colonne A de ma feuille "Quotidien" est comprise entre Debut et Fin.

C'est une concaténation de résultats quotidien dans un onglet hebdo. Et je souhaite donc ne prendre les cellules que de la semaine en cours (entre Debut et Fin)

Merci de votre aide.

Bonjour,

Vous avez une erreur car votre if compare un Tableau (la liste de vos jours dans la colonne A), à une valeur unique. Ca a l'air evident pour nous mais pour lui ce sont deux choses complètement différentes, comme de lui demander ce qui serait le plus grand entre une maison et un poème.

Il faut donc lui indiquer "comment faire".

Dans votre cas ca va etre, "comment lire les données du tableau". Pour cela une solution courante c'est la boucle :

Pour chaque ligne de ma colonne A, regarde la date et vérifie si elle est entre dèbut et fin.

Ainsi votre code prendrait plutot la forme :

Sub test()
    Dim Debut As Date
    Dim Fin As Date
    Debut = ActiveSheet.Range("B623").Value2
    Fin = Debut + 6

    Dim MaColonne As Range
    Set MaColonne = ThisWorkbook.Worksheets("Quotidien").Range("A1")
    Set MaColonne = Range(MaColonne, MaColonne.End(xlDown))

    Dim Ligne As Range
    For Each Ligne In MaColonne.Rows
        If Ligne.Value2 >= Debut And Ligne.Value2 <= Fin Then
            ' faire des choses
        End If
    Next Ligne

End Sub

Cependant je me permet d'ajouter que je ne comprends pas trop ce que vous voulez faire, un fichier joint et des explications seraient bienvenus. En effet si votre vérification marche, elle n'a absolument aucun lien avec le code que vous voulez exécuter, a savoir définir une formule déjà prete dans une autre cellule...

Quel lien entre I632, =TEXTJOIN(CHAR(10),TRUE,Quotidien!C7:C7), et la colonne A ?

17cri-2024-essai.xlsm (269.19 Ko)

En fait je cherche à récupérer les cellules de la colonnes H de l'onglet Quotidien dans une seule cellule de la feuille Hebdo mais uniquement pour les dates (colonne A de l'onglet quotidien) comprises entre Debut et Fin.

La première partie du code fonctionne mais effectivement il me copie toute la colonne dans la cellule et pas seulement les valeurs entre les 2 dates.

Il faudrait que je récupère l'adresse de la première ligne qui remplit la condition et de la dernière ligne pour borner ma concatenation.

Ci-joint une proposition.

Pour utiliser l'UDF, simplement entrer dans une cellule =CommentairesApresDate(B623), vous pouvez adapter B623 à n'importe quelle cellule contenant une date bien entendu.

17cri-2024-essai.xlsm (264.17 Ko)

Le code contenu est indiqué ci-après :

Public Function CommentairesApresDate(DateInitiale As Range)
    Dim Debut As Date
    Dim Fin As Date
    Debut = CDate(DateInitiale.Value2)
    Fin = Debut + 6

    Dim MaColonne As Range
    Set MaColonne = ThisWorkbook.Worksheets("Quotidien").Range("A1")
    Set MaColonne = Range(MaColonne, MaColonne.End(xlDown))

    Dim coms As String

    Dim Ligne As Range
    For Each Ligne In MaColonne.Rows
        If Ligne.Value2 >= Debut And Ligne.Value2 <= Fin Then
            coms = coms & Chr(10) & Ligne.Offset(0, 7).Value2
        End If
    Next Ligne

    CommentairesApresDate = coms
End Function

Merci.

C'est effectivement beaucoup plus puissant que ce que je prévoyait mais malheureusement ça ne fonctionne pas.

Je ne comprends pas une ligne du code :

    Debut = CDate(DateInitiale.Value2)

Et j'ai une erreur en résultat #NOM?

Pouvez-vous partager le fichier que je comprenne l'erreur #nom, normalement si vous utilisez le nom de la fonction elle devrait etre trouvée... Je vous avais mis un exemple dans la case i619 de la feuille Hebdo.

CDate permet de convertir la valeur contenue dans la cellule qui est un numéro (par ex. 45687) en date (2024/06/12). Fonctions de conversion de types (VBA) | Microsoft Learn

Ce n'est pas "vraiment" nécessaire mais puisque vous avez défini vos variables en tant que date il est préférable de le faire afin d'avoir un code "robuste" (qui ne crée pas d'erreurs imprévues).

19cri-2024-essai.xlsm (269.86 Ko)

Vous avez une erreur de nom car vous n'avez pas téléchargé le fichier que je vous ai joint, Excel ne vas pas venir lire le code sur ce forum...

Téléchargez le fichier que je vous ai joint, ou ajoutez le code que je vous ai écrit dans un de vos modules et rafraichissez vos formules.

Il manquait un s. Erreur de ma part.

Cela fonctionne mais partiellement. La concaténation s'arrête avant la fin

J'ai modifié mon fichier et ajouté la formule. C'est pour cela que je vous ai renvoyé le fichier directement.

Merci de l'aide, j'ai l'impression d'être un boulet qui ne comprends rien désolé.

Non non pas de soucis, j'ai regardé rapidement je n'avais pas vu la faute de frappe.

Hum votre problème est intéressant, il semble que le texte soit limité à une longueur de 255 caractères, d'ou votre problème... je vais regarder si je peux corriger cela.

Essayez avec ceci et si vous etes certain qu'il vous manque des caractères alors c'est que les dates de début et de fin ne sont pas bonne, revoir si c'est bien 6 que vous devez ajouter.

Public Function CommentairesApresDate(DateInitiale As Range) As String
    Dim Debut As Date
    Dim Fin As Date
    Debut = CDate(DateInitiale.Value2)
    Fin = DateAdd("d", 6, Debut)

    Dim MaColonne As Range
    Set MaColonne = ThisWorkbook.Worksheets("Quotidien").Range("A1")
    Set MaColonne = Range(MaColonne, MaColonne.End(xlDown))

    Dim coms As String

    Dim Ligne As Range
    For Each Ligne In MaColonne.Rows
        If Ligne.Value2 >= Debut And Ligne.Value2 <= Fin Then
            coms = coms & Chr(10) & Ligne.Offset(0, 7).Value2
        End If
    Next Ligne

    CommentairesApresDate = coms
End Function

Merci mais je crois avoir compris.

En fait lorsque je coche mettre à la ligne automatiquement, il n'y a pas assez de hauteur pour tout voir vu qu'il saute une ligne à chaque cellule vide.

Il faudrait ignorer les cellules vide de texte (ce qui marchait bien avec jointexte) mais je ne sais pas trop comment faire.

Bonjour,

Remplacez

If Ligne.Value2 >= Debut And Ligne.Value2 <= Fin Then

Par

If Ligne.Value2 >= Debut And Ligne.Value2 <= Fin And Ligne.Offset(0, 7).Value2 <> vbNullString Then

Cela permet de checker si la cellule de commentaire est vide, auquel cas elle est skip.

Effectivement cela fonctionne.

Un grand merci pour votre aide

Rechercher des sujets similaires à "concatener feuille seule"