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/01/2012, 00h56   #1
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Par défaut Extraction de lignes vides

Bonjour à tous,

J'aimerais extraire toutes les lignes contenant un vide (incompete) avec ce code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub CommandButton1_Click()
 
    Dim Cel As Range
    Dim LastLg As Integer
 
    LastLg = Sheets("BD").[A65000].End(xlUp).Row
    MsgBox "LastLg = " & LastLg
    Sheets("Incomplets").Range([A3], Range("F" & [A65000].End(xlUp).Row)).ClearContents
 
    For Each Cel In Sheets("BD").Range("A2:F" & LastLg).Rows
        If Application.CountBlank(Cel) > 0 Then
            MsgBox "Cel adddresse = " & Cel.Address & vbCrLf & _
                   "Cel.row = " & Cel.Row & vbCrLf & _
                   "Range(A" & Cel.Row & ":K" & Cel.Row & ")"
            Sheets("BD").Range("A" & Cel.Row & ":K" & Cel.Row).Copy Sheets("Incomplets").Range("A3")
        End If
    Next Cel
 
End Sub
Mias j'ai une erreur dans cette ligne :

Code :
Sheets("Incomplets").Range([A3], Range("F" & [A65000].End(xlUp).Row)).ClearContents
Merci.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 08h04   #2
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Tu as tout intérêt à indiquer explicitement sur quelle feuille tu effectues tes opérations.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub CommandButton1_Click()
    Dim Cel As Range
    Dim LastLg As Long
    Dim Ws1 As Worksheet
    Dim Ws2 As Worksheet
 
    Set Ws1 = Worksheets("BD")
    Set Ws2 = Worksheets("Incomplets")
    LastLg = Ws1.[A65000].End(xlUp).Row
    MsgBox "LastLg = " & LastLg
    Ws2.Range(Ws2.Range("A3"), Ws2.Range("F" & Ws2.[A65000].End(xlUp).Row)).ClearContents
    For Each Cel In Ws1.Range("A2:F" & LastLg).Rows
        If Application.CountBlank(Cel) > 0 Then
            MsgBox "Cel adddresse = " & Cel.Address & vbCrLf & _
                   "Cel.row = " & Cel.Row & vbCrLf & _
                   "Range(A" & Cel.Row & ":K" & Cel.Row & ")"
            Ws1.Range("A" & Cel.Row & ":K" & Cel.Row).Copy Ws2.Range("A3")
        End If
    Next Cel
    Set Ws1 = Nothing
    Set Ws2 = Nothing
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 10h41   #3
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Bonjour gF

J'ai un souci.

Le copiage des lignes ne se fait que sur la premiere ligne de la feuille "Incomplets".

Pourtant j'ai bien changé cette ligne :

Code :
Ws1.Range("A" & Cel.Row & ":K" & Cel.Row).Copy Ws2.Range("A3")
Par :

Code :
Ws1.Range("A" & Cel.Row & ":F" & Cel.Row).Copy Ws2.Range("A" & Ws2.[A65000].End(xlUp).Row)
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h30   #4
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Lorsque tu écris
Code :
Ws1.Range("A" & Cel.Row & ":F" & Cel.Row).Copy Ws2.Range("A3")
tu indiques la plage à copier et l’emplacement de la première cellule, en haut à gauche, où sera copiée cette plage.

Exemple avec Cel.Row=1

Code :
Ws1.Range("A1:F1”).Copy Ws2.Range("A3")
Je copie la plage A1:F1 de la feuille1 dans la feuille2, à partir de la cellule A3. Ma plage est donc copiée dans la feuille 2 en A3:F3.

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 12h46   #5
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Salut,

C'est pour cela que je calcul la dernière ligne dans Ws2, avant chaque extration.

Et même en décalant la dernière ligne d'une position en bas, j'aurais des lignes copiées en A2.

J'ai remplacé par cette ligne, mais toujours le même résultat :

Code :
Ws1.Range("A" & Cel.Row & ":F" & Cel.Row).Copy Ws2.Range("A" & Ws2.[A65000].End(xlUp).Offset(1, 0).Row)
Un truc m'échappe
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 13h25   #6
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Je pense qu'on n'arrive pas à se comprendre .

La copie s'effectue avec
Code :
Ws1.Range("A" & Cel.Row & ":F" & Cel.Row).Copy
Tu ne copie qu'une ligne, celle qui porte le numéro Cel.Row.

Pour le collage dans la feuille 2, il ne sert à rien d'écrire
Code :
Ws2.Range("A" & Ws2.[A65000].End(xlUp).Offset(1, 0).Row)
car tu ne vas pas coller autre chose que ce que tu as copié.

Si tu souhaites copier plusieurs lignes, c'est sur la première partie qu'il faut le déclarer
Exemple avec la copie de 5 lignes
Code :
Ws1.Range("A" & Cel.Row & ":F" & Cel.Row+5).Copy
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h26   #7
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Mon problème réside dans la destination de lignes trouvées dans la première feuille.

Pour mieux éclairer le problème, un exemple en PJ.
Fichiers attachés
Type de fichier : zip ExtractionLigneVides.zip (19,4 Ko, 4 affichages)
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 15h16   #8
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
O.K c'est vu.
Il suffit d'incrémenter LastCopy après chaque copie (LastCopy = LastCopy + 1).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub CommandButton1_Click()
    Dim Cel As Range
    Dim LastLg As Long, LastCopy As Long
    Dim Ws1 As Worksheet
    Dim Ws2 As Worksheet
 
    Set Ws1 = Worksheets("BD")
    Set Ws2 = Worksheets("Incomplets")
    LastLg = Ws1.[A65000].End(xlUp).Row
    LastCopy = Ws2.[A65000].End(xlUp).Row
 
    MsgBox "LastLg in BD = " & LastLg & vbCrLf & _
           "LastCopy in Incomplets = " & LastCopy
 
    Ws2.Range(Ws2.Range("A4"), Ws2.Range("F" & LastCopy)).ClearContents
 
    For Each Cel In Ws1.Range("A2:F" & LastLg).Rows
        If Application.CountBlank(Cel) > 0 Then
            MsgBox "Cel adddresse = " & Cel.Address & vbCrLf & _
                   "Cel.row = " & Cel.Row & vbCrLf & _
                   "Range(A" & Cel.Row & ":K" & Cel.Row & ")" & vbCrLf & _
                   "Copy dans incomplets à la ligne A" & Ws2.[A65000].End(xlUp).Row + 1    ' Ws2.[A65000].End(xlUp).Offset(1, 0).Row
 
            Ws1.Range("A" & Cel.Row & ":F" & Cel.Row).Copy Ws2.Range("A" & LastCopy + 1)
            LastCopy = LastCopy + 1
            Ws2.Select
        End If
    Next Cel
    Set Ws1 = Nothing
    Set Ws2 = Nothing
End Sub
Cordialement.

Je te retourne le code après test et corrections.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub CommandButton1_Click()
    Dim Cel As Range
    Dim LastLg As Long, LastCopy As Long
    Dim Ws1 As Worksheet
    Dim Ws2 As Worksheet
 
    Set Ws1 = Worksheets("BD")
    Set Ws2 = Worksheets("Incomplets")
 
    DerLigWs1 = Ws1.Range("A" & Ws1.Rows.Count).End(xlUp).Row
    DerLigWs2 = Ws2.Range("A" & Ws2.Rows.Count).End(xlUp).Row
    LigneAjout = 4
    MsgBox "Dernière ligne renseignée dans BD = " & DerLigWs1 & vbCrLf & _
           "Dernière ligne renseignée dans Incomplets = " & DerLigWs2
 
    Ws2.Range(Ws2.Range("A4"), Ws2.Range("F" & DerLigWs2 + 1)).Delete Shift:=xlUp
 
    For Each Cel In Ws1.Range("A2:F" & DerLigWs1).Rows
        If Application.CountBlank(Cel) > 0 Then
            Ws1.Range("A" & Cel.Row & ":F" & Cel.Row).Copy Ws2.Range("A" & LigneAjout)
            LigneAjout = LigneAjout + 1
        End If
    Next Cel
    Ws2.Select
 
    Set Ws1 = Nothing
    Set Ws2 = Nothing
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 19h28   #9
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Bonsoir gFZT82,

Un code simple et très clair

Merci infinement.

Salutations
apt 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 20h45.


 
 
 
 
Partenaires

Hébergement Web