Problème de sélection de feuille VBA

Problème de sélection de feuille VBA - VB/VBA/VBS - Programmation

Marsh Posté le 01-03-2024 à 11:27:59    

Bonjour à tous,
 
J'ai un problème avec la sélection de feuille que je n'avais pas avant. En fait j'en ai deux qui me semblent être lié.
 
1/ Jusqu'à il y a quelque jour lorsque je voulais sélectionner une cellule ou une plage dans une feuille différente de celle sélectionner j'utilisais la ligne de commande suivante :
 
Worksheets("XXX" ).Range("B2" ). select
 
Aujourd'hui je suis obligé de le faire en deux lignes :
 
Worksheets("XXX" ).select
 
Range("B2" ).select
 
Si je le fais en une ligne j'obtiens l'erreur 1004 : la méthode sélect de la classe range à échoué.
Quelqu'un saurais ttil m'expliquer le pourquoi du comment?
 
2/ J'ai fait ce code :

Code :
  1. Sub Bouton5_Cliquer()
  2. Dim Effectif_entreprise As Worksheet
  3. Set Effectif_entreprise = Worksheets("Effectif entreprise" )
  4. 'recherche de la colonne contenant les intitulés d'emploi et détermination de la variable correspondant à la cellule
  5. Dim Colonne_Emploi As Range
  6. Set Colonne_Emploi = Effectif_entreprise.UsedRange.Find("Emploi" )
  7. Dim Colonne_Service As Range
  8. Set Colonne_Service = Effectif_entreprise.UsedRange.Find("Service" )
  9. 'Détermination de la plage de cellule correspondant aux intitulés d'emploi
  10. Dim Liste_emploi As Range
  11. Set Liste_emploi = Range(Cells(Colonne_Emploi.Row + 1, Colonne_Emploi.Column), Range(Colonne_Emploi.Address).End(xlDown))
  12. Dim Liste_Service As Range
  13. Set Liste_Service = Range(Cells(Colonne_Service.Row + 1, Colonne_Service.Column), Range(Colonne_Service.Address).End(xlDown))
  14. 'copier les intitulés de service dans la feuilles "effectif service" et supprimer les doublons
  15. Worksheets("effectif entreprise" ).Select
  16. Liste_Service.Copy
  17. Sheets("Effectif service" ).Select
  18. Range("D3" ).PasteSpecial xlPasteValues
  19. ActiveSheet.Range("D3", Range("D3" ).End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlNo
  20. End Sub


Lorsque je teste la macro depuis l'éditeur en étant sur déjà sur la feuille "Effectif entreprise", la macro s’exécute parfaitement. mais lorsque je lance la macro en étant sur une autre feuille, il m'emmène sur la feuille "effectif service", toutes les cellule de la colonne D à partir de D3 sont sélectionnées, mais rien n'as été copié. J'ai l'impression qu'il ignore l'instruction sheets("effectif entreprise" ).select et je ne comprends pas pourquoi.
 
Je vous remercie d'avance de votre aide qui pourrait m'éviter une plus forte calvitie ;-)
 
 

Reply

Marsh Posté le 01-03-2024 à 11:27:59   

Reply

Marsh Posté le 06-03-2024 à 14:16:01    

Bonjour !
 
 1/ L'unique ligne de code n'a aucun sens car pour pouvoir activer une cellule il faut d'abord activer la feuille !
Donc les deux lignes de code sont la seule voie à suivre …
 
 2/ Je n'ai pas le temps de décrypter ce code tant il y a de l'inutile et du superflu mais, là encore,
il faut juste se poser la question quelle est la feuille active
lorsque une variable objet Range est attribuée en oubliant de spécifier la feuille !
 
Pour rappel : une bonne procédure VBA n'a pas besoin d'activer ni de sélectionner ni feuille ni cellule,
donc votre code devrait tenir en moins de dix lignes …


Message édité par Marc L le 06-03-2024 à 14:20:36
Reply

Marsh Posté le 06-03-2024 à 14:50:02    

 Avec cinq minutes de plus que prévu, une démonstration sans l'inutile :
 

Code :
  1. Sub Demo1()
  2.         Dim Rc As Range, V
  3.         Set Rc = Worksheets("Effectif entreprise" ).UsedRange.Find("Service" )
  4.          If Rc Is Nothing Then Beep: Exit Sub
  5.         V = Range(Rc(2), Rc.End(xlDown)).Value
  6.         Set Rc = Nothing
  7.    With Worksheets("Effectif service" ).[D3].Resize(UBound(V))
  8.        .Value = V
  9.        .RemoveDuplicates
  10.    End With
  11. End Sub


 

Reply

Marsh Posté le 06-03-2024 à 15:07:30    

 
 Une variante :
 

Code :
  1. Sub Demo1v()
  2.         Dim Rg As Range
  3.         Set Rg = Worksheets("Effectif entreprise" ).UsedRange.Find("Service" )
  4.          If Rg Is Nothing Then Beep: Exit Sub
  5.         Set Rg = Range(Rg(2), Rg.End(xlDown))
  6.    With Worksheets("Effectif service" ).[D3].Resize(Rg.Count)
  7.        .Value = Rg.Value
  8.        .RemoveDuplicates
  9.    End With
  10.         Set Rg = Nothing
  11. End Sub


 

Reply

Marsh Posté le 06-03-2024 à 17:46:27    

 
 A noter avec une en-tête de colonne commune aux deux feuilles la copie des cellules et la suppression des doublons
 peuvent être remplacées par une unique ligne de code juste en utilisant un filtre avancé !
 

Reply

Sujets relatifs:

Leave a Replay

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