Un peut d'aide ne serait pas de refus

Nann

XLDnaute Nouveau
Bonjour, tout le monde,
Merci a Porcinet82 et à charly2 pour leur info que ma permit de modifier mon vb actuel avec leur base, pour mon précedent post.

voici donc le vb actuel:

Sub Modif_format1()
Dim i As Integer
'on fige l'écran
Application.ScreenUpdating = False
'Pour de la ligne 3000 à la ligne 18 un remontant de une ligne
For i = 3000 To 18 Step -1
'Faire tant que : le contenu de la cellule de la colonne E de la ligne actuelle
'et celle du dessus sont identique Et que le contenu de la cellule de la colonne C
'et celle du dessus sont identique
Do While Cells(i, 5).Value = Cells(i - 1, 5).Value And Cells(i, 3) = Cells(i - 1, 3)
'on concatene la cellule actuelle de la colonne B avec celle de la ligne du dessus
'avec entre les deux : ", "
Cells(i, 2) = Cells(i - 1, 2) & ", " & Cells(i, 2)
'puis on efface la ligne du dessus
Rows(i - 1).Delete
'Et on recommance tant que la condition est d'actualitée
Loop
Next i
'on défige l'écran
Application.ScreenUpdating = True
End Sub

Mais je voudrais modifier la macro pour que dès le lancement de cell-ci, elle me demande les colonnes pour les conditions ( du genre je clic sur les colonnes ) faire de meme pour la colonne ou elle concatène, puis aussi pour la ligne de départ, et que la macro cherche d'elle meme la dernière ligne ou la première ligne vide.

Merci d'avance, car je trouve que c'est méga hard pour moi, mais bon si quelqu'un connait comment faire, et bien je lui tire mon chapeau.
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

Nann à dit:
Bonjour, tout le monde,
Merci a Porcinet82 et à charly2 pour leur info que ma permit de modifier mon vb actuel avec leur base, pour mon précedent post.

voici donc le vb actuel:

Sub Modif_format1()
Dim i As Integer
'on fige l'écran
Application.ScreenUpdating = False
'Pour de la ligne 3000 à la ligne 18 un remontant de une ligne
For i = 3000 To 18 Step -1
'Faire tant que : le contenu de la cellule de la colonne E de la ligne actuelle
'et celle du dessus sont identique Et que le contenu de la cellule de la colonne B
'et celle du dessus sont identique
Do While Cells(i, 5).Value = Cells(i - 1, 5).Value And Cells(i, 3) = Cells(i - 1, 3)
'on concatene la cellule actuelle de la colonne B avec celle de la ligne du dessus
'avec entre les deux : ", "
Cells(i, 2) = Cells(i - 1, 2) & ", " & Cells(i, 2)
'puis on efface la ligne du dessus
Rows(i - 1).Delete
'Et on recommance tant que la condition est d'actualitée
Loop
Next i
'on défige l'écran
Application.ScreenUpdating = True
End Sub

Mais je voudrais modifier la macro pour que dès le lancement de cell-ci, elle me demande les colonnes pour les conditions ( du genre je clic sur les colonnes ) faire de meme pour la colonne ou elle concatène, puis aussi pour la ligne de départ, et que la macro cherche d'elle meme la dernière ligne ou la première ligne vide.

Merci d'avance, car je trouve que c'est méga hard pour moi, mais bon si quelqu'un connait comment faire, et bien je lui tire mon chapeau.
Salut
Questions :
Y a-t-il une raison spécifique pour que tu commence à la ligne 3000 ?
Comme tu dois avoir des lignes vides, tu utlises Excel pour concaténer les lignes vides de la ligne 3000 à la dernière ligne non-vide.
Tu imbriques 2 boucles : Pourquoi ?
Tu figes ton écran : ok. Mais si tu plantes la macro en plein milieu, comment tu réactive ton écran ?

Ta concaténation doit-elle toujours être dans B ? Si oui, est-ce qu'une sélection des colonnes de test avant le lancement de la macro serait envisageable (tu sélectionnes 2 colonnes et tu lances la macro) ?

