Concatener en VB [Résolu]

aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention - 18 juin 2012 à 17:45 - Dernière réponse : aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention
- 20 juin 2012 à 17:23
Bonjour,
étant débutant en VB, je pose ma question sur ce forum

Je possède un tableau excel sous la forme :

valeur1
sous-valeur1 résultat1
sous-valeur2 résultat2
sous-valeur3 résultat3
sous-valeur4 résultat4
sous-valeur5 résultat5
valeur2
sous-valeur6 résultat6
sous-valeur7 résultat7
sous-valeur8 résultat8
valeur3
sous-valeur9 résultat9
sous-valeur10 résultat10
sous-valeur11 résultat11
sous-valeur12 résultat12
sous-valeur13 résultat13
sous-valeur14 résultat14
sous-valeur15 résultat15
sous-valeur16 résultat16
sous-valeur17 résultat17
sous-valeur18 résultat18

et je souhaiterai concatener les sous-valeurs dans une cellule sur la même ligne que la valeur
(le nombre de valeurs et de sous-valeurs varie)

(je suis sur Excel2007)


J'espère être assez clair et merci d'avance pour vos réponses
Afficher la suite 

Votre réponse

35 réponses

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 20 juin 2012 à 16:54
+3
Utile
Bon.
J'ai eu le temps de faire ce que je t'avais promis.
Je te le mets là avant de retourner pêcher.

Important : ce code est valable après la réorganisation faite par mon tout premier code.

