Excel vba : gestion fenêtres

BABUDROME Messages postés 151 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 19 avril 2016 - 24 nov. 2015 à 19:13
BABUDROME Messages postés 151 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 19 avril 2016 - 24 nov. 2015 à 23:14
Bonjour,
Je ne comprend plus... et je viens soumettre ma programmation pour qu'un plus compétent que moi me dise où est l'erreur.
C'est peut-être tout bête...
Voilà mon programme :


Sub Workbook_Open()
Chm = Path + "\": Cr = Chr(13): Qot = Chr(34): Com = Chr(44): FeuilleEnCours = "" ' "LogiPix"
FicPb = Chm + NLgpPb: FicDupPb = Chm + NLgpDupPb: FicSol = Chm + NLgpSol: FicDupSol = Chm + NLgpDupSol
FicQPb = Chm + NQueuPb: FicQSol = Chm + NQueuSol: DimagesPb = Chm + NLgpImPb + "\": DimagesChemins = Chm + NLgpImChm + "\"
FicOpt = Chm + NLgpOpt: FicTm3 = Chm + NLgTm3: NomClasseur = Name: FExe = Chm + Name: initTbAdr
x = FileDateTime(FExe): RéfVersion = "Version " & N°Version & " du " & Left(x, 10) + " à " + Right(x, 8)
' SetCellule stocke les informations dans des cellules réservées de la feuille LGP
SetCellule LGP, "Version", RéfVersion: SetCellule LGP, "Chemin_Classeur", FExe ' Active fenêtre LGP via la fonction (sans problème)
... : LdListeNoms

'dans Module
Const LGP="nom feuil1", LPB="nom feuil4"
Public FeuilleEnCour$, x$,Cr$,Qot$,Com$,FeuilleEnCours$,...

Sub SetCellule(ByVal Feuil$, ByVal Adr$, ByVal Valeur)
If Adr = "" Then Exit Sub
On Error GoTo ER: Activer (Feuil) : Range(Adr).Value = Valeur: GoTo 9 ' cette activation fonctionne bien
ER: Debug.Print Err, Error: Stop
Resume 9
9: On Error GoTo 0: End Sub

Sub Activer(F$)
On Error GoTo ER
If FeuilleEnCours <> F Then Worksheets(F).Activate: Worksheets(F).Visible = True: FeuilleEnCours = F
GoTo 9
ER: If Err = 20 Then Resume 9
Debug.Print "activer(" + F + ") "; Err, Error: Resume 9
9: On Error GoTo 0: End Sub '

Sub LdListeNoms()
1: Activer LPB: ActiveSheet.LoadListeNoms ' celle(ci génère l'erreur 40036
End Sub

'dans feuil4
Public Sub LoadListeNoms()
Activer (LPB): Range("A2:L1000").Select: Selection.ClearContents
For i = 0 To NbPb
x = "A" + Trim(i + 2): Range(x).Value = NumPb(i) 'N° du Pb
x = "B" + Trim(i + 2): Range(x).Value = NomPb(i) 'Nom du Pb
...
x = "J" + Trim(i + 2): Range(x).Value = Trim(Score(i)) 'Score du meilleur gagnant du Pb
x = "K" + Trim(i + 2): Range(x).Value = OrgPos(i) 'Position du Pb dans fenêtre de jeu
Next


1) dans une 1ère phase, la fonction 'Activer LGP' fonctionne correctement via la fonction 'SetCellule LGP, adr, valeur'
2) à l'appel de la routine 'LdListeNoms', la même fonction pour la feuille LPB me délivre l'erreur 40036.
Je ne vois pas pourquoi ?
Je n'ai que 2 feuilles dans mon classeur (feuille1 et feuille4).

Merci d'avance, mais je tourne en rond depuis 2 jours...

2 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 24/11/2015 à 19:43
Bonjour,
cette ligne :
ActiveSheet.LoadListeNoms
ne serait compréhensible que si LoadListeNoms était un membre d'un objet WorkSheet. Ce qui n'est pas le cas, puisqu'il s'agit d'une procédure !

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 24/11/2015 à 22:18
Je vais essayer (en aveugle sans ton classeur) de mettre de l'ordre dans tout cela :
Dans ton module, uniquement ceci :
'dans Module
Public Const LGP As String = "nom feuil1"
Public Const LPB As String = "nom feuil4"
Public FeuilleEnCour As String, x As String, Cr As String, Qot As String, Com As String, FeuilleEnCours As String ', .... j'ignore ce qui vient là ..L.
Public Sub SetCellule(ByVal Feuil As String, ByVal Adr As String, ByVal Valeur)
If Adr = "" Then Exit Sub
With Worksheets(Feuil)
.Range(Adr).Value = Valeur
.Visible = True
End With
End Sub

Public Sub LdListeNoms()
With Worksheets(LPB)
.Range("A2:L1000").ClearContents
For I = 0 To NbPb
x = "A" & Trim(I + 2)
.Range(x).Value = NumPb(I) 'N° du Pb
x = "B" & Trim(I + 2)
.Range(x).Value = NomPb(I) 'Nom du Pb
'...
x = "J" & Trim(I + 2)
.Range(x).Value = Trim(Score(I)) 'Score du meilleur gagnant du Pb
x = "K" & Trim(I + 2)
.Range(x).Value = OrgPos(I) 'Position du Pb dans fenêtre de jeu
Next
End With
End Sub

ce code est à écrire en supprimant la sub Activer (devenue totalement inutile) de ton module
Et en supprimant la sub LoadListeNoms() de ta feuil4

Il te faudra bien évidemment également déclarer en public dans ton module tes tableaux NumPB, NomPb, Score et OrgPos et ta variable NbPb

Observe : je ne travaille pas à coups de Select, Activate, Selection, etc ...
J'ai supprimé par ailleurs toutes les gestions d'erreur, car je ne vois pas à quoi elles servirait si la feuille Feuil4 existe sous ce nom.


EDIT perds cette habitude que tu as prise de mettre sur une même ligne deux instructions séparées par un ":". Ce n'est pas une faute, mais cela gêne considérablement le suivi en lecture/correction
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
BABUDROME Messages postés 151 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 19 avril 2016
24 nov. 2015 à 23:14
Bonsoir.
Merci. J'ai encore bien des choses à apprendre...
Je vais mettre en application tes recommandations : éliminer les Activate entre autres et en particulier le regroupement des instructions sur une même ligne (fait pour minimiser les tailles (nombre de lignes) des routines.
Je dois pouvoir simplifier.
A + et encore Merci
0
Rejoignez-nous