Méthode Select de la classe Range [Résolu/Fermé]

Signaler
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017
-
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017
-
Bonjour à tous,

j'ai un code VBA qui me permet de créer un graphique à partir du nombre d'occurences de chaque entrée.

Certaines entrées ont une occurence nulle, et j'aimerais qu'elles n'apparaissent pas dans mon graphique.
Pour cela, avant la création du graphique, j'ai rajouté les lignes de code suivantes qui me permettent de masquer les lignes pour laquelle l'occurence est nulle.

''''''''''''''''''''''Masquage des occurrence nulles''''''''''''''''''''''''''''

ligne2 = 27

Do Until IsEmpty(Cells(ligne2, "B"))
    If Cells(ligne2, "B").Value = 0 Then
        Rows(ligne2).Select
        Selection.EntireRow.Hidden = True
        ligne2 = ligne2 + 1
    Else
        ligne2 = ligne2 + 1
    End If
Loop


Ce code marche très bien lorsqu'il est dans un module à part, sauf que lorsque je l'ajoute dans mon code général qui s'active par un clic sur un bouton, il ne marche plus....

J'ai une erreur d'éxécution 1004 qui apparaît et qui me dit que "la méthode Select de la classe Range a échoué" ... Le débogage m'indique donc que c'est cette ligne qui pose un problème :

Rows(ligne2).Select


J'ai essayé de remplacer
Rows(ligne2).Select

par
Range(ligne2:ligne2).Select


mais ça ne marche pas non plus ....

Une idée de pourquoi ça marche dans un module et pas dans le code global ?
Merci d'avance !

A voir également:

7 réponses

Messages postés
16428
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
7 avril 2021
3 159
bonjour,

sans voir le code ou la partie du code général puisque c'est lui qui empèche...

mais d'ores et déjà tu pourrais améliorer ton code
en VBA, on évite au maximum les "select" et quelque soit le if, tu incrémentes..

If Cells(ligne2, "B") = 0 Then
Rows(ligne2).Hidden = True
End If
ligne2 = ligne2 + 1

Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Merci pour le conseil ! C'est vrai que j'utilise souvent .select, en arrivant rarement à le substituer ....

En me baladant sur les forums, j'ai trouvé une solution qui marche, c'est d'appeler le module où mon code marche :

Private Sub CommandButton3_Click()

Call Résumé_graphique

End Sub


Par contre, le problème n'est pas résolu si je le laisse mon code global ... D'ailleurs, j'ai réessayé, et l'erreur s'est déplacée sur un autre .Select qui fonctionnait très bien auparavant .... et qui me permet simplement de déselectionner le graphique que je viens de créer ...
Cells(1, "A").Select


Il doit donc y avoir une erreur qui se répète dans mon code ... Existe-t-il un moyen d'envoyer tout le code dans un fichier, ou faut-il que je le copie entièrement dans un message ici ?
Messages postés
32038
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 avril 2021
3 377 >
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Bonjour,
Tu peux déposer ton fichier sur cijoint.com et nous donner le lien
https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Bonjour, voilà le code complet sur ce lien :

http://www.cjoint.com/c/FIzh6ICnFHf

Il fonctionne dans un module, mais pas lorsque je l'insère sous le Sub CommandButton_Click() de ma feuille.

Merci encore pour votre aide !
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149
Bonjour le fil, bonjour le forum,

Sans regarder en détail le code que tu nous fournis (pourquoi le code et pas le fichier ?...), peut-être une explication.
Si tu exécutes un code, à partir d'un onglet, qui fait référence à un autre onglet que lui, il te faut spécifier le nom de l'onglet à chaque fois. Par exemple je crée un bouton sur l'onglet Feuil1 avec le code suivant :
Sheets("Feuil2").Select
Rows(2).Select

Ça va planter !...

Il me faut écrire :
Sheets("Feuil2").Select
Sheets("Feuil2").Rows(2).Select

pour que ça marche...
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Mais si je fais
Sheets("Résumé graphique").Activate
au début de mon code, je n'ai pas besoin de rappeler ma feuille pour chaque action, si ?

Parce que pour le moment, j'ai


Sheets("Résumé graphique").Activate
.
.
.
.
Rows(ligne2).Select

