Propagation d'information

Fermé
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018 - 23 sept. 2016 à 16:19
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018 - 26 sept. 2016 à 14:34
Bonjour à tous,

Je vous explique mon pb:

J'ai une colonne A avec des infos provenant d'un autre fichier.

La colonne est composée comme suit:

A1: Pomme
A2:
A3:
A4: Poire
A5:
A6: Fraise
A7:
A8:
A9: Abricot
A10:

Maquestion est la suivante:
Comment, grâce à une macro, propager l'info qui se trouve au-dessus dans les lignes suivantes.
En résumé je souhaiterais que A2 et A3 = Pomme, que A5 = Poire, que A7 et A8 = Fraise et A10 = Abricot.

Petite subtilité: l'info A4 peut se trouver en A6 ou en A7 lors de la prochaine extraction de données. Dans la macro nous ne pouvons pas faire référence à A4 pour la poire par exemple, car "poire" pourrait se trouver en A10 lors de la prochaine extraction par exemple.

J'espère avoir été assez clair.

D'avance merci pour votre aide.


Xenos

3 réponses

ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
23 sept. 2016 à 17:12
Bonjour

Option Explicit

Const co As Byte = 1
Const lideb As Byte = 2

Public Sub OK()
Dim li1 As Long, li2 As Long, lifin As Long, s As String
lifin = Cells(Rows.Count, co).End(xlUp).Row
li1 = lideb
Do
s = Cells(li1, co)
li2 = li1 + 1
While Cells(li2, co) = "" And li2 < lifin
Cells(li2, co) = s
li2 = li2 + 1
Wend
li1 = li2
Loop Until li1 >= lifin
Cells(li1 + 1, co) = Cells(li1, co)
End Sub

Cdlmnt
0
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
25 sept. 2016 à 20:20
Bonsoir,

Je viens de tester le code et il est presque parfait... bravo

En fait presque pck concernant la dernière information à propager, le code ne la recopie qu'une fois, je suppose pck il s'arrete à la première ligne vide... Serait-il possible que la macro propage la dernière info jusqu'à la ligne qui détient la dernière cellule renseignée en colonne D?

Ensuite, 2 questions:
1) est-ce que je peux intégrer ce code au milieu d'une macro déjà existente ou dois-je l'exécuter individuellement de ma macro principale? L'idée n'est d'avoir qu'une seule macro..

2) Est ce code s'applique à tous les onglets ou seulement sur celui qui est actif? D'après ce que j'ai testé il me semble que c'est uniquement l'onglet actif...

Finalement, pourrais-tu me donner quelques explications sur ton code pck ca paraît bien différent de ce que j'ai pu voir jusqu'à maintenant...

Encore merci et bon boulot


Xenos
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
26 sept. 2016 à 07:15
Bonjour Xenos1705,
Salutations ccm81,

Voici un code qui s’applique à plusieurs feuilles (Feuil1 et Feuil2) :
Sub Test()
Dim Ws As Worksheet
Dim DerLig As Long
Dim Cel As Range, Memo As Range
For Each Ws In Worksheets
If Ws.Name = "Feuil1" Or Ws.Name = "Feuil2" Then
DerLig = Ws.Range("D" & Rows.Count).End(xlUp).Row
Set Memo = Ws.Range("A1")
For Each Cel In Ws.Range("A2:A" & DerLig)
If Cel = "" Then
Cel.Value = Memo.Value
Else
Set Memo = Cel
End If
Next Cel
End If
Next Ws
End Sub

Intégrer le code au milieu d'une procédure déjà existante n'est pas forcément judicieux.
Tu peux laisser le code dans une procédure isolée et faire appel à cette procédure depuis ton programme principal. Cela pourra te permettre de discerner plus facilement les différents traitements.

A+
0
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 08:32
Hello,

Merci pour le complément mais je voulais que le code ne s'applique qu'à un onglet donc c'est parfait.

Par contre t'aurais une idée de comment faire ce qui suit:

