Transformer Activeworksheet en worksheet("XX") est ce possible ?

Bonjour à tous,

je suis en train de reprendre mes veilles habitudes de POO, et je commence à créer des procédures et fonctions qui me permettent d'automatiser et de centraliser certaines tâches.

Je suis confronté à un petit soucis concernant l'onglet actif, voir le code ci dessous, qui correspond au début de ma procédure :

'****************************************************
'Col = colonne du worksheet d ou est appellée la sub MAJ_organigrame
'row = ligne du worksheet d ou est appellée la sub MAJ_organigrame
'SheetToModify = nom du worksheet ou realiser la modification
'SheetFrom = nom du worksheet d ou est appellée la sub MAJ_organigrame

Sub MAJ_organogram(col, row As Integer, SheetToModify, SheetFrom As String)

Dim curCellToModify As Range
Dim Cellule As Range
Dim Dernier_Ligne As Long
Dim First_Test As Boolean

'****************************************************
'initalisation variables

First_Test = True
Set curCellToModify = ThisWorkbook.Sheets(SheetFrom).Range("C6")

'****************************************************
'initalisation des noms des worksheets pour savoir quelles cellules copier sur lesquelles
If SheetFrom = "Assesment test matrix" Then

Derniere_Ligne = ActiveSheet.Cells(ActiveSheet.Rows.Count, "C").End(xlUp).row

End If

La partie qui m'intéresse est la dernière ligne, je voudrais la transformer pour être sur qu'à tous les coups je suis bien sur le workbook qui est donné en paramètre de la procédure, et plus je regarde sur le net, moins je suis sûr de quoi faire.

J'ai trouvé un site en anglais qui parle de différence entre Worksheet et worksheets, etc... mais je ne suis pas sur de bien le comprendre.

Si vous pouviez m'aider pour le coup je vous en serais reconnaissant.

Dans la même veine y a t'il une astuce qui me permette d'appeler ces onglets quand bien même je change les noms de ceux ci en les renommant ?

Je devrais utiliser le nom "Sheet1" ou "Feuil1", plutôt que la description si j'ai bien compris (voir image ci-dessous) ?

1

Merci d'avance.

David

ps : Bon cette fois ci je souhaite une dernière fois mes meilleurs voeux, je ne reviendrais pas avant l'année prochaine sur le forum

Bonjour,

Je dois dire que je m'interroge sur ce que tu veux faire ?

D'abord, je me demande pourquoi col et SheetToModify sont laissés en Variant (non typés) !

Rappel que les variables, et il en est de même pour les arguments de procédures se typent individuellement !!!

Je ne comprends pas pourquoi tu doubles le passage d'arguments avec des réaffectations à l'intérieur de la procédure : ThisWorkbook ? ActiveSheet ? ... ce n'est pas très cohérent, la procédure doit pouvoir remplir le rôle qui lui est assigné avec les arguments passés...

