VBA - Selections lignes tableau sous Excel

VBA - Selections lignes tableau sous Excel - VB/VBA/VBS - Programmation

Marsh Posté le 25-02-2011 à 05:30:29    

Bonjour,
 
J'ai fait une recherche sur le forum et je n'ai rien trouvé qui corresponde à mon problème alors voilà:
J'ai réalisé sous VBA un programme me créant un tableau Excel. Dans la suite de mon programme, je souhaiterai sélectionner toutes les lignes de ce tableau pour pouvoir, entre autre, trier les données à partir de la première colonne. Il est possible que certaines lignes soient vides sauf la première colonnes, du coup la "fonction" curent region ne fonctionne pas. Le nombre de ligne peux être variable mais pas le nombre de colonne.... ça ressemble à quelque chose de ce genre:
 
 
...
5 2 1 14 25
4
3 1 2 30 12
2  
1 9 4 15 78
 
Merci d'avance de votre aide car là je ne vois vraiment pas comment démarrer la macro.

Reply

Marsh Posté le 25-02-2011 à 05:30:29   

Reply

Marsh Posté le 25-02-2011 à 10:00:27    

Bonjour,
 
Voici un petit bout de code qui devrait répondre au problème.
 

Code :
  1. Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  2. '*************************'
  3. '* Sélection de ligne(s) *'
  4. '*************************'
  5. 'Déclaration variable(s)'
  6. Dim DEB As Integer
  7. Dim FIN As Integer
  8. 'Attribution des valeurs'
  9. DEB = 1
  10. FIN = Range("A65536" ).End(xlUp).Row
  11. 'Sélection'
  12. Range("A" & DEB, "A" & FIN).EntireRow.Select
  13. End Sub


 
Il ne reste plus qu'a ajouter la commande "Sort" pour trier les lignes.
 
@bientôt

Reply

Marsh Posté le 25-02-2011 à 10:56:44    

Ouaouh!!! quelle rapidité!! je m'empresse de tester ceci et te tiens au courant... quoiqu'il en soit, merci!!!!
 
EDIT: Et bien avec une petite adaptation à mon besoin, cela à parfaitement fonctionné... encore merci.
Par contre, histoire d'améliorer ma compréhension, que veulent dire en "bon français" les lignes de programme?


Message édité par fidoboulette le 25-02-2011 à 13:39:08
Reply

Marsh Posté le 06-03-2011 à 15:11:23    

mmarle a écrit :

Bonjour,
 
Voici un petit bout de code qui devrait répondre au problème.
 

Code :
  1. Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  2. '*************************'
  3. '* Sélection de ligne(s) *'
  4. '*************************'
  5. 'Déclaration variable(s)'
  6. Dim DEB As Integer
  7. Dim FIN As Integer
  8. 'Attribution des valeurs'
  9. DEB = 1
  10. FIN = Range("A65536" ).End(xlUp).Row
  11. 'Sélection'
  12. Range("A" & DEB, "A" & FIN).EntireRow.Select
  13. End Sub


 
Il ne reste plus qu'a ajouter la commande "Sort" pour trier les lignes.
 
@bientôt


 
Bonjour, bonjour,
 
bon ben finalement, je reviens vers vous car je ne m'en sort pas finalement avec le tri....
Alors voila le code que j'ai ecrit à partir de la réponse de mmarle:
 

Code :
  1. Sub Reinit_R14()
  2. '
  3. Sheets("R14" ).Select
  4. Dim DEB As Integer
  5. Dim FIN As Integer
  6. DEB = 9
  7. FIN = Range("A65536" ).End(xlUp).Row
  8. Range("A" & DEB, "H" & FIN).Select
  9. ActiveWorkbook.Worksheets("R14" ).Sort.SortFields.Clear
  10. ActiveWorkbook.Worksheets("R14" ).Sort.SortFields.Add Key:=Range("A9" ), _
  11.         SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  12. End Sub


 
Sur la ligne Range, si j'ai bien compris, on peut dire à la macro où se trouvent les données: ici entre les colonnes A et H.... jusqu'ici, tout fonctionne bien, j'ai bien tout mon tableau qui est sélectionné au lancement de la macro....
 
Après, à partir de l'enregistreur de macro, j'ai lancé un tri et recopié le code.... mais là, rien ne se fait... ce que je voudrai, c'est que le tri soit croissant à partir de la colonne A.... je suppose que c'est pas très dur à corriger mais je ne vois pas où est le problème...  
D'ailleurs, si quelqu'un pouvait m'expliquer la signification de la ligne 9: "ActiveWorkbook.Worksheets("R14" ).Sort.SortFields.Clear" ce serait très gentil.
merci de votre aide.
 
