Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/11/2011, 12h27   #1
Membre du Club
 
Inscription : octobre 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 47
Points : 40
Points : 40
Par défaut Remplir les cellules vides dans une boucle

Bonjour
J'ai une colonne dans laquelle certaines cellules sont vides.
Je n'arrive pas à écrire la macro qui copie le contenu de la cellule non vide dans la cellule vide en-dessous.
Voici le bout de code sur lequel je bloque :
Code :
1
2
3
4
5
6
7
8
 
For i = 1 To nombre_lignes
        With ActiveSheet
            If IsEmpty(.Cells(3 + i, 7)) Then
                .Cells(3 - i, 7).Copy Destination:=.Cells(3 + i, 7)
            End If
        End With
 Next i
La boucle et le test fonctionnent.
C'est le remplacement de la cellule indicée que je n'arrive pas à faire.

Merci pour votre aide.
zoltar_x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2011, 12h40   #2
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Si on admet que i vaut 4 par exemple

Tu trouve la cellule en ligne 3+i = 3+4= 7 qui est vide
Tu veux qu'elle prenne la valeur de la ligne au dessus, donc la ligne 6

Ton erreurs tu prends la valeur de la cellule 3-i = 3-4 = -1
Au lieu de 3+i-1= 2+i= 2+4= 6

Remplace 3-i par 2+i

Tu peux aussi faire ainsi
Code :
1
2
3
4
5
6
7
8
9
10
'Tu peux également commencer ta boucle à 3
For i = 4 To nombre_lignes
        With ActiveSheet
            If IsEmpty(.Cells(i, 7)) Then
                .Cells(i - 1, 7).Copy Destination:=.Cells(i, 7)
                'Ou si tu veux copier uniquement le texte contenu tu peux faire
                .Cells(i, 7) = .Cells(i - 1, 7)
            End If
        End With
 Next i
Et si tu me dis ou se trouve la colonne qui détermine le nombre de ligne à traité (celle qui à toujours une valeur) il est possible d'utiliser For Each

[Edit]
Code :
1
2
3
4
5
6
7
8
9
' autre solution
'Je part du principe que la colonne A contient toujours une valeur et dimensionne donc le nombre de ligne à traiter
Dim TheCell As Range
 
'Je regarde la derniere cellule non vide de la colonne A puis je me déplace (Offset) de 6 colonne vers la droite pour aller à la colonne G
'Si tu change la colonne de référence n'oublie pas de changer le 6 aussi (exemple pour la colonne B se sera 5 ;)
For Each TheCell In .Range("G4", .Cells(.Rows.Count, "A").End(xlUp).Offset(0, 6))
    If TheCell = "" Then TheCell = TheCell.Offset(-1)
Next
[/Edit]

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2011, 12h45   #3
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
Bonjour,

Une solution avec Offset

Code :
Cells(3 + i, 7).Value = Cells(3 + i, 7).Offset(-1, 0).Value
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2011, 13h11   #4
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Bonjour à tous
Dans le même sens, et en présence d'un grands nombre de données, il faudrait mieux travailler avec une variable tableau dont proposition à adapter ci-après
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Remplissage()
Dim LastLig As Long, i As Long
Dim TB
 
Application.ScreenUpdating = False
'Adapte le nom de ta feuille
With Worksheets("Feuil1")
    'Ligne de la dernière cellule remplie de la colonne A, Adapte la colonne avec laquelle tu cherche le nombre de lignes
    LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
    'Dans Tb on prends les données de la colonne H à partir de la ligne 4
    TB = .Range("H4:H" & LastLig)
    'On fais notre boucle sur les éléments de Tb et en remplit les vides
    For i = 2 To UBound(TB, 1)
        If TB(i, 1) = "" Then TB(i, 1) = TB(i - 1, 1)
    Next i
    'On retransfère Tb vers la colonne H
    .Range("H3:H" & LastLig) = TB
End With
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2011, 18h35   #5
Membre du Club
 
Inscription : octobre 2007
Messages : 47
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 47
Points : 40
Points : 40
Merci pour vos réponses, ça fonctionne impec.
zoltar_x est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h45.


 
 
 
 
Partenaires

Hébergement Web