(Si tu n'écris pas identiquement tes noms de variables, tu auras des surprises ! )

Et si tu passes un argument seulement en vue de le tester, cela n'a pas vraiment de sens... Si tu passes un argument c'est en vue d'opérer avec ! Si tu veux opérer avec la feuille active, tu ne passes pas d'argument...

Tu parles de Function par ailleurs, mais c'est une Sub que tu écris ?

Tu n'as pas de Workbook en paramètres autant que je sache encore lire !

Worksheets : objet collection (et collection d'objets), collection des feuilles d'un classeur.

Worksheet : objet individuel...

On renvoie un objet Worksheet, comme toujours, par une propriété de l'objet parent: Worksheets, propriété de l'objet Workbook, renvoie la collection de feuille du classeur, pour n'en renvoyer qu'une, on spécifie Worksheets(index), index pouvant être le rang dans le classeur ou le nom de la feuille.

Cordialement.

Bonjour,

pour compléter, utilise plutôt les objets dans tes variables. Un nom de feuille tu peux le retrouver dans plusieurs classeur, l'objet feuille intègre son parent : le classeur.

Et si tu veux être indépendant de renommage des feuilles il faut utiliser son codename comme tu le pressentais.

Ex :

Sub test()
    Dim shFrom As Worksheet
    'Set shFrom = Sheets("Assesment test matrix") ' par nom de la feuille
    Set shFrom = Feuil2 ' par codename de la feuille, (presque) constant (du classeur actif, pour un autre ça se complique un peu)
    controle shFrom
End Sub

Sub controle(sh As Worksheet)
    MsgBox "classeur : " & sh.Parent.Name & vbLf & "feuille : " & sh.Name
End Sub

Et pour finir d'éclairer ta lanterne :

Worksheet : un objet feuille

worksheets : la collection (l'ensemble) des feuilles d'un classeur

mais je viens de voir que déjà dit par MFerand

eric

Bonjour,

Je dois dire que je m'interroge sur ce que tu veux faire ?

Cordialement.

Bonjour MFerrand,

je n'avais pas vu au niveau de mes variables l'erreur dans le nom.

Pour la sub, je n'avais pas précisé que j'utilisais spécifiquement une fonction pour cette tâche ci.

En fait mon soucis, c'est que j'utilise l'évènement "change" d'une feuille pour modifier un paramètre sur une autre feuille, et je dois modifier une cellule sur une 3ème feuille depuis la 2ème, je me dis donc, que je ne pourrais pas utiliser Activesheet depuis ma procédure puisqu'elle réfère à le première modification et non pas à la deuxième.

Je vais creuser sur le sujet et voir ce qu'il est le mieux, mais la tout de suite j'ai pas les idées très claires

Merci pour ce complément d'info.

Bonne journée

david

Bonjour,

Il faut toujours garder quelques idées de base claires :

une Sub réalise une action, la nature de l'action peut être très diverse mais globalement, elle fait,

une Function fait la même chose, mais de plus elle renvoie un résultat, qui peut être aussi bien une valeur, de tous types, qu'un objet ; si pas besoin de renvoi, pas besoin de fonction, si pas besoin du résultat renvoyé à un moment donné, elle peut s'utiliser comme une Sub.

Une évènementielle réagit à une évènement programmable, sans que tu aies à intervenir, automatiquement. C'est pratique, cela permet pas mal de choses, mais nécessite quelques précautions, pour bien circonscrire l'intervention et la limiter à ce que tu souhaites, et éviter les effets en boucle qui peuvent t'échapper...

Travailler avec l'objet actif laisse une approximation plus ou moins grande, et un code non qualifié (expression non doté de qualificateur d'objet et renvoyant donc à l'objet actif) sera généralement plus lent. Eventuellement, on peut toujours mettre à contribution des variables objets comme l'a indiqué Eric.

Par exemple, tu déclenches, une action à partir d'un bouton, lors de l'appui sur le bouton, la feuille active est nécessairement celle sur laquelle est le bouton (il faut aussi veiller que le déclenchement ne puisse intervenir que par le bouton !). Tu places à ce moment ta feuille en mémoire dans une variable :

Set MaF = ActiveSheet

La feuille active peut changer, tu auras toujours ta feuille sous la main, directement accessible, et plus rapidement accessible.

Il n'est pas non plus utile de multiplier les variables et il faut bien cibler les objets que tu utilises, une fois affecté à une variable, il n'y a pas ambiguïté, la variable pointe un objet unique...

Tu auras besoin de manipuler un classeur que tu ouvres, puis le fermer, il peut être utile de l'affecter à une variable Workbook à l'ouverture...

Il est toujours inutile d'affecter ton classeur principal car tu disposes de ThisWorkbook qui désigne toujours le classeur contenant le code en train de s'exécuter... Faire Set wbk = ThisWorkbook, c'es gaspiller une variable.

Tu ouvres un classeur pour intervenir sur une feuille, c'est plutôt la feuille qu'il faut alors placer dans une variable Worksheet...

Le plus souvent on intervient sur des plages, une variable Range te dispense d'aller ensuite rechercher la feuille parent...

Et pour le cas qui te préoccupe, n'oublie pas l'intérêt des noms de plage ! Un nom est unique dans le classeur, plus besoin de chercher la feuille, le nom te permet d'y accéder directement. Plus, tu peux accéder à la feuille en passant par la plage nommée sans avoir à connaître son nom...

Cordialement et bonne année...

comme l'a indiqué Eric.

ma résolution 2018 : ne plus quitter ma cape d'invisibilité

Désolé ! Mais tu constitues une référence sur pas mal de points ! Même si tu disparais, les références restent !

C'était pour le demandeur qui m'ignore superbement

C'était pour le demandeur qui m'ignore superbement

Bonjour eriiic,

Excuses moi j'avais débuté la réponse en début d'après midi puis j'ai mis le pc en veille et rouvert plus tard, du coup je t'ai effectivement ignoré, tu m'en excuseras.

Grâce à votre réponse conjointe j'ai pu m'en sortir.

Du coup j'ai tout modifié pour utiliser les noms internes des worksheet.

Merci encore pour vos retours ultra rapides.

Je vous souhaite une bonne soirée.

David

Rechercher des sujets similaires à "transformer activeworksheet worksheet possible"