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).Column

mais 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 Sub

J'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

Bonjour, voici le fichier demandé

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

22v9-14042013.zip (70.81 Ko)

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

42v9-14042013-2.xlsm (122.08 Ko)
25v9-14042013-2.xlsm (122.08 Ko)

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 Sub

Tu 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 i

2 - 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 With

3 - Déclarer la feuille avec un nom court pour éclaircir le code :

Public Sh As Worksheet ' dans un module Standard
Private Sub UserForm_Initialize()
   ' .../...
   Set Sh = Sheets("Base") ' dans l'événement Initialise de l'UF
   ' .../...
End Sub

Et 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 i

4 - 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 i

L'é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 Sub

Bonsoir,

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.

Rechercher des sujets similaires à "activation onglets via formulaire"