Concaténation avancée

Bonjour à tous et merci de me lire.

Je vous soumets une problématique qui me donne du fil à retordre.

Je cherche à créer une FONCTION qui - dans le cas présenté ci-dessous - renverra la concaténation verticale de la colonne E, à savoir, la chaîne de caractères «HHPBPBB »... et s'écrira sous la formeFONCTION ( plage_de_cellules_où_se_trouve_les_données ; adresse_d’une_cellule_où_se_trouve_le_mode_de_transport_à_étudier ), ce qui donnera FONCTION ( $A$1:$D$15 ; $A$2 ) dans le cas du mode de transport "AVION". [ bien entendu, la colonne E n'existe pas en réalité. Je l'ai représentée ici juste pour les besoins de l'explication. ]

triconcat

La FONCTION fonctionne de la manière suivante :

Colonne E est vide quand :

  • « AVION » n’est présent ni dans la colonne A, ni dans la colonne B ;
  • colonne C et/ou colonne D est vide ou n’est pas une valeur numérique

Colonne E = « H » quand :

  • colonne A = « AVION » ET colonne C est supérieure à colonne D ;
  • colonne B = « AVION » ET colonne D est supérieure à colonne C

Colonne E = « B » quand :

  • colonne A = « AVION » ET colonne C est inférieure à colonne D ;
  • colonne B = « AVION » ET colonne D est inférieure à colonne C

Colonne E = « P » quand :

  • [ colonne A = « AVION » OU colonne B = « AVION » ] ET colonne C est égale à colonne D

Voilà, si une bonne âme a des pistes, je suis preneur et je vous en remercie par avance.

13triconcat.xlsm (9.82 Ko)

Salut Akacio,

si la colonne [C:C] n'existe pas, le travail qu'on te fournirait ne servirait donc à rien !
Une situation réelle serait plus efficace!

J'imagine qu'il faut aussi créer les formules de résultats en [E:E] selon la cible ?


A+

Pardon, c'est une coquille que je viens de rectifier. C'est la colonne E qui n'existe pas. En tout cas, merci de t'être penché aussi promptement sur mon cas.

Salut Akacio,

...oublié de te demander où il fallait afficher le résultat de la concaténation et où on peut-on trouver la cible à étudier.
Tu dis [A2] mais, pour cette ligne-là, il y aura un problème de référence circulaire...


A+

Le résultat de la fonction est à afficher dans la cellule où on aura écrit la fonction. La fonction sera donc "étirable".

Si ça pose problème de choisir une cellule de la plage de données pour définir le mode de transport à étudier, pas de souci. On peut faire référence à une cellule se trouvant hors de la plage de cellules considérée. Autrement dit, on doit pouvoir faire référence à une cellule sans écrire "AVION" "en dur" dans la fonction.

bonjour à tous,

une solution via une fonction personnalisée. Je me demande à quoi pourrait bien servir cette concaténation.

10triconcat.xlsm (18.55 Ko)

Merci h2so4, ça marche super bien... sauf dans le cas où [C:C] ou [D:D] sont vides. La fonction se comporte comme si elles contenaient 0.

En fait, comme je disais dans ma présentation, dès lors que la fonction "détecte" une valeur NON numérique OU une cellule vide en [C:C] et/ou en [D:D], elle ne doit RIEN renvoyer, dans absolument tous les cas de figures, qu' "AVION" soit présent ou pas en [A:A] ou en [B:B].

Sinon, cette concaténation ne sert à rien en soi. Elle fera l'objet d'autres traitements par la suite.

Merci encore pour ton aide.

Salut Akacio,
Salut H2so4,

Un double-clic sur une valeur en [A:B] déclare cette valeur en [B1] comme valeur-référence pour la fonction.

Public Function fctConcat(rCel As Range) As String
'
Dim iRow%, sFlag$
'
Application.Volatile
'
With Worksheets("MAIN")
    iRow = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("A2:B" & iRow).Font.Color = RGB(195, 195, 195)
    For x = 2 To iRow
        If .Cells(x, 1) = rCel Or .Cells(x, 2) = rCel Then _
            .Cells(x, IIf(.Cells(x, 1) = rCel, 1, 2)).Font.Color = RGB(255, 0, 0): _
            If .Cells(x, 3) <> "" And .Cells(x, 4) <> "" And IsNumeric(.Cells(x, 3)) And IsNumeric(.Cells(x, 4)) Then _
                sFlag = sFlag & IIf(.Cells(x, 1) = rCel And .Cells(x, 3) > .Cells(x, 4), "H", ""): _
                sFlag = sFlag & IIf(.Cells(x, 1) = rCel And .Cells(x, 3) < .Cells(x, 4), "B", ""): _
                sFlag = sFlag & IIf(.Cells(x, 2) = rCel And .Cells(x, 4) > .Cells(x, 3), "H", ""): _
                sFlag = sFlag & IIf(.Cells(x, 2) = rCel And .Cells(x, 4) < .Cells(x, 3), "B", ""): _
                sFlag = sFlag & IIf(.Cells(x, 3) = .Cells(x, 4), "P", "")
    Next
End With
fctConcat = sFlag
'
End Function
6triconcat.xlsm (19.69 Ko)


A+

Bonjour h2so4, bonjour Curulis57,

Merci à vous 2 pour votre aide précieuse.

bonjour,

si encore nécessaire, pour pallier ce problème

sauf dans le cas où [C:C] ou [D:D] sont vides. La fonction se comporte comme si elles contenaient 0.

5triconcat.xlsm (18.53 Ko)

edit : bug corrigé

euuuh... non... la fonction continue de renvoyer "P" alors que [C:C] et/ou [D:D] sont vides. Regarde à la 3ème ligne du tableau.

5triconcat.xlsm (18.57 Ko)

bonsoir,

correction faite dans le message précédent

Rechercher des sujets similaires à "concatenation avancee"