Macro Excel pour fusionner n'importe où

gaston gaston
1 474 contributions
Membre depuis le 01/03/2001
Envoyé le 19/10/2017 à 16:21


Bonjour,

il m'arrive souvent de devoir copier des tableaux en fichier pdf, vers un fichier excel.

C'est un peu long parce que je ne suis jamais arrivé à faire un copié collé direct en importation sur Excel (version 2002) avec les colonnes et lignes qui soient respectées: en effet si je mets espace ou tabulation en séparateur, j'ai une colonne à chaque espace entre les mots !

Bref, je fais en appuyant sur Alt en même tant que sur le bouton gauche de la souris, pour sélectionner par colonne, et je colle, mais ça c'est pas grave: ce qui m'embête plus, c'est que dans la première colonne où il y a des dates, il n'y a pas de lignes vides, et dans la 2ème colonne, si le contenu est un peu long (ce qui arrive), le contenu sur le fichier pdf est en 2 lignes (voire 3 ou 4) , et donc quand je colle, il n'y a plus de correspondance entre les lignes de la 1ère et 2è colonne.
et je dois regrouper manuellement les lignes de la 2ème colonne, couper coller, couper cloller, ou alors faire une concaténation dans une autre cellule et copier coller valeurs. pfffff !
Il m'arrangerait d'avoir une macro que je couplerait à un bouton qui me permette en faisant une sélection de 2 à 3 ou 4 ou 5 lignes dans une colonne de pouvoir en 1 clic concaténer le contenu de ces cellules dans celle de la 1ère ligne de la sélection.
J'ai essayé avec l'enregistreur de macro, où ça fonctionne à un endroit donné, mais je ne me rappelle plus comment on fait quand on veut que ça fonctionne n'importe où et sur un nombre de ligne pas forcément fixe.
Bref, un petit coup de pouce serait le bienvenu, svp
carpe diem
Claude40 Claude40
1 531 contributions
Membre depuis le 24/03/2010
Envoyé le 19/10/2017 à 20:07 Modifié par Claude40


Bonjour,
Je peux regarder ce type de macro, mais j'ai besoin de connaitre le moyen de différencier à coup sûr, une ligne dont la cellule de la colonne 2 est complète d'une ligne dont le contenu de la cellule 2 doit être concaténé.
En attendant, voici une macro toute simple qui fonctionne sur une tableau excel dont la colonne A comporte des dates ou des blancc. S'il y a une date cela signifie que la cellule en colonne 2 est complète. S'il y a des blancs cela signifie que la valeur de la cellule en colonne 2 doit être concaténée avec le contenu de la cellule située n lignes au dessus (la première qui a une date). Ensuite les lignes concaténées sont annulées.


Sub Concaténer()
'
' Concaténer Macro
' 1) détecter le nombre de ligne utiles.
Dim Nblignes As Integer
Nblignes = Application.WorksheetFunction.CountA(Range("B:B"))
Dim ctr As Integer
Dim ctrc As Integer
For i = 1 To Nblignes
If Cells(i, 1) = "" Then
ctr = ctr + 1
Cells(i - ctr, 2).Value = Cells(i - ctr, 2).Value & " " & Cells(i, 2).Value
Cells(i, 1).Value = "Annulé"
If ctr > ctrc Then
ctrc = ctr
End If
Else
ctr = 0
End If
Next i
' annulation effectives des lignes
Dim MyRow As String
For k = 1 To ctrc
For j = 1 To Nblignes

If Cells(j, 1).Value = "Annulé" Then
MyRow = j & ":" & j
Rows(MyRow).Select
Selection.Delete Shift:=xlUp
j = j + 1
End If
Next j
Next k



End Sub

Un bon exposé du problème, c'est déjà un grand pas vers la solution. Dans la mesure du possible, mes solutions sont testées, sur mon système actuel (W10 Pro version 1909), mais peuvent ne pas fonctionner sur tous les Pc
gaston gaston
1 474 contributions
Membre depuis le 01/03/2001
Envoyé le 19/10/2017 à 22:10


Bonjour,


connaitre le moyen de différencier à coup sûr, une ligne dont la cellule de la colonne 2 est complète d'une ligne dont le contenu de la cellule 2 doit être concaténé.

pas la peine: je veux pouvoir faire une sélection manuelle de 2 ou plusieurs lignes, et y appliquer la macro ensuite
carpe diem
Claude40 Claude40
1 531 contributions
Membre depuis le 24/03/2010
Envoyé le 20/10/2017 à 10:04


Bonjour,


Citation
quand on veut que ça fonctionne n'importe où et sur un nombre de ligne pas forcément fixe.