EDIT: Bon ben je viens de résoudre mon pb en rajoutant les lignes suivantes (merci l'enregistreur :D ):

Code :
  1. With ActiveWorkbook.Worksheets("R14" ).Sort
  2.         .SetRange Range("A" & DEB, "H" & FIN)
  3.         .Header = xlGuess
  4.         .MatchCase = False
  5.         .Orientation = xlTopToBottom
  6.         .SortMethod = xlPinYin
  7.         .Apply
  8.     End With


 
Je ne sais pas si la ligne setRange est orthodoxe mais ça fonctionne bien.... peut être avez vous plus simple?


Message édité par fidoboulette le 06-03-2011 à 15:22:16
Reply

Marsh Posté le 07-03-2011 à 10:39:26    

Salut fidoboulette,
 
Ce code fonctionne bien.
 

Code :
  1. Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  2.  
  3. '*************************'
  4. '* Sélection de ligne(s) *'
  5. '*************************'
  6. 'Déclaration variable(s)'
  7. Dim DEB As Integer
  8. Dim FIN As Integer
  9. 'Attribution des valeurs'
  10. DEB = 1
  11. FIN = Range("A65536" ).End(xlUp).Row
  12. 'Sélection'
  13. Range("A" & DEB, "A" & FIN).EntireRow.Select
  14. 'Tri automatique des lignes'
  15. With Selection
  16.     .Sort Key1:=Range("A" & DEB), order1:=xlAscending, header:=xlGuess, Orientation:=xlTopToBottom
  17. End With
  18.  
  19. End Sub


@+

Reply

Marsh Posté le 07-03-2011 à 18:03:58    

mmarle a écrit :

Salut fidoboulette,
 
Ce code fonctionne bien.
 

Code :
  1. Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  2.  
  3. '*************************'
  4. '* Sélection de ligne(s) *'
  5. '*************************'
  6. 'Déclaration variable(s)'
  7. Dim DEB As Integer
  8. Dim FIN As Integer
  9. 'Attribution des valeurs'
  10. DEB = 1
  11. FIN = Range("A65536" ).End(xlUp).Row
  12. 'Sélection'
  13. Range("A" & DEB, "A" & FIN).EntireRow.Select
  14. 'Tri automatique des lignes'
  15. With Selection
  16.     .Sort Key1:=Range("A" & DEB), order1:=xlAscending, header:=xlGuess, Orientation:=xlTopToBottom
  17. End With
  18.  
  19. End Sub


@+


 
Je confirme....  :D merci

Reply

Marsh Posté le 09-03-2011 à 17:32:56    

Bonjour à tous et surtout à mmarle qui est mon sauveur....  :)  
j'ai encore deux problème et une fois résolus, je viendrai à bout de mon "projet".
alors voila:
une fois que j'ai fait mes petites manip avec mon tableau... je souhaite dans un premier temps enregistrer mon fichier puis effacer toutes mes données (du tableau sus cité) et toutes les feuilles sauf trois qui sont identifiées... une sorte de réinitialisation en somme.
Une fois fait, je veux ré-enregistrer le tout sous un nom que j'appellerai "modèle".
 
En faisant une recherche sur google, j'ai trouvé des bout de lignes qui colleraient... presque!
Le nom du premier enregistrement se ferait en fonction de la valeurs de certaines cellules d'une feuille... mais surtout, je voudrais que l'enregistrement se fasse dans le dossier où il a été ouvert.
voici le bout de code d'enregistrement:
 

Code :
  1. Sheets("PVD" ).Select
  2.     Dim Chemin
  3.     Chemin = "C:\Users\Pierre\Documents\Mes documents\ONF\Fond de coupe\"
  4.     Dim MonFichier
  5.     MonFichier = Chemin & Range("K7" ).Value & " _ VB FDC _ P" & Range("E26" ).Value2 & ".xls"
  6.     ActiveWorkbook.SaveAs Filename:=MonFichier, _
  7.     FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
  8.     ReadOnlyRecommended:=False, CreateBackup:=False


 
le problème c'est que là je lui indique un chemin et je ne vois pas comment triturer le code pour que ça s'enregistre dans un répertoire "relatif" (je sais pas si je suis clair.... :whistle: )
 
Mon deuxième problème est que un peu plus loin, je voudrait effacer toutes les feuilles du classeurs sauf trois feuilles qui portent tjrs le même nom.
Pareil, après une recherche google, j'ai trouvé un bout de code qui théoriquement devrait le faire:
 

