IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Rechercher et supprimer les lignes vides d'un tableau excel via access


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut Rechercher et supprimer les lignes vides d'un tableau excel via access
    Bon je viens de me rendre compte qu'il ne faut poser qu'un probleme par post donc j'en ouvre un nouveau pour ce probleme de ligne vides.

    Donc voila mon probleme. J'effectue une mise a jour de ma base de donnees par l'intermediaire d'un module VB qui me formate un tableau excel de facon a regrouper toutes les donnees du classeur sur la premiere feuille puis ensuite importe cette feuille sous excel.

    Lors de cette importation, il reste des lignes blanches sur cette feuille qu'il faudrait que je supprime avant importation.

    Donc voila ma requete: serait-il possible de coder la recherche de lignes vides ainsi que leur suppression?

    Voila mon module de formatage du fichier excel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
     
    ' Entries : strBook <- Book path.
    '          strSheet  <- Name of the sheet to delete.
     
    Function UpdatePrepare( _
      ByVal strBook As String, _
      ByVal strSheet As String)
     
    Dim xlApp As Excel.Application
    Dim wbk As Excel.Workbook
    Dim Feuille As Worksheet
    Dim PlageSource As Range ' définit la plage source dans les feuilles qui seront transférées
    Dim CelluleCible As Range ' définit la première cellule en A de la feuille 1 disponible
     
    ' Open the book
    Set xlApp = CreateObject("Excel.Application")
    Set wbk = xlApp.Workbooks.Open(strBook)
     
    ' Desactivate Excel messages
    xlApp.DisplayAlerts = False
     
        For Each Feuille In Worksheets
            If Feuille.Name <> "A" Then
                Set CelluleCible = Worksheets("A").Cells(Rows.Count, 1).End(xlUp)(2)
                Feuille.Rows("1:3").Delete
                Set PlageSource = Feuille.Range("a1:ap" & Feuille.Cells(Rows.Count, 1).End(xlUp).Row)
                PlageSource.Copy Destination:=CelluleCible
            End If
        Next Feuille
     
    Worksheets("A").Rows("1:2").Delete
    Worksheets("A").Columns("g").Delete
    wbk.Close True
     
    ' Close Excel
    xlApp.Quit
    Set xlApp = Nothing
    End Function
    Merci d'avance.

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Voici une procédure générique qui supprime les lignes vides d'une feuille.

    Il y a probablement plus beau et plus performant, mais le résultat est là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub SupprimerLignesVidesFeuille(Feuille As Worksheet)
        Dim ligne As Long
     
        For ligne = Feuille.Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
            If Feuille.Rows(ligne & ":" & ligne).Cells.SpecialCells(xlCellTypeBlanks).Count = Feuille.UsedRange.Columns.Count Then _
                Feuille.Rows(ligne & ":" & ligne).Delete
        Next ligne
        Debug.Print Feuil2.UsedRange.Columns.Count
     
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    J'ai integre ca a mon code mais j'obtient une erreur 91 comme quoi "Object variable or With block variable non set"

    Pourtant tout est deja declare.

    Voila ce que donne le code si vous pouvez me dire ce qui cloche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    ' Entries : strBook <- Book path.
    '          strSheet  <- Name of the sheet to delete.
     
    Function UpdatePrepare( _
      ByVal strBook As String, _
      ByVal strSheet As String)
     
    Dim xlApp As Excel.Application
    Dim wbk As Excel.Workbook
    Dim Feuille As Worksheet
    Dim PlageSource As Range ' définit la plage source dans les feuilles qui seront transférées
    Dim CelluleCible As Range ' définit la première cellule en A de la feuille 1 disponible
    Dim ligne As Long
    ' Open the book
    Set xlApp = CreateObject("Excel.Application")
    Set wbk = xlApp.Workbooks.Open(strBook)
     
    ' Desactivate Excel messages
    xlApp.DisplayAlerts = False
     
        For Each Feuille In Worksheets
            If Feuille.Name <> "A" Then
                Set CelluleCible = Worksheets("A").Cells(Rows.Count, 1).End(xlUp)(2)
                Feuille.Rows("1:3").Delete
                Set PlageSource = Feuille.Range("a1:ap" & Feuille.Cells(Rows.Count, 1).End(xlUp).Row)
                PlageSource.Copy Destination:=CelluleCible
            End If
        Next Feuille
     
        For ligne = Feuille.Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
            If Feuille.Rows(ligne & ":" & ligne).Cells.SpecialCells(xlCellTypeBlanks).Count = Feuille.UsedRange.Columns.Count Then _
                Feuille.Rows(ligne & ":" & ligne).Delete
        Next ligne
        Debug.Print Feuil2.UsedRange.Columns.Count
     
     
     
     
    Worksheets("B-C").Delete
    Worksheets("A").Rows("1:2").Delete
    Worksheets("A").Columns("g").Delete
     
     
    wbk.Close True
     
    ' Close Excel
    xlApp.Quit
    Set wbk = Nothing
    Set xlApp = Nothing
    End Function
    D'autant plus que mon code ne ferme pas completement excel qui reste qctif bien qu'on ne voit pas la fenetre mais il est toujours present dans le gestionnaire des taches. Si ca aussi on pouvais le regler ca serait genial.

    Merci beaucoup

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Désolé... J'ai laissé trainé une coquille.

    Il faut supprimer la ligne
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Desole mais meme en enlevant ce que tu m'a dit il me renvoie la meme erreur en pointant sur la premiere ligne de ton code.

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Ben oui.

    Tu as pris une partie de mon code, qui utilise un objet nommé Feuille, et tu l'a mis dans ton code, qui utilise aussi un objet feuille. Mais tu as mis ma partie de code en dehors de la boucle for each feuille......

    Le code que je t'ai donné est "générique". C'est-à-dire que (en ôtant la ligne Debug.print), il fonctionne hors d'une autre procédure. Ce code EST une procédure complète qui doit recevoir en paramètre un objet Worksheet. Il est donc préférable de laisser mon code tel quel, hors d'une procédure, et d'appeler ma procédure en lui passant l'argument voulu.

    Dans ta procédure de "consolidation" des feuilles, il est à mon avis plus "perfomant" de l'appeller uniquement sur la feuille de consolidation.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Desole mais je ne vois pas du tout ce que tu me dis de faire. Comment dois-je faire pour le placer hors de ma procedure? Dois-je creer un autre module?

    S'il te plait explique moi car je te le rappel je suis novice en VB!lol

    Merci d'avance

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Ma procédure fonctionne un peu à l'instar de ta fonction UpdatePrepare.

    Elle a juste besoin d'un paramètre constitué d'un objet Worksheet.

    Elle peut être appelée par n'importe quel code, par exemple (en adaptant le nome de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SupprimerLignesVidesFeuille worksheets("MaFeuille")
    Tu remarqueras que je ne passe pas le nom de la feuille, mais la feuille elle-même.
    Donc, le plus simple à mon avis, est de mettre la ligne renseignée plus haut tout à la fin de la procédure qui transfère les données sur la feuille de consolidation, en remplaçant simplement "MaFeuille" par le nom de la feuille de consolidation
    En clair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Function UpdatePrepare( _
        ByVal strBook As String, _
        ByVal strSheet As String)
        ...
        ...
        SupprimerLignesVidesFeuille worksheets("A")  
        Worksheets("B-C").Delete
        Worksheets("A").Rows("1:2").Delete
        Worksheets("A").Columns("g").Delete
     
     
        wbk.Close True
     
        ' Close Excel
        xlApp.Quit
        Set wbk = Nothing
        Set xlApp = Nothing
    End Function
    en supprimant bien sûr la partie de ma procédure que tu as ajoutée à ton code (et en supprimant le Debug... qui traîne) et en copiant ma procédure dans un module standard (cela peut être le même que celui qui contient ta fonction, mais il doit être standard (pas un module de feuille ou de classeur).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Ah je suis vert!!!!! sur le principe maintenant ca fonctionne. Le seul hic c'est que je n'ai en fait aucune ligne vide!!!!!

    J'ai en fait des points inutiles qui se baladent sur ces lignes qui dans le fichiers de base servaient de separation. Par contre serait-il possible d'adapter ca pour qu'il supprime toute la ligne si la 1ere cellule de la ligne est vide??

    Quoi qu'il en soit merci pour tes explications!!!! Chaque jour passe ici m'eclaire un peu plus!

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 903
    Points
    55 903
    Billets dans le blog
    131
    Par défaut
    Tant mieux si tu progresses...

    Dans ma procédure, il y a une ligne qui teste le nombre de cellules vides. Il faut simplement remplacer ce test pour tester si c'est la cellule de la première colonne de la ligne qui est vide ou pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For ligne = Feuille.Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
            If Feuille.cells(ligne,1)="" Then _
                Feuille.Rows(ligne & ":" & ligne).Delete
        Next ligne
    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup franchement ca marche au poil!!!!!!

    Merci pour ton temps Pierre.

    A tres bientot pour un nouveau topic car le projet que je dois mener surpasse de loin la plupart de mes connaissances en Access et VB!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] (Cacher) modifié en : Supprimer les lignes vides dans un tableau
    Par azerty1956 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 15/04/2009, 18h12
  2. Réponses: 1
    Dernier message: 12/12/2006, 12h00
  3. Supprimer les lignes vides d'un document Word
    Par Jerfa dans le forum VBA Word
    Réponses: 4
    Dernier message: 28/08/2006, 16h12
  4. Réponses: 2
    Dernier message: 04/05/2006, 13h10
  5. supprimer les lignes vides?
    Par VinnieMc dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo