Activation des onglets Excel via formulaire
Bonjour à tous
j'ai encore une petite question relative à une de mes formulaires :
Ce dernier fait appel à des données présentes sur des onglets différents de celui qui contient tous les boutons de lancement des macro.
Le fait de devoir activer des onglets pour lire les données est je trouve inesthétique.
J'ai parfois trouvé la solution pour ne pas activer ces onglets, comme ci dessous :
Set WsBase = Sheets("Base")
'Sheets("Base").Activate
col = WsBase.Cells(1, Columns.Count).End(xlToLeft).Columnmais dans le cas d'utilisation de controls, je sèche !
Private Sub CompterAnalyses()
'verification si analyses créées sur dossier
Dim i As Integer
Sheets("Base").Activate
For i = 1 To ColFin 'ColFin = Range("A1").End(xlToRight).Column
If Me.Controls("CheckBox" & i).Value = False Then
Vide = Vide + 1
End If
Next i
End SubJ'aimerai bien m'affranchir du 'Sheets("Base").Activate' au niveau de 'Me.controls....'
Est-ce possible?
Qq'un a une solution?
Merci d'avance
Frederic
Bonjour,
Je peux vous fournir une macro qui vous donne une liste déroulante de tous vos onglets de feuilles classés par ordre alphabétique
Si cela vous convient, faites-le moi savoir. Un petit fichier exemple serait le bienvenu.
Amicalement,
Papy Pierrot
Bonjour,
il est où le fichier de test ?
eric
Bonjour,
Je pensais que vous alliez m'envoyer un exemple de fichier avec quelques exemples de vos données.
Moi, je ne sais pas ce que vous souhaitez.
Papy Pierrot
Pierre, je m'adressais au demandeur...
eric
eriiic a écrit :Bonjour,
il est où le fichier de test ?
eric
Bonjour
voici donc le fichier en question. Je ne voulais pas l'envoyer pensant avoir été clair dans ma demande.
La sub est à la fin du code, dans le formulaire urgenselection.
Merci
Frederic
Rebonjour,
Voici un fichier qui vous donne accès à tous les onglets de feuilles au moyen d'une boite déroulante dans un UserForm.
Vous pouvez ajouter d'autres feuilles, elles seront ajoutées automatiquement à la liste
Je reste à votre disposition si nécessaire
Cordialement
Papy Pierrot
Rebonjour,
Voici un fichier qui vous donne accès à tous les onglets de feuilles au moyen d'une boite déroulante dans un UserForm.
Vous pouvez ajouter d'autres feuilles, elles seront ajoutées automatiquement à la liste
Je reste à votre disposition si nécessaire
Cordialement
Papy Pierrot
Re,
La sub est à la fin du code, dans le formulaire urgenselection.
Si tu pouvais donner le nom exact du sub et les manip à faire...
eric
Bonsoir à tous,
Blackrt, je n'ai pas regardé tout ton fichier mais je pense savoir ce qui te gêne et je te comprends ton agacement. Dans le code suivant :
Private Sub ComboBox1_Change()
Dim col As Integer
Dim ligne As Integer
Dim i As Integer
Dim colI As Integer
Sheets("Base").Activate
ligne = 2
col = Range("F2").End(xlToRight).Column
Box1.Clear
colI = Application.WorksheetFunction.Match(ComboBox1.List(ComboBox1.ListIndex), Range("2:2"), 0)
For i = colI To col
If ComboBox1.List(ComboBox1.ListIndex) = Cells(ligne, i) Then
Box1.AddItem Cells(ligne + 1, i)
Else
Exit For
End If
Next i
End SubTu actives la feuille "Base" : Sheets("Base").Activate, ensuite tu boucles sur les lignes de la feuille "Base" pour mettre à jour ton combobox... Enfin plus exactement tu mets à jour le combobox avec des informations de la feuille active car tu utilises l'objet cells sans lui dire à qui il appartient, la valeur par défaut est donc prise et c'est la feuille active... C'est la même chose pour tous les objets que l'on utilise (cells, range, columns, rows, si on ne précise pas son parent, c'est systématiquement la feuille active qui définie comme parent.
De plus l'énorme risque de cette méthode, est que l'on active une autre feuille pour un besoin, puis une autre, puis une autre et à un moment on croit être sur la feuille A, mais on est sur la B et on est perdu... Pourquoi cela ne marche pas, bon sang...
Plusieurs solutions pour remédier au problème :
1 - Définir le parent à chaque utilisation :
For i = colI To col
If ComboBox1.List(ComboBox1.ListIndex) = Sheets("Base").Cells(ligne, i) Then
Box1.AddItem Sheets("Base").Cells(ligne + 1, i)
Else
Exit For
End If
Next i2 - Définir le parent grâce à With... End With :
With Sheets("Base")
For i = colI To col
If ComboBox1.List(ComboBox1.ListIndex) = .Cells(ligne, i) Then
Box1.AddItem .Cells(ligne + 1, i)
Else
Exit For
End If
Next i
End With3 - Déclarer la feuille avec un nom court pour éclaircir le code :
Public Sh As Worksheet ' dans un module StandardPrivate Sub UserForm_Initialize()
' .../...
Set Sh = Sheets("Base") ' dans l'événement Initialise de l'UF
' .../...
End SubEt dans l'événement ComboBox1_Change :
For i = colI To col
If ComboBox1.List(ComboBox1.ListIndex) = Sh.Cells(ligne, i) Then
Box1.AddItem ShBase.Cells(ligne + 1, i)
Else
Exit For
End If
Next i4 - Et encore plus simple, l'utilisation du CodeName de la feuille : dans le projet du classeur, fenêtre VBE, on a toujours un nom de feuille suivi, entre parenthèses, du nom de la feuille d'Excel, par exemple pour la feuille base de ton fichier, dans l'explorateur de projet de VBE on a Feuil1 (Base) (Sheet1 en version anglaise) ; on peut modifier ce nom Feuil1 dans les propriétés de la feuille (F4) et mettre un nom plus clair, par exemple ShBase, ensuite tu peux utiliser la méthode 1 ou deux, je te mets en exemple la méthode 1 :
For i = colI To col
If ComboBox1.List(ComboBox1.ListIndex) = ShBase.Cells(ligne, i) Then
Box1.AddItem ShBase.Cells(ligne + 1, i)
Else
Exit For
End If
Next iL'énorme avantage de cette méthode, à condition que la feuille ShBase soit dans le même classeur que les macros, est que l'on peut renommer la feuille dans Excel en "Toto", "Titi" ou "Tata", le programme s'en fiche royalement !
Espérant que mes explications puissent un jour aider quelqu'un...
Bonjour Benoit et merci pour tout ces tuyaux .... efficace.
j'ai toutefois une procédure qui me résiste ! (surligné). J'ai mis le message d'erreur à coté. J'ai ce probleme sur plusieurs procédure de mon programme.
Cela dépasse mes compétences.
Peux tu m'aider STP?
MErci
Frederic
Private Sub RechercheEch()
'Recherche d'un échantillon dans la base et affichage
Dim LT As Long
Dim celluletrouvee As Range
Dim col As Integer
'Sheets("Base").Activate
LT = InputBox("Numéro LT à charger ?", "Recherche dossier")
Set celluletrouvee = WsBase.Range("B3:B100").Find(LT, lookat:=xlWhole)
If celluletrouvee Is Nothing Then
MsgBox ("Cette référence n'existe pas dans la base")
Else
NumLigne = celluletrouvee.Row
col = celluletrouvee.Column
'Cells(NumLigne, col).Select ' pas de message d'erreur, pas positionné sur onglet 'Base'
WsBase.Cells(NumLigne, col).Select 'Message erreur suivant : La méthode Select de la classe range a échoué !!!!!!
RecupFeuille
End If
End SubBonsoir,
Comment as-tu déclaré WsBase ?
C'est normal que "Cells(NumLigne, col).Select", car, comme je te l'ai expliqué, on se positionne toujours sur la feuille active... Même si ce n'est pas WsBase.
A mon avis, il ne faut pas utiliser les sélect, car cela ne sert à rien de se positionner sur une cellule ou une feuille pour la modifier sauf quand on fait appel à des instructions particulières comme les copier-coller. Personnelement, je les utilise extrêmement peu...
Sans voir ton fichier, je dirais que WsBase est masquée, c'est la seule raison qui me vient à l'esprit.
Si ce n'est pas cela et que tu ne trouves pas, mets ton fichier sur le forum, je regarderai.