Concatener en VB

Résolu
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013 - 18 juin 2012 à 17:45
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013 - 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

35 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 juin 2012 à 16:54
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
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
18 juin 2012 à 18:42
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
0
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013
18 juin 2012 à 20:00
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
18 juin 2012 à 20:24
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013
18 juin 2012 à 20:37
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?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
18 juin 2012 à 22:37
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
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
19 juin 2012 à 00:05
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.
0
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013
19 juin 2012 à 08:15
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 08:26
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 08:30
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
0
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013
19 juin 2012 à 09:28
@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 ;)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 10:10
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 10:35
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 10:39
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
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
19 juin 2012 à 11:01
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.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
19 juin 2012 à 11:05
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 11:07
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juin 2012 à 11:09
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
0
aubioine Messages postés 19 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 19 novembre 2013
19 juin 2012 à 11:20
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.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
19 juin 2012 à 11:42
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.
0
Rejoignez-nous