et je pensais que ça me permettait de ne pas avoir à rappeler
Sheets("Résumé graphique").méthode

à chaque fois.
Messages postés
32038
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 avril 2021
3 377
Bonjour,

Quelques soucis dans ton code...
Dans la fonction FeuillExist par exemple :
Function FeuilleExiste1(MaFeuille As String) As Boolean          'Renvoie "TRUE" si la feuille "MaFeuille" existe

Dim Feuille As Worksheet

FeuilleExiste = False
For Each Feuille In Worksheets
    If (Feuille.Name = "Résumé graphique") Then
        FeuilleExiste1 = True
    End If
Next Feuille

End Function

Tu as deux noms de variables différents...
FeuilleExiste et FeuilleExiste1 ...... Non Tu ne dois avoir que le même (et cette variable à le même nom que le nom de te fonction... FeuilleExiste1)

[edit]
Je te propose un code un peu plus adapté à tes besoins :

Function FExist(NomF As String) As Boolean ' test si la feuille existe
   Application.ScreenUpdating = False
   On Error Resume Next
   FExist = Not Sheets(NomF) Is Nothing
   Application.ScreenUpdating = True
End Function 


Et pour l'utiliser :
NomFeuille = "Résumé graphique"
Reponse = FExist(NomFeuille)



Ensuite.... N'UTILISE PAS DE CARACTÈRES ACCENTUES comme noms de variables !

Puis essayes de découper ton code en plusieurs fonctions... car là il est trop long d'un seul bloc.... pour débuguer c'est la galère totale !

Et enfin....
Vu qu'à certains endroits de ton code tu fais appel à d'autres feuilles... il est normal que tu doives refaire référence à ta feuille ("Résumé Graphique") pour que ta macro s'y retrouve....






Cordialement, 
Jordane                                                                 
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149
Re,

Si ton code est das un module standard, non. Mais si il est dans un onglet, oui. Teste les deux lignes d'exemple que je t'ai proposé et tu verras...
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Je suis en train de reprendre le tout pour simplifier les choses, en essayant de mettre des fonctions et sous-procédures comme me l'a conseillé Jordane45.

Je reviens vers ce fil quand j'aurais retravaillé assez le document.

Merci ! :)
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Re tout le monde !

Vous trouverez sur ce lien le fichier complet.
Il compile, alors j'espère que c'est pas trop moche au niveau du code ;)

http://www.cjoint.com/c/FIBwCek6M7f

J'ai essayé de suivre les conseils, en enlevant les
.Select
, j'ai utilisé des
With .... End With
à la place.

J'ai aussi séparé le code en différents modules. Je vous avoue que j'ai appris sur le tas, sans vraiment suivre de tuto (pas top au niveau syntaxe ...), et donc au niveau organisation de mon projet, je sais pas trop ce que ça donne.

En gros, maintenant ça fait ce que je veux, donc je suis contente, et j'ai plus trop de questions.
Après, si vous avez le temps de regarder le code et de me donner des conseils pour que je puisse améliorer tout ça, je suis preneuse.

En tout cas, merci pour votre aide !!!
Messages postés
1412
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
9 mars 2021
149
Bonjour le fil, bonjour le forum,

Pas trop le temps de regarder tous les codes... Mais juste une remarque. Dans le module 5, procédure graph_def_risque, tu as, si j'ai bien compté, 2 fois 66 variables. Je te conseille de remplacer ces 66 variables par un tableau de variables à 66 entrées. J'ai utilisé un tableau de 2 lignes, 66 colonnes car je ne savais pas si tu aurais besoin plus tard du nom de la variable.
Dans la première ligne sont stockés les noms des variables et dans la seconde les valeurs. J'ai nommé TBCCO le tableau des variables cco et TBR le tableau des variables R. Ça donne :
Dim TBOCC(1, 1 To 66) As Variant
Dim TBR(1, 1 To 66) As Variant

TBOCC(0, 1) = "occ_101"
TBOCC(1, 1) = Application.CountIf(Worksheets("Risques élevés").Range("G:G"), "101")
TBOCC(0, 2) = "occ_102"
TBOCC(1, 1) = Application.CountIf(Worksheets("Risques élevés").Range("G:G"), "102")
'...
TBOCC(0, 66) = occ_1605
TBOCC(1, 66) = Application.CountIf(Worksheets("Risques élevés").Range("G:G"), "1605")