Il faut que je regarde un peu plus ce que tu fais avec ta macro
A+
 

Gorfael

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

Re
Je viens de survoler ta macro : t'es dans le KK
J'explique : i = 3000
les 3 cellules Bi, Ci et Ei sont vides, ainsi que B(i-1), C(i-1) et E(i-1)
Cells(i, 5).Value = Cells(i - 1, 5).Value And Cells(i, 3) = Cells(i - 1, 3) identique à :
Range("E" & i)=Range("E" & i-1) and Range("C" & i)=Range("C" & i-1)


1er passage dans la boucle Do While
i=3000 => i-1=2999
(Ei=E(i-1)) et (Ci=C(i-1)) => (0=0 et 0=0) =VRAI donc instruction suivante
Bi= vide & ", " vide => Bi=", "
effacement ligne i-1 => Bi devient B(i-1)
Loop => retour au test

2ème passage dans la boucle Do While
i=3000 => i-1=2999
(Ei=E(i-1)) et (Ci=C(i-1)) => (0=0 et 0=0) =VRAI donc instruction suivante
Bi= ", " & ", " & vide => Bi=", , "
effacement ligne i-1 => Bi devient B(i-1)
Loop => retour au test

N-nième passage dans la boucle Do While
i=3000 => i-1=2999
(Ei=E(i-1)) et (Ci=C(i-1)) => (0=0 et 0=0) =VRAI donc instruction suivante
Bi= ", " & ", " & vide => Bi=", , , , , , , , , , , , , , , , , , , , , , , "
effacement ligne i-1 => Bi devient B(i-1)
Loop => retour au test