Code :
  1. Dim Feuille As Worksheet
  2.     On Error Resume Next
  3.     Application.DisplayAlerts = False
  4.     For Each Feuille In Worksheets
  5.      If (Feuille.Name <> "PVD,R14,bases de référence" ) Then
  6.         Feuille.Delete
  7.      End If
  8.     Next


or dans ce cas, il m'éfface tout  sauf la dernière feuille nommée "bases de référence"...
voilà, vu que je ne comprend pas grand chose à ce que je fais, peut être que c'est trois fois rien à modifier mais je n'y arrive pas...
merci de votre aide.


Message édité par fidoboulette le 09-03-2011 à 17:33:44
Reply

Marsh Posté le 09-03-2011 à 19:11:01    

Salut fidoboulette,
 
A - Pour le chemin relatif, si j'ai bien compris, ce serait le chemin par défaut où se trouve le classeur ouvert.
 

Code :
  1. Chemin = ActiveWorkbook.Path & Application.PathSeparator

Code :
  1. Activeworkbook.path

est le chemin du classeur ouvert  
 
et

Code :
  1. Application.PathSeparator

est un "\".
 
 
B - Pour la suppression de feuille(s) (Réinitialisation)
 
Cas où les feuilles à garder sont au début:

Code :
  1. '****************************'
  2. '* Suppression des Feuilles *'
  3. '****************************'
  4. 'Déclaration variable(s)'
  5. Dim Feuille As Byte
  6. Dim DEB As Byte
  7. Dim FIN As Byte
  8. 'Attribution valeur'
  9. DEB = 4
  10. FIN = Sheets.Count
  11. 'Procédure'
  12. For Feuille = FIN To DEB Step -1
  13.     Sheets(Feuille).Delete
  14. Next Feuille


 
Cas où les feuilles à garder sont à la fin:

Code :
  1. '****************************'
  2. '* Suppression des Feuilles *'
  3. '****************************'
  4. 'Déclaration variable(s)'
  5. Dim Feuille As Byte
  6. Dim DEB As Byte
  7. Dim FIN As Byte
  8. 'Attribution valeur'
  9. DEB = 1
  10. FIN = Sheets.Count - 3
  11. 'Procédure'
  12. For Feuille = DEB To FIN
  13.     Sheets(Feuille).Delete
  14. Next Feuille

Il ne reste plus qu'a adapter le code.
 
@+

Message cité 1 fois
Message édité par mmarle le 10-03-2011 à 07:54:03
Reply

Marsh Posté le 10-03-2011 à 18:35:01    

mmarle a écrit :

Salut fidoboulette,
 
A - Pour le chemin relatif, si j'ai bien compris, ce serait le chemin par défaut où se trouve le classeur ouvert.
 
B -  
'Cas où les feuilles à garder sont à la fin'
 
'Déclaration variable(s)'
Dim Feuille As Byte
Dim DEB As Byte
Dim FIN As Byte
 
'Attribution valeur'
DEB = 1
FIN = Sheets.Count - 3
 
'Procédure'
For Feuille = DEB To FIN
    Sheets(Feuille).Delete
Next Feuille[/cpp]Il ne reste plus qu'a adapter le code.
 
@+


 
Génial  :D ... merci Mais lorsque je lance ma macro, j'ai le message d'erreur "déclaration existante dans portée en cours"...
effectivement, j'utilise déjà la fonction Dim DEB et Dim FIN au début pour sélectionner automatiquement mon tableau.... comment pallier à ce problème?
 
Pour le pt A - tu as tout à fait compris... le fichier excel doit pouvoir être transporté d'une clé USB à une autre, ou sur un PC.... donc l'enregistrement doit se faire dans le répertoire où le fichier est ouvert.
 
Merci à toi.

Reply

Marsh Posté le 11-03-2011 à 08:43:29    

Salut fidoboulette,
 
Le message d'erreur survient dès lors qu'une variable est déclarée plus d'une fois sous le même nom.
 

Code :
  1. Sub MaProcédure()
  2. Dim DEB As integer
  3. ...
  4. ...
  5. ...
  6. Dim DEB as integer
  7. ...
  8. ...
  9. ...
  10. End Sub

Une erreur est générée! Il suffit donc de supprimer une des deux déclarations où bien de déclarer sous un autre nom (Exemple: DEBTab pour le tableau et DEBFeu pour les feuilles)
@+

Reply

Marsh Posté le 11-03-2011 à 08:43:29   

Reply

Marsh Posté le 11-03-2011 à 18:27:07    

mmarle a écrit :

Salut fidoboulette,
 