Sur ton userform :
- listbox1 pour y choisir les valeurs (j'ai utilisé un artifice pour cacher le rang)
- listbox2 pour les données correspondantes au choix dans listbox1
en dessous : deux textboxes textbox1 et textbox2


Tu verras que j'ai proposé deux solutions. Jer préfère de loin la seconde. Tu verras pourquoi en essayant les deux.
Private dou As Long, aou As Long

Private Sub UserForm_Activate()
  Dim plage As Range, c As Range
  Set plage = Range("A1:A" & Range("B" & Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeConstants)
  With ListBox1
     .ColumnCount = 2
     .ColumnWidths = Cells(1.1).Width * 2
     .Width = Cells(1, 1).Width
    For Each c In plage
      .AddItem c.Value
      .List(ListBox1.ListCount - 1, 1) = c.Row
    Next
  End With
  Set plage = Nothing
  With ListBox2
    .ColumnCount = 2
    .ColumnWidths = IIf(Range("B1").Width > Range("c1").Width, Range("B1").Width, Range("c1").Width)
  End With
  ListBox2.Width = Val(ListBox2.ColumnWidths) * 2
End Sub
Private Sub ListBox1_Click()
   dou = ListBox1.List(ListBox1.ListIndex, 1)
   On Error Resume Next
   aou = Range("A" & dou + 1 & ":A" & Rows.Count).SpecialCells(xlCellTypeConstants).Row - 1
   If Err > 0 Then aou = Range("B" & Rows.Count).End(xlUp).Row
   On Error GoTo 0
   ListBox2.RowSource = "B" & dou & ":C" & aou
   End Sub
Private Sub ListBox2_Click()
  ' Nous y voilà donc.
  ' je te laisse le choix entre deux comportements (mets en commentaires celui qui te plait moins
  ' et décommente l'autre
  '_______________________________________________________
  'TextBox1.Text = ListBox2.List(ListBox2.ListIndex, 0)  '| ce choix remplit, mais sans lier, ce qui fait que tu devras
  'TextBox2.Text = ListBox2.List(ListBox2.ListIndex, 1)  '| ajouter du code si tu veux modifier les cellules correspondantes
  '_______________________________________________________|
  
  '________________________________________________________
  TextBox1.ControlSource = "B" & dou + ListBox2.ListIndex '| ce choix me parait plus intelligent. Toute modif de l'une de ces
  TextBox2.ControlSource = "C" & dou + ListBox2.ListIndex '| deux textboxes modifiera à la fois les cellules et la listbox
  '________________________________________________________| sans autre code
End Sub

Allez ===>> je retourne à la pêche pour ma grillade de demain.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
NHenry 14176 Messages postés vendredi 14 mars 2003Date d'inscription 20 mai 2018 Dernière intervention - 18 juin 2012 à 18:42
0
Utile
Bonjour,

As-tu un exemple de ce que tu veux obtenir, car ta description me laisse dans le doute.

Pour concaténer :
Result=Chaine1 & Chaine2

Si tu es en VBA Excel, il ne faut pas poster en .NET, je déplace le sujet.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Commenter la réponse de NHenry
aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention - 18 juin 2012 à 20:00
0
Utile
Merci de cette première réponse rapide (et merci d'avoir déplacer le sujet au bon endroit.

Voilà un petit aperçu de ce que je voudrai obtenir


Sachant que dans le fichier d'origine, le nombre de valeurs et de sous-valeurs peuvent varier
Commenter la réponse de aubioine
NHenry 14176 Messages postés vendredi 14 mars 2003Date d'inscription 20 mai 2018 Dernière intervention - 18 juin 2012 à 20:24
0
Utile
Bonjour,

Pour concaténer une chaine avec des retours à la ligne dans les cellules d'Excel :
Cellule.Value=Chaine1 & vblf & Chaine2

Ensuite, il te faudra une boucle Do/Loop pour passer tous les enregistrements un par un.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Commenter la réponse de NHenry
aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention - 18 juin 2012 à 20:37
0
Utile
J'arrive a concaténer lorsque le nombre de sous-valeur est le même mais je n'arrive pas à "boucler" lorsque celui-ci diffère.

Puis-je avoir un exemple de la boucle?
Commenter la réponse de aubioine
NHenry 14176 Messages postés vendredi 14 mars 2003Date d'inscription 20 mai 2018 Dernière intervention - 18 juin 2012 à 22:37
0
Utile
Bonjour,

Quel est le code que tu as donc utilisé pour cela ?

Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Commenter la réponse de NHenry
LIBRE_MAX 1403 Messages postés mardi 1 mai 2007Date d'inscription 7 octobre 2012 Dernière intervention - 19 juin 2012 à 00:05
0
Utile
Bonsoir,

Pour arriver au résultat décrit dans la capture, pas besoin de concatèner.
Il suffit d' avoir;

valeur1 sous-valeur1 resultat1
valeur1 sous-valeur2 resultat2
valeur1 sous-valeur3 resultat3
valeur1 sous-valeur4 resultat4
valeur1 sous-valeur5 resultat5

Puis, fusionner les cellules de la colonne A,de la première cellule ou débute la valeur à la dernière.
(On commences donc à la ligne x, et tant que c' est la même valeur on insère et on incrémente de 1).




[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention - 19 juin 2012 à 08:15
0
Utile
Bonjour,

Libre_Max : Si, il faut concatener car je souhaite avoir les sous-valeurs dans une même cellule.

NHenry : J'ai essayé un code vite fait qui marchait, je vais essayer de le retrouver
Commenter la réponse de aubioine
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 08:26
0
Utile
Bonjour, djkenob
1) ta boucle est très simple à mettre en oeuvre ...(je te laisse t'y mettre)
2) mais surtout : à faire cela, tu handicape sérieusement Excel (dans son boulot de tableur). Pourquoi faire cela ? Ne confondrais-tu pas tableur et traitement de texte ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 08:30
0
Utile
Un indice pour ta boucle, si tu persistes :
On distingue (sur ta feuille) un "groupe" de l'autre par l'examen de la colonne B


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention - 19 juin 2012 à 09:28
0
Utile
@ucfoutu : c'est bien un tableur que je souhaite car celà constitue une "base de donnée" que je veux rendre accessible et modifiable via un userform à moins qu'il y ait une solution pour afficher plusieurs cellules dans une zone de texte ou liste de la userform.


Merci de tes indices ;)
Commenter la réponse de aubioine
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 10:10
0
Utile
Et que ferait selon toi ceci :
sur ton userform :
une combobox combobox1 et un bouton de commande commandbutton1 (juste pour tester) :
Private Sub CommandButton1_Click()
  ComboBox1.RowSource = "C1:C3"
End Sub

Ce ui te permet d'éviter de transformer les données exploitables d'un tableur en données dont l'exploitation nécessiterait une acrobatie à coups de split !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 10:35
0
Utile
Pour être plus précis :
Si tu en es là, c'est que (comme c'est trop souvent le cas) tu t'es précipité pour créer sans octroyer le temps nécessaire à la conception (toujours le plus important, pourtant !)
Et te voilà maintenant "lancé" vers la recherche d'un "pansement" qui ne fera qu' "ajouter une verrue aux verrues" ==>> tu t'en iras ainsi petit à petit vers une usine à gaz qui nécessitera des acrobaties diverses et de plus en plus lourdes !
Tu veux un vrai conseil ?
Commence par regarder ce que ferait ceci, avec l'exemple de feuille que tu as montré plus haut :
Private Sub commandbutton1_click()
 derlig = Range("B" & Rows.Count).End(xlUp).Row
 Dim plage As Range, c As Range
 Set plage = Range("B1:B" & derlig).SpecialCells(xlCellTypeBlanks).Offset(0, -1)
 Range("A:A").Insert shift:=xlShiftToRight
 For Each c In plage
   Range("A" & c.Row + 1).Value = c.Value
   Range("B" & c.Row).Value = ""
 Next
 plage.EntireRow.Delete
End Sub

Voilà ce qui serait à mon avis un bien plus sage départ.
Tu dis...




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 10:39
0
Utile
rajoute bien sûr dans la boucle for (à la fin) :

Range("C" & c.Row).Value = ""

pour finir de nettoyer
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
LIBRE_MAX 1403 Messages postés mardi 1 mai 2007Date d'inscription 7 octobre 2012 Dernière intervention - 19 juin 2012 à 11:01
0
Utile
Bonjour,

Mais déjà il nous faudra une capture avec de vraies données pour dèceler les subtilités de passage d' une "valeur" à une autre.Sans cela, comment savoir
si une donnée (colonne A) est une "valeur" ou une "sousvaleur" ?




[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
LIBRE_MAX 1403 Messages postés mardi 1 mai 2007Date d'inscription 7 octobre 2012 Dernière intervention - 19 juin 2012 à 11:05
0
Utile
oui, il suffit d' examiner la colonne B.
(passage en cas de vide)

Je viens de m' en rendre compte.

[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 11:07
0
Utile
salut, LIBRE_MAX,
dur dur, le lundi matin, au Maroc également, je vois ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 juin 2012 à 11:09
0
Utile
En fait : entre ma "réorganisation" et ce que je lui ai dit à propos d'une combobox liée, il a tout pour faire moins mal.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
aubioine 19 Messages postés lundi 2 avril 2007Date d'inscription 19 novembre 2013 Dernière intervention - 19 juin 2012 à 11:20
0
Utile
Merci ucfoutu, ton code est parfait, je travail maintenant sur une zone de liste dans ma userform qui vient lire les lignes de sous-valeurs et de résultats jusqu'a ce qu'une nouvelle valeur apparaisse.
Commenter la réponse de aubioine
LIBRE_MAX 1403 Messages postés mardi 1 mai 2007Date d'inscription 7 octobre 2012 Dernière intervention - 19 juin 2012 à 11:42
0
Utile
ucfoutu a dit:
dur dur, le lundi matin, au Maroc également, je vois ...

Effectivement ! Comme tout les lundis du monde !



On vient de le dire:
Une nouvelle valeur apparait quand, sur une ligne,la cellle colonne B est vide et celle de la colonne A non.

[] Ce qui va sans dire. va mieux en le disant.
Commenter la réponse de LIBRE_MAX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Concatener en VB - page 2