Ouaff, ouaff, ouaf (je peux me moquer, j'ai fait pareil et même pire) Et en plus, t'es pas loin : il suffit de remplacer
Do While Cells(i, 5).Value = Cells(i - 1, 5).Value And Cells(i, 3) = Cells(i - 1, 3)
Loop par un test If ... Then
ce qui donne

if Cells(i, 5) = Cells(i - 1, 5) And Cells(i, 3) = Cells(i - 1, 3) then
Cells(i, 2) = Cells(i - 1, 2) & ", " & Cells(i, 2)
Rows(i - 1).Delete
endif
Si les 2 paires de cellules ne sont pas identiques, je ne fais rien et je passe à la ligne précédente (step -1)

Je suis à la ligne 200, et les 2 paires sont identiques
je concatène : B200 = B199 & ", " & B200
Je supprime ligne 199 => donc B200 devient B199
en passant sur next, je suis renvoyé à For et i(=200) devient 199
Je teste la ligne 199 avec la ligne 198 : donc ça marche

Ta ligne : For i = 3000 To 18 Step -1 me gêne (comme disait Marco Polo)
Je verrais plutôt un test de la colonne B pour trouver la dernière cellule non-vide
Ce qui donne une macro dans le style
Sub Modif_format2()
On Error GoTo Erreur_Modif_format2
Dim i As Long
Application.ScreenUpdating = False

If Range("B65535").End(xlUp).Rows < 19 Then GoTo Sortie_Modif_format2
For i = Range("B65535").End(xlUp).Row To 18 Step -1
If Cells(i, 5) = Cells(i - 1, 5) And Cells(i, 3) = Cells(i - 1, 3) Then
Cells(i, 2) = Cells(i - 1, 2) & ", " & Cells(i, 2)
Rows(i - 1).Delete
End If
Next i

Sortie_Modif_format2:
Application.ScreenUpdating = True
Exit Sub
Erreur_Modif_format2:
MsgBox (Err.Number & " - " & Err.Description)
Resume Sortie_Modif_format2
End Sub
A+
 

Nann

XLDnaute Nouveau
Re : Un peut d'aide ne serait pas de refus

Le 3000 c'est par ce que mon fichier sur lequel j'ai fait le test contenais 3000 lignes c'est pour cela que je voudrais que la macro trouve la dernière ligne afin de pouvoir fonctionner sur d'autres excel, et la concatenation ne se feras pas obligatoirement dans la colonne B et le début du contenue ne sera que très rarement en ligne 18
 

Nann

XLDnaute Nouveau
Re : Un peut d'aide ne serait pas de refus

Oui mais elle fonctionne comme je l'ai écrite
donc pour l'instant, je voudrais conserver, la plus part.
Mais ta version est interressante, il faut que je m'y colle un peut du fait que je ne programme que rarement en VB
De plus est ce que les macro créé sous Office peuvent fonctionner Sous OpenOffice.Org???
 

porcinet82

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

Bonjour a tous,

Nann, une p'tite question, qu'entends-tu par pour que dès le lancement de cell-ci, elle me demande les colonnes pour les conditions ?
Perso, je ne comprends pas tres bien le colonnes pour les conditions donc si tu pouvais développer un peu.

Sinon en rajoutant quelques Inputbox pour la colonne de concaténation et le ligne de départ ca devrait le faire.
Pour ta question sous OpenOffice, je ne sais pas du tout, je ne m'en suis jamais servi.

@+
 

Tibo

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

Salult Nann, Porcinet, le fil,

En ce qui concerne la compatibilité entre Excel et Open Office, elle est de 99,99... % pour les formules.

Il me semble par contre que ça n'est pas le cas pour le langage macro.

Donc bon courage pour la transposition.


@+
 

Nann

XLDnaute Nouveau
Re : Un peut d'aide ne serait pas de refus

Re salut toput le monde,

Effectivement, je voudrais savoir s'il était possible de faire affiché une petite boite disant par exemple de cliqué dans les colonnes de comparaison et dans la collonne de concaténation ( peut etre une inputbox, suis pas expert dans les macros )
de meme pour la ligne de départ.
En fait je dois avoir sur 2 ligne consécutive, les meme contenu dans les case se superposant ( dans le vb ici, en collonne E et C) si la condition et valide, je concatene les données de l'une des cases de la colonne B puis j'efface l'une des lignes et je recommence je boucle pour refaire le test jusqu'a ce que
les lignes ne sois plus identique puis je passe le test avec les autres ligne avec d'autres ref.

Avec une pièce jointe, ce serait bien plus explicte, mais bon vue que pour l'instant les PJ ne sont plus autorisé, j'espère que c'est assez explicite.

Nann
 

Nann

XLDnaute Nouveau
Re : Un peut d'aide ne serait pas de refus

Bonjour Porcinet82, tout les autres du fil,

Ci-joint, une version lite de mon fichier
D'ailleurs dans le vb fournit, il faudra remplacer dans la boucle, le 3000 par 2993

J'espères que le lien avec la PJ fonctionneras et une fois le vb lancer, vous verrais le genre de fichier que je recois et qu'il faut que je remette en forme
Mais les colonne ne sont jamais placé au meme endroit de meme pour la ligne de début et la ligne de fin.

En mettant en commentaire le figeage et le défigeage, vous verrais les actions évoluer.

http://cjoint.com/?hoqKwo0ZvY

@ très bientot
 

porcinet82

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

Salut Nann,

Je viens de jeter un oeil a ton fichier, et en en faisan un fichier lite, tu as du également supprimer le code, du coup, il n'y a plus que tes données dedans. Si tu pouvais joindre le code qui devait s'y trouver ca permettrait de t'aider.

@+

PS : Les fichiers joints sont a nouveaux disponible sur le forum ;)
 

Nann

XLDnaute Nouveau
Re : Un peut d'aide ne serait pas de refus

Bonjour Porcinet82 et le fil,

Ci-joint, le lien vers le fichier avec le vb

http://cjoint.com/?hrmxpN6Yd0

Merci d'avance pour celui qui arriveras a rajouter la modification necessaire ou qui pourras m'aiguiller dans la bonne direction.

Car en fait, je voudrais que les position des colonnes devienne des variable et que fonctionne dans des Range mais je ne vois pas du tout comment faire et comment obtenir leur valeurs en cliquant sur la colonne et la ligne.
Mais aussi comment trouver la dernière ligne.

Re merci d'avance.

Nann
 

porcinet82

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

Re,

En fait je ne sais pas exactement ce que tu souhaites modifier dans ta macro.