Ma petite macro fait le job si je sais distinguer une ligne "définitive" et une ligne à concaténer. En l’occurrence, soit j'ai une date en colonne A soit j'ai un blanc.
Elle répond parfaitement aux données du problème rappelé en citation.

Pourquoi faire manuel et compliqué quand on peut faire simple et automatique ?

Un bon exposé du problème, c'est déjà un grand pas vers la solution. Dans la mesure du possible, mes solutions sont testées, sur mon système actuel (W10 Pro version 1909), mais peuvent ne pas fonctionner sur tous les Pc
gaston gaston
1 474 contributions
Membre depuis le 01/03/2001
Envoyé le 20/10/2017 à 11:37 Modifié par gaston


Bonjour,
[:D]
et bien parce que je ne souhaites pouvoir NE PAS fusionner certaines lignes, mais je n'ai pas de critère spécifique à donner pour cela: c'est au coup par coup

et puis surtout (je viens de relire ton message avec plus d'attention) il n'y a pas de blanc dans la colonne 1: il y a tout simplement plus de lignes dans la colonne 2 que dans la colonne 1 et donc il n'y a plus de correspondance.
Parce que attention: ce ne sont pas des lignes entières, que je souhaite fusionner mais des cellules d'une même colonne, pour justement retrouver les correspondances col 1 et col 2
carpe diem
Claude40 Claude40
1 531 contributions
Membre depuis le 24/03/2010
Envoyé le 20/10/2017 à 13:12 Modifié par Claude40


Bonjour,
Merci pour cette précision. Le "blanc" dans la colonne 1 était pour moi une hypothèse pour distinguer les lignes à concaténer des lignes réceptrices de la concaténation.
Je vois mieux le problème, car, moi, aussi, j'ai lu l'énoncé original du problème avec plus d'attention. [:o)]
J'ai corrigé la macro qui se déroule en trois temps
a) la macro demande la plage de lignes à concaténer sous la forme nn-mm.
La plage peut aller de la ligne 2 à la ligne 999, mais je n'ai pas prévu le cas ou la première ligne serait à 1 chiffre et la dernière ligne à 3 chiffres. Je pense que ce n'est pas "réaliste".
b) Elle analyse la longueur de la réponse pour déterminer la première ligne et la dernière ligne à concaténer. 5 possibilités : n-m, n-mm, nn-mm, nn-mmm et nnn-mmm.
c)Elle effectue la concaténation.

Dans la version actuelle, la macro ne supprime pas les lignes concaténées.
NB: La macro pourrait être plus "fignolée", mais moins évidente à comprendre !
Voici le jeu d'essai :



Voici la macro :


Sub Concaténer()
' Phase 1
Dim Message, MyValue
Message = "Lignes à concaténer sous la forme nn-mm ?"
MyValue = InputBox(Message)
Dim Nbc As Integer
Dim MyLigne1 As Integer ' 1ère ligne à concaténer
Dim MyLigne2 As Integer ' 2ème ligne à concaténer
' Phase 2
' Analyse de la structure de la réponse (longueur, avec 5 possibilités, 3,4,5,6, ou 7 caractères)
' NB la macro fonctionne jusqu'au numéro de ligne 999
Nbc = Len(MyValue)
If Nbc = 3 Then
MyLigne1 = Mid(MyValue, 1, 1)
MyLigne2 = Mid(MyValue, 3, 1)
GoTo Suite
End If
If Nbc = 4 Then
MyLigne1 = Mid(MyValue, 1, 1)
MyLigne2 = Mid(MyValue, 3, 2)
GoTo Suite
End If
If Nbc = 5 Then
MyLigne1 = Mid(MyValue, 1, 2)
MyLigne2 = Mid(MyValue, 4, 2)
GoTo Suite
End If
If Nbc = 6 Then
MyLigne1 = Mid(MyValue, 1, 2)
MyLigne2 = Mid(MyValue, 4, 3)
GoTo Suite
End If
If Nbc = 7 Then
MyLigne1 = Mid(MyValue, 1, 3)
MyLigne2 = Mid(MyValue, 5, 3)
GoTo Suite
End If
' Phase 3 concaténation
Suite:
Dim ctr As Integer
For i = MyLigne1 To MyLigne2
ctr = ctr + 1
Cells(i - ctr, 2).Value = Cells(i - ctr, 2).Value & " " & Cells(i, 2).Value
Next i
End Sub


Un bon exposé du problème, c'est déjà un grand pas vers la solution. Dans la mesure du possible, mes solutions sont testées, sur mon système actuel (W10 Pro version 1909), mais peuvent ne pas fonctionner sur tous les Pc
Bipbipcoyote Bipbipcoyote
3 000 contributions
Membre depuis le 06/03/2001
Envoyé le 20/10/2017 à 14:32 Modifié par Bipbipcoyote