Le message d'erreur survient dès lors qu'une variable est déclarée plus d'une fois sous le même nom.
 

Code :
  1. Sub MaProcédure()
  2. Dim DEB As integer
  3. ...
  4. ...
  5. ...
  6. Dim DEB as integer
  7. ...
  8. ...
  9. ...
  10. End Sub

Une erreur est générée! Il suffit donc de supprimer une des deux déclarations où bien de déclarer sous un autre nom (Exemple: DEBTab pour le tableau et DEBFeu pour les feuilles)
@+


 
Bonjour mmarle (et les autres aussi...),
bon j'ai encore un problème... et un message d'erreur: "Erreur execut '9': L'indice n'appartient pas à la sélection" ... lorsque je lance le débogage, j'ai la ligne "Sheet(Feuille).Delete" qui est surlignée en jaune..
je me suis dit que ce n'était pas "Feuille" qu'il fallait mettre entre les parenthèses mais le nom du dernier onglet (pour moi, il s'appelle "Base de référence).... mais apparemment ce n'est pas ça.....
 
Donc dans mon effacement d'onglet, je voudrai garder les 3 derniers et effacer tous ceux avant.... j'ai donc repris ton code comme ceci en modifiant le nom:
 

Code :
  1. '****************************'
  2.     '* Suppression des Feuilles *'
  3.     '****************************'
  4.  
  5.     'Cas où les feuilles à garder sont à la fin'
  6.  
  7.     'Déclaration variable(s)'
  8.     Dim Feuille As Byte
  9.     Dim DEBFeu As Byte
  10.     Dim FINFeu As Byte
  11.  
  12.     'Attribution valeur'
  13.     DEBFeu = 1
  14.     FINFeu = Sheets.Count - 3
  15.  
  16.    'Procédure'
  17.    For Feuille = DEBFeu To FINFeu
  18.    Sheets("bases de référence" ).Delete
  19.    Next Feuille

 
Je suppose que c'est une erreur bête mais vu que je ne suis qu'une bille en macro....
merci encore à toi
 

Reply

Marsh Posté le 15-03-2011 à 14:52:25    

Salut fidoboulette,
 
Je ne comprend pas, je viens de vérifier le code et tout fonctionne!
 
Peut-être pourrais-tu publier le code complet de ton application, avec une description précise de toutes les tâches que tu souhaites réaliser en fonction des conditions requises (Exemples:Nbre de feuilles par défaut, leurs noms, etc...).
 
@+

Reply

Marsh Posté le 15-03-2011 à 16:34:34    

mmarle a écrit :

Salut fidoboulette,
 
Je ne comprend pas, je viens de vérifier le code et tout fonctionne!
 
Peut-être pourrais-tu publier le code complet de ton application, avec une description précise de toutes les tâches que tu souhaites réaliser en fonction des conditions requises (Exemples:Nbre de feuilles par défaut, leurs noms, etc...).
 
@+


Salut,
en fait, j'ai trouvé la réponse en demandant à des spécialistes informatiques de ma boite....
voici le code qu'ils m'ont proposé et qui fonctionne très bien pour mon cas:

Code :
  1. '* Suppression des Feuilles *'
  2.     Dim ws As Worksheet
  3. Application.DisplayAlerts = False
  4. Application.ScreenUpdating = False
  5. For Each ws In Worksheets
  6.     If ws.Name <> "PVD" And ws.Name <> "R14" And ws.Name <> "bases de référence" Then
  7.         ws.Delete
  8.     End If
  9. Next
  10. Application.DisplayAlerts = True
  11. Application.ScreenUpdating = True


 
mon problème est résolu...  :bounce:  
et mon fichier est quasiment terminé...  
Je viens juste de découvrir un nouveau souci avec une impression automatique mais j'en ferai part au forum (et à toi puisque tu es le seul à avoir proposé des soluces....  :D ) si je ne trouve pas.
en tout cas, merci bcps de t'être décarcassé
A+

Reply

Marsh Posté le 16-03-2011 à 07:52:33    

Oui trés bonne solution que de parcourir la collection Worksheets!
 
@bientôt

Reply

Marsh Posté le 16-03-2011 à 08:36:23    

mmarle a écrit :

Oui trés bonne solution que de parcourir la collection Worksheets!
 
@bientôt


 
Ah?? c'est ce que j'ai fais???  :D  
Non vraiment, j'y comprend pas grand chose aux macros... mais cette année j'aurai des formations donc j'espère que ça m'éclairera un peu... c'est vraiment chiant de faire des trux que je ne comprend aps complètement.....  :fou:  
merci encore à toi

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed