[VBA] Remplir cellules sous condition sans laisser de cellule vide

mdeb678

XLDnaute Nouveau
Bonjour,

Je souhaiterai bénéficier d'un peu d'aide pour développer un programme VBA permettant de :

- Remplir la cellule A1 avec le contenu de la cellule C1 d'une autre feuille si l'année en D1 est 2013.
- Si l'année en D1 n'est pas 2013, effectuer un test sur les cellule suivantes jusqu'à ce que la condition soit remplie pour remplir la cellule A1 (ne pas la laisser vide).

Merci beaucoup pour votre aide !!!
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : [VBA] Remplir cellules sous condition sans laisser de cellule vide

Mdeb bonjour et bienvenu, bonjour le forum,

Tes explications ne sont pas claires (D1 se trouve dans quel onglet ?) et tu n'as pas daigné mettre un petit fichier exemple (lis vite la Lien supprimé du forum qui donne tous les bons plans pour obtenir de l'aide rapidement)... Malgré cela, je te propose, en pièce jointe, un exemple à adapter à ton cas.
Le code :
Code:
Sub Macro1()
Dim oo As Object 'déclare la variable oo (Onglet Origine)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim dest As Range 'déclare la variable dest (cellule de Destination)

Set oo = Sheets("Origine") 'à adapter à ton cas (c'est l'onglet ou seront copiées les données)
Set os = Sheets("Source") 'à adapter à ton cas (c'est "l'autre feuille" dont tu parles)
dl = os.Cells(Application.Rows.Count, 4).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 4 (=D) de l'onglet os
Set pl = os.Range("D1:D" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    'définit la cellule de destination dest (A1 si A1 est vide, sinon la première cellule vide en colonne 1 (=A) de l'onglet oo
    Set dest = IIf(oo.Range("A1").Value = "", oo.Range("A1"), oo.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
    'si la valeur de la cellule cel est "2013" alors dest prend la valeur de cel déclalée d'une colonne à gauche
    If cel.Value = 2013 Then dest.Value = cel.Offset(0, -1).Value
Next cel 'prochaine cellule de la boucle
End Sub
le fichier :

[Édition]
Bonjour Flob on s'est croisé...
 

Pièces jointes

  • Mdeb_v01.xlsm
    17.3 KB · Affichages: 88

mdeb678

XLDnaute Nouveau
Re : [VBA] Remplir cellules sous condition sans laisser de cellule vide

Bonjour Flob, Bonjour Flob,

Merci beaucoup pour votre réponse rapide et merci Robert pour ton travail. Il est vrai que je n'ai pas bien détaillé mon problème et je n'ai pas pensé à joindre un fichier. J'ai posté ce message de manière un peu précipité. Veuillez m'en excuser.

Donc reprenons les choses correctement avec quelques modifications.

Je souhaiterais remplir la colonne A (à partir de A8) de l'onglet 1 (nommé 2013) avec les noms figurant en colonne A de l'onglet 2 (Prospects ERP) en respectant les conditions suivantes :
1. Si la date est comprise entre le 1er janvier 2013 et le 31 janvier 2013 (colonne D, onglet 2)
2. Si le statut prospect est "ST_DONE" (colonne B, onglet 2)

Je vous joint cette fois le fichier pour une meilleur compréhension.

Encore une fois merci pour tout !
 

Pièces jointes

  • Pilotage commercial copie.xlsm
    35.9 KB · Affichages: 190

Robert

XLDnaute Barbatruc
Repose en paix
Re : [VBA] Remplir cellules sous condition sans laisser de cellule vide

Bonjour le fil, bonjour le forum,

Essaie comme ça :
Code:
Sub Macro1()
Dim oo As Object 'déclare la variable oo (Onglet Origine)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim dest As Range 'déclare la variable dest (cellule de Destination)

Set oo = Sheets("2013") 'à adapter à ton cas (c'est l'onglet ou seront copiées les données)
Set os = Sheets("Prospects ERP") 'à adapter à ton cas (c'est "l'autre feuille" dont tu parles)
dl = os.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet os
Set pl = os.Range("A2:A" & dl) 'définit  la plage pl
'filtre l'onglet os colonne D entre les dates de 1/1/2013 à 31/1/2013
os.Range("A1").AutoFilter Field:=4, Criteria1:=">=" & CStr(DateSerial(2013, 1, 1)), Operator:=xlAnd, Criteria2:="<=" & CStr(DateSerial(2013, 1, 31))
'filtre l'onglet os colonne B pour la valeur "ST_DONE"
os.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="ST_DONE"
On Error GoTo fin 'si aucune ligne visible, va à l'étiquette "fin"
For Each cel In pl.SpecialCells(xlCellTypeVisible) 'boucle sur toutes les cellules visibles de la plage pl
    'définit la cellule de destination dest (A1 si A1 est vide, sinon la première cellule vide en colonne 1 (=A) de l'onglet oo
    Set dest = IIf(oo.Range("A8").Value = "", oo.Range("A8"), oo.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
    cel.Copy dest 'ou dest.Value = cel.Value si tu ne veux pas la mise en forme
Next cel 'prochaine cellule de la boucle
fin: 'étiquette
os.Range("A1").AutoFilter 'supprime le filtre automatique
End Sub

Le filtre entre les dates ne fonctionne pas chez moi mais dès que j'utlise un filtre avec des dates ça plante systématiquement. Le pire c'est que j'utilise l'enregistreur de macro pour le code...
 

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 192
Membres
103 152
dernier inscrit
Karibu