concernant la dernière information à propager, le code ne la recopie qu'une fois, je suppose pck il s'arrete à la première ligne vide... Serait-il possible que la macro propage la dernière info jusqu'à la ligne qui détient la dernière cellule renseignée en colonne D?

Merci

A+
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523 > Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 09:02
Telle qu'elle est conçue, la procédure effectue déjà la recopie jusqu'à la dernière ligne renseignée dans la colonne D.
J'ai modifié le code pour ne prendre en compte qu'une seule feuille (Feuil1).
Sub Test()
Dim DerLig As Long
Dim Cel As Range, Memo As Range
With Worksheets("Feuil1")
DerLig = .Range("D" & Rows.Count).End(xlUp).Row
Set Memo = .Range("A1")
For Each Cel In .Range("A2:A" & DerLig)
If Cel = "" Then
Cel.Value = Memo.Value
Else
Set Memo = Cel
End If
Next Cel
End With
End Sub

A+
0
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 09:36
Re,

Alors j'ai testé et c'est parfait je t'en remercie.

J'ai également isolé la procédure comme tu m'as conseillé et c'est effectivement plus clair.

Franchement, vous assurez, encore merci.

A+


Xenos
0
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 11:11
Re,

Finalement, j'ai encore deux question:

1) Comment adapter le code pour qu'il copie la formule renseignée plutôt que la valeur?

2) Comment faire pour que le code s'applique à plusieurs colonnes afin que toutes les colonnes qui possèdent des lignes vides soient renseigées. Les colonnes doivent copier les infos de sa propre colonne et non celle des autres.

J'espère avoir été assez clair.

Redites mois si jamais.

Merci
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523 > Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 11:37
De quelle formule parles-tu ?
De quelles colonnes parles-tu ?

Tu dois comprendre que sans exemple concret, précis et complet, la résolution demande un don de divination que je n'ai pas.

Pour joindre un fichier, tu peux utiliser https://www.cjoint.com/

A+
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
26 sept. 2016 à 14:03
Pour une colonne supplémentaire, ce n’est pas très compliqué. Il suffit de relancer la procédure sur la deuxième colonne après avoir adapté les lignes de code :
        Set Memo = .Range("B1")
For Each Cel In .Range("B2:B" & DerLig)

Pour la formule, il faut savoir ce que contiennent réellement les cellules de la colonne concernée (formule, valeur ou rien).
S’il s’agit simplement de copier la formule à la place la valeur, tu peux utiliser
Cel.Formula = Memo.Formula


A+
0
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 14:16
Hello,

Je venais à l'instant d'essayer:
Cel.Formula = Memo.Formula
mais le problème c'est qu'il copie exactement la formule et la propage telle quelle alors je me retrouve avec le même résultat sur toutes les lignes.

Par exemple j'ai une formule en B2 "=DATEVAL(A2)" et faisant ce qui est décrit ci-dessus je me retrouve avec "=DATEVAL(A2)" sur toutes les lignes alors que je souhaiterais "=DATEVAL(A3)" sur la ligne B3, "=DATEVAL(A4)" sur la ligne B4 est ainsi de suite.

Etant donné que j'ai l'info en B2 et que le reste de la colonne est vide, il serait peut être plus simple de dire à la macro de copier la formule qui se trouve en B2 et de la propager jusqu'en B???.

B??? corespondrait à la dernière ligne renseignée en colonne G.

Qu'en penses-tu?

Merci
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523 > Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 14:24
Est-ce que tu commences à sentir la difficulté à vouloir résoudre un problème lorsqu'on a pas tous les tenants et aboutissants ?
Teste avec :
Cel.FormulaR1C1 = Memo.FormulaR1C1


A+
0
Xenos1705 Messages postés 93 Date d'inscription lundi 19 octobre 2015 Statut Membre Dernière intervention 11 juin 2018
26 sept. 2016 à 14:34
J en ai réellement conscience et m en excuse.

C est exactement ce dont j'avais besoin.

Je te remercie encore pour tt.
0