Tu peux modifier le code de ta ligne de boucle avec celui-ci For i = Range("E65536").End(xlUp).Row To Range(Range("E65536").End(xlUp).Address(0, 0)).End(xlUp).Row + 1 Step -1


Range("E65536").End(xlUp).Row : permet de déterminer la dernière ligne non vide, c'est a dire ou commence la boucle
Range(Range("E65536").End(xlUp).Address(0, 0)).End(xlUp).Row + 1 : permet de déterminer la première ligne occupée dans ton fichier (a partir du bas au cas ou tu aurais des données sur les lignes avant ta ligne contenant les libellés)

Pour obtenir l'adresse :
  • de la ligne selectionnée : Selection.Row
  • de la colonne selectionnée : Selection.Column
  • de la cellule selectionnée : Selection.Address(0, 0)
Si tu n'arrives pas a te débrouiller avec ca, refais signe avec ce que tu souhaites en détails.

@+
 

Nann

XLDnaute Nouveau
Re : Un peut d'aide ne serait pas de refus

Salut tout le fil,

En fait, quand je lance la macro, je voudrais obtenir une invite pour cliquer sur mes colonnes de conditionnement, ( ici la colonne E (5 dans mon vb ) et C (3 dans mon vb ) puis sur la colonne de concatennation ( ici B (2 dans mon vb)) et enregistrer ses valeurs pour remplacer le 5 par sa nouvelle valeur, de meme pour le 3 et le 2 que se soit des variables en fait et quelle fonctionne dans la fonction range



Sub Modif_format()
Dim i As Integer
'on fige l'écran
Application.ScreenUpdating = False
'Pour de la ligne 3000 à la ligne 18 un remontant de une ligne
For i = 2993 To 18 Step -1
'Faire tant que : le contenu de la cellule de la colonne E de la ligne actuelle
'et celle du dessus sont identique Et que le contenu de la cellule de la colonne C
'et celle du dessus sont identique
Do While Cells(i, 5 ).Value = Cells(i - 1, 5 ).Value And Cells(i, 3 ) = Cells(i - 1, 3 )
'on concatene la cellule actuelle de la colonne B avec celle de la ligne du dessus
'avec entre les deux : ", "
Cells(i, 2 ) = Cells(i - 1, 2 ) & ", " & Cells(i, 2 )
'puis on efface la ligne du dessus
Rows(i - 1).Delete
'Et on recommance tant que la condition est d'actualitée
Loop
Next i
'on défige l'écran
Application.ScreenUpdating = True
End Sub
 

porcinet82

XLDnaute Barbatruc
Re : Un peut d'aide ne serait pas de refus

re,

Tu peux essayer avec un code de ce genre :
PHP:
Sub Modif_format()
Dim i As Integer
Dim col_cond_1 As String, col_cond_2 As String, col_concat As String
Application.ScreenUpdating = False
col_cond_1 = InputBox("Donner la lettre de 1ère colonne de conditionnement", , "C")
col_cond_2 = InputBox("Donner la lettre de 2nd colonne de conditionnement", , "E")
col_concat = InputBox("Donner la lettre de la colonne de concatennation", , "B")
If col_cond_1 = "" Or col_cond_2 = "" Or col_concat = "" Then GoTo fin
For i = Range("E65536").End(xlUp).Row To Range(Range("E65536").End(xlUp).Address(0, 0)).End(xlUp).Row + 1 Step -1
    On Error GoTo fin:
    Do While Range(col_cond_2 & i).Value = Range(col_cond_2 & i - 1).Value And Range(col_cond_1 & i).Value = Range(col_cond_1 & i - 1).Value
        Range(col_concat & i).Value = Range(col_concat & i - 1).Value & ", " & Range(col_concat & i).Value
        Rows(i - 1).Delete
    Loop
Next i
Application.ScreenUpdating = True
Exit Sub
fin:
Application.ScreenUpdating = True
MsgBox "Vous n'avez pas rentré une données valide pour l'une des colonnes"
Modif_format
End Sub

@+
 

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 914
Membres
103 983
dernier inscrit
AlbertCouillard