Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.

Réponse
 
Outils de la discussion
Vieux 10/10/2008, 08h09   #1 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
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 :
 
' 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.
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 09h39   #2 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
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 :
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
 
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 10h02   #3 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
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 :
' 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
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 10h38   #4 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut

Désolé... J'ai laissé trainé une coquille.

Il faut supprimer la ligne
Code :
debug.print feuil2...
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 10h51   #5 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
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.
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 11h25   #6 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
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.
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 11h51   #7 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
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
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 12h18   #8 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
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 :
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 :
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).
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 12h30   #9 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
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!
damfury est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 12h41   #10 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
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 :
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?
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 13h22   #11 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: octobre 2008
Localisation: Afrique du Sud
Âge: 22
Messages: 22
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!!
damfury est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ACCESSF.A.Q AccessF.A.Q VBATutorielsSourcesOutilsLivresAccess TVAccess 2007

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide