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

  • Initiateur de la discussion Initiateur de la discussion mdeb678
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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 !!!
 
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

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

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...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
12
Affichages
1 K
Retour