Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

UserForm et propriete Row

1 réponse
Avatar
christèle
Dans une feuille de calcul nommée "Base", j'ai un bouton commande
"ouvrirsaisie" qui me permet d'accéder à 1 Userform nommé "Saisie"
Dans la procédure que le bouton "ouvrirsaisie" commande, avant de permettre
l'apparition du UserForm (Saisie.Show), je souhaite créer nouvelle ligne 2
j'ai donc saisi : Sub ouvrirsaisie_click() Row(2).Insert ...
Saisie.Show
Ca marche bien mais j'ai vu que la correction préconise plutot, à la place
de Row(2).Insert : Worksheets("Base").Row(2).Select Selection.Insert

Qlq peut-il m'expliquer les avantages et les inconvénients de l'une et
l'autre des écritures ?
Dans le cas 1, j'ai cru comprendre que Row s'applique à l'objet Application.
Ma procédure étant enregistrée dans feuil1(Base), Application fait référence
automatiquement à la feuille Base donc que j'exécute cette instruction en
ayant pour feuille active la feuille Base ou une autre, tout va bien se
passer. Jusqu'ici mes déductions sont-elles bonnes ?
Dans le cas 2, je vois bien que la différence majeure c'est que la ligne 2
est sélectionnée mais : Quelle différence entre Worksheets("Base") et
Sheets("Base") ?
Pourquoi : Rows(2).Select Selection.Insert entraine une erreur
10014 (erreur définie par l'application ou par l'objet) quand j'exécute (pas
à pas) la procédure en ayant activer une feuille autre que la feuille Base.
Il me semble que Rows(2).Select c'est l'équivalent de
Application.Rows(2).Select. Or la procédure est enregistrée sur Feuil1(Base)
donc Application fait référence à la feuille Base. Il devrait donc pas y
avoir d'erreur. Qu'est ce qui cloche dans ma déduction ?

Merci
Christele

1 réponse

Avatar
MichDenis
Bonjour Christèle,

A ) L'enregistreur de macro doit avoir souvent à l'expression "Selection" qui désigne pas nécessaire une cellule mais
un objet (bouton de commande , graphe ...) pour désigner l'objet que l'usager manipule au moment d'enregistrer sa
macro. De ce fait, l'enregistreur ne génère pas le "meilleur" code qui soit mais traduit les gestes de l'usager au
moment de l'enregistrement de la macro.

Dans ton exemple, le code souhaitable serait :

'Même si la feuille n'est pas visible, le code s'exécute parfaitement. !
With worksheets("Base")
.Rows(2).Insert
End With

Si tu utilise l'expression Select, voici ce que le code devrait être :

With worksheets("Base")
'Rend la feuille active... obligatoire pour pouvoir
'SÉLECTIONNER une cellule dans cette feuille
'Ou tout autre objet appartenant cette feuille.
.activate
.Rows(2).Select 'totalement inutile à moins de vouloir
'placer le curseur sur cette cellule.
.Rows(2).Insert
End With

Lorsque tu travailles avec les objets d'excel, il est préférable d'utiliser la structure
'-------------
With Objet
'Le code
End With
'-------------
A ) Car avec cette syntaxe, ton code est valide peu importe où tu inscris ton code que ce soit dans un module standard
ou dans le module de la feuille.
B ) Cela t'évite aussi d'utiliser l'expression "Select" pour exécuter le code
C ) Le code s'exécute beaucoup plus rapidement
D ) La saisie du code est simplifiée
E ) la lecture code est beaucoup plus facile !


Salutations!




'------------------------------
Worksheets -> Collection désignant des feuilles de calcul

Sheets -> toutes les feuilles du classeur (graphe, calcul, macro xlm .....) voir l'aide d'excel !
'------------------------------




"christèle" a écrit dans le message de news:

Dans une feuille de calcul nommée "Base", j'ai un bouton commande
"ouvrirsaisie" qui me permet d'accéder à 1 Userform nommé "Saisie"
Dans la procédure que le bouton "ouvrirsaisie" commande, avant de permettre
l'apparition du UserForm (Saisie.Show), je souhaite créer nouvelle ligne 2
j'ai donc saisi : Sub ouvrirsaisie_click() Row(2).Insert ...
Saisie.Show
Ca marche bien mais j'ai vu que la correction préconise plutot, à la place
de Row(2).Insert : Worksheets("Base").Row(2).Select Selection.Insert

Qlq peut-il m'expliquer les avantages et les inconvénients de l'une et
l'autre des écritures ?
Dans le cas 1, j'ai cru comprendre que Row s'applique à l'objet Application.
Ma procédure étant enregistrée dans feuil1(Base), Application fait référence
automatiquement à la feuille Base donc que j'exécute cette instruction en
ayant pour feuille active la feuille Base ou une autre, tout va bien se
passer. Jusqu'ici mes déductions sont-elles bonnes ?
Dans le cas 2, je vois bien que la différence majeure c'est que la ligne 2
est sélectionnée mais : Quelle différence entre Worksheets("Base") et
Sheets("Base") ?
Pourquoi : Rows(2).Select Selection.Insert entraine une erreur
10014 (erreur définie par l'application ou par l'objet) quand j'exécute (pas
à pas) la procédure en ayant activer une feuille autre que la feuille Base.
Il me semble que Rows(2).Select c'est l'équivalent de
Application.Rows(2).Select. Or la procédure est enregistrée sur Feuil1(Base)
donc Application fait référence à la feuille Base. Il devrait donc pas y
avoir d'erreur. Qu'est ce qui cloche dans ma déduction ?

Merci
Christele