TBR(0, 1) = "r101"
TBR(1, 1) = "sol glissant"
TBR(0, 2) = "r102"
TBR(1, 1) = "sol inégal"""
'...
TBR(0, 66) = "r605"
TBR(1, 66) = "coactivité"


Pour le moment tu ne gagnes rien mais c'est après car tu vas supprimer toutes les lignes :
Cells(27, "A") = r101
'...
Cells(92, "B") = occ_1605


par une seule boucle :
For X = 1 To 66
    Cells(26 + X, "A") = TBR(1, X)
    Cells(26 + X, "B") = TBOCC(1, X)
Next X


si tu n'as pas besoin du nom des variables, ça se simplifie comme ça :
Dim TBOCC(1 to 66) As Variant
Dim TBR(1 To 66) As Variant

TBOCC(1) = Application.CountIf(Worksheets("Risques élevés").Range("G:G"), "101")
TBR(1) = "sol glissant"
'...
TBOCC(66) = Application.CountIf(Worksheets("Risques élevés").Range("G:G"), "1605")
TBR(66) = "coactivité"

la boucle devient :
For X = 1 To 66
    Cells(26 + X, "A") = TBR(X)
    Cells(26 + X, "B") = TBOCC(X)
Next X





À plus,
ThauTheme
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Merci pour le conseil ! C'est vrai qu'en fait je n'ai pas besoin du nom des variables, j'ai juste besoin des valeurs.
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

[MAJ]

J'ai poussé l'idée des tableaux encore plus loin pour m'éviter d'avoir trop de lignes à écrire, ça donne ça, et ça réduit considérablement (c'est peu dire) la longueur du code !!

Dim TB_R(1 To 66) As Variant
Dim TB_CODE(1 To 66) As Variant
Dim TB_OCC(1 To 66) As Variant

        '''Enregistrement des noms des risques dans le tableau TB_R'''

For i = 1 To 66
    TB_R(i) = Sheets("Risques").Range("E" & i + 2)
Next

        '''Enregistrement de tous les codes risques dans le tableau TB_CODE'''
        
For i = 1 To 66
    TB_CODE(i) = Sheets("Risques").Range("D" & i + 2)   'à partir de la cellule D3 de la feuille "Risques"
Next

        '''Comptage des occurences des codes risque dans "Risques élevés" et enregistrement dans le tableau TB_OCC'''
             
For i = 1 To 66
    TB_OCC(i) = Application.CountIf(Worksheets("Risques élevés").Range("G:G"), TB_CODE(i))
Next
             
        '''Attribution des risques et occurences à des cellules pour création du graphique'''

Sheets("Résumé graphique").Activate

For X = 1 To 66
    Cells(26 + X, "A") = TB_R(X)
    Cells(26 + X, "B") = TB_OCC(X)
Next X


Merci pour le tuyau !!
Messages postés
19
Date d'inscription
mercredi 10 août 2016
Statut
Membre
Dernière intervention
16 juin 2017

Re-bonjour tous !

J'ai un petit problème avec mon document qui compile tout très bien (!!) mais lorsque j'essaie de le rouvrir, j'ai un message d'erreur qui me dit :

"Excel a rencontré un contenu illisible dans "Nom_du_document". Voulez-vous récupérer le contenu de ce classeur ? Si la source de ce classeur est fiable, cliquez sur Oui."

Je clique sur Oui, et j'ai une fenêtre "Réparations" qui s'ouvre et me dit :

"Enregistrements supprimés: Tri dans la partie /xl/tables/table17.xml (Tableau)".

Sauf que je n'arrive pas à savoir à quel tableau correspond "table17", et je ne repère nulle part un quelconque tri supprimé...

Alors question : est-ce que c'est dû à mon format d'enregistrement, ou ça le fait aussi sur vos ordinateurs ? Et comment est-ce que je peux changer ça ?

Le fichier ICI : http://www.cjoint.com/c/FIEm3UNFs14

Merci pour vos réponses !