Bonjour,
suggestion à tester... tu sélectionnes les cellules à fusionner(ici ce sont des cellules les unes en dessous des autres (par exemple de B2 à B5 et en gardant la sélection , tu déclenches la macro, en principe tout revient dans la première cellule sélectionnée (B2) avec un espace entre chaque donnée ensuite cela efface les données superflues (B3, B4,B5)

Sub Macro1()
NbreCellules = Selection.Cells.Count
For i = 0 To NbreCellules - 1
Valeurs = Valeurs & " " & Cells(ActiveCell.Row + i, ActiveCell.Column)
Next i
ActiveCell = Valeurs
For i = 1 To NbreCellules - 1
ActiveCell.Offset(1, 0).Delete
Next i
End Sub

tu recommences ensuite en sélectionnant B7-B9 qui ne seront plus ces adresses, car en effaçant le contenu d'une cellule, les lignes risquent de remonter si aucune colonne adjacente n'est remplie
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Claude40 Claude40
1 531 contributions
Membre depuis le 24/03/2010
Envoyé le 20/10/2017 à 20:04 Modifié par Claude40


Bonjour,
Bravo !
Voila la macro la plus sophistiquée que je rêvais d'écrire. Mais pour tenir compte du fait que le tableur contient plus d'une colonne, il faut, à mon avis, deleter la ligne entière et non la cellule car je suppose que les lignes dont les cellules sont à concaténer ne contiennent pas d'autres données que celles de la colonne B :
Remplacer


ActiveCell.Offset(1, 0).Delete


par


ActiveCell.EntireRow.Offset(1, 0).Delete


Non ?
Un bon exposé du problème, c'est déjà un grand pas vers la solution. Dans la mesure du possible, mes solutions sont testées, sur mon système actuel (W10 Pro version 1909), mais peuvent ne pas fonctionner sur tous les Pc
Bipbipcoyote Bipbipcoyote
3 000 contributions
Membre depuis le 06/03/2001
Envoyé le 20/10/2017 à 20:21


Bonjour,
oui,cela dépend de ce qu'il veut faire ou comment se présente le tableau. Il peut séparer les 2 actions en 2 fonctions, une pour concaténer et l'autre pour effacer... il y a un moment où l'automatisation ne peut aller plus loin ou alors on aurait un droïde en face de soi [:D]
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 474 contributions
Membre depuis le 01/03/2001
Envoyé le 21/10/2017 à 01:03


Bonjour
De ce que j'en comprends, la macro de bipbip me semble convenir tout à fait à mon besoin !

Merci, je vais tester

Claude: comme je t'ai dit plus haut: si j'efface les lignes, ça m'effacera des données dans la colonne 1, ce qu'il faut à la rigueur si on veut vraiment automatiser (mais déjà tel que, ça devrait l'aller très bien) ce serait de faire remonter toutes les cellules en dessous des vides, pour combler le vide....mais uniquement dans cette colonne.
A limite, ce comblement pourrait m'intéresser en macro séparée, qui soit valable sur une sélection. Comme cela ce serait utilisable ailleurs aussi, mébon... [8D]

carpe diem
Claude40 Claude40
1 531 contributions
Membre depuis le 24/03/2010
Envoyé le 21/10/2017 à 11:42 Modifié par Claude40


Bonjour,
Dans ce cas, il faut tester la macro de Bibibip qui efface les cellules fusionnées et fait effectivement remonter les infos de la colonne "B". Mais les infos restantes seront-elles toujours en phase avec le contenu des cellules de la colonne "A" ?
Le mieux serait d'avoir un petit fac-similé du tableur Excel en entrée avant toute manip (à l'image du jeu d'essai que j'ai fait).
Comme disait aussi Bibbip " ça dépend comment se présente le tableau".
Un bon exposé du problème, c'est déjà un grand pas vers la solution. Dans la mesure du possible, mes solutions sont testées, sur mon système actuel (W10 Pro version 1909), mais peuvent ne pas fonctionner sur tous les Pc
gaston gaston
1 474 contributions
Membre depuis le 01/03/2001
Envoyé le 24/10/2017 à 15:49 Modifié par gaston


Salut

Et bien j'ai testé la macro de Bip bip et c'est pile poil ce que je souhaitais comme résultat (+)

Merci beaucoup !

Merci à Claude pour m'avoir répondu aussi


carpe diem

Discussion trop ancienne

Cette discussion a été automatiquement fermée car elle n'a plus reçue de nouveau message depuis trop longtemps.

Nous vous suggérons de créer un nouveau message

« Retour sur la liste des messages de ce forum