Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Attribuer une valeur multiple à une variable objet

ShrekL

XLDnaute Junior
Bonjour,

J'ai cherché ici si cette question avait déjà été posée mais je n'ai pas trouvée. Donc, voici ma question en espérant que je ne répète pas trop.

Afin de monter des commandes qui s'appliquent à plusieurs feuilles, j'essai de créer une variable objet qui porterait le nom de "ToutBord" et qui désigne plusieurs feuilles dans un même classeur qui portent les nom 2X1, 2X2, 2X3, etc. Par contre, lorsque j'essai d'appliquer une commande à ma variable, j'ai toujours un message d'erreur qui m'indique "L'indice n'appartient pas à la sélection".

Voici un exemple :
VB:
    Sub Unprotect()
Dim ToutBord As Worksheet
    Set ToutBord = Sheets("2X1, 2X2, 2X3, 2X4, 2X5, 2X6, 2X7, 2X8, 2X9, 2Y1, 2Y2, 2Y3, 2Y4, 2Y5, 2Y6")
ToutBord.unprotect

End Sub

Pourtant, si je désigne une seule feuille comme variable, la commande fonctionne bien sur la dite feuille. Est-ce que c'est que la variable ne peut être multiple? Si c'est le cas, y a t'il une façon de le faire?

Un merci sincère.
 
Solution
Re ,

il semble que le problème provienne du fait que je ne peut désigner plusieurs feuilles de calcul dans la fonction sheets
Pour le fun :
  • une variable publique ToutBord contenant les feuilles qu'on désire.
  • cette variable ToutBord est de type collection. La clef (key) est le nom de la feuille, l'élément (item) la feuille portant le nom de la clef.
  • InitToutBord au début de chaque procédure s'assure que ToutBord a bien été initialisé.
nb : 2ème fil où je semble être devenu transparent

ShrekL

XLDnaute Junior
Bonsoir SHREKL,
Peut être comme ceci sans aucune certitude
Set ToutBord=Sheets(Array("2X1";"2X2";"2X3"; .......... ; "2Y4";"2Y5";"2Y6"))
Joyeux Noël
@+ Lolote83
Merci de votre réponse. En la voyant, j’étais certain qje c’était la bonne ré’onse ou du moins, la bonne piste de solution mais il semble que non. J’ai aussi essayé différentes syntaxes sans succès.

J’ai même trouvé une autre discussion qui utilisait aussi array pour faire exactement ce que je voulais faire mais pour définir la variable, utilisait « For Each Var In ThisWorkbook.Worksheets(Array(... ».

J’ai copié-collé le code pour faire un test mais ça ne fonctionne pas non plus.

Un peu dé couragé. 😞
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Découragé un jour de Noel, faut pas
VB:
Sub test_ok()
Dim f As Worksheet, i%, feuilles() As String
For Each f In Worksheets
    If f.Name Like "2??" Then
    ReDim Preserve feuilles(i)
    feuilles(i) = f.Name
    i = i + 1
    End If
Next f
Worksheets(feuilles()).Select False
End Sub
 

Patrice33740

XLDnaute Impliqué
Bonjour,

Afin de monter des commandes qui s'appliquent à plusieurs feuilles, j'essai de créer une variable objet

Dans les Objets existants, il y a la collection de toutes les feuilles (Sheets) , la collection de toutes les feuilles de calcul (Worksheets) et une feuille de calcul (Worksheet).
Il n'existe pas une collection partielle de certaines feuilles de calcul.
Si tu en veux une il faut que tu crée ton propre objet (un module de classe nommé ToutBord) et que tu définisse ses méthodes (notamment Add et UnProtect), ses propriétés et ses évènements.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Essayez
VB:
Sub OterProtection()
Const MesFeuilles = "2X1,2X2,2X3,2X4,2X5,2X6,2X7,2X8,2X9,2Y1,2Y2,2Y3,2Y4,2Y5,2Y6"
Dim x
   For Each x In Split(MesFeuilles, ","): Sheets(x).Unprotect: Next
End Sub

notez bien : concernant la constante MesFeuilles -> pas d'espace qui n'existe pas dans le nom de la feuille en début ou fin de nom. C'est la virgule qui est le séparateur.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

[Précisions]
Le seul parfait qu'on peut rapprocher de Staple1600
C'est le parfait ...au café qu'il lui arrive de déguster devant son écran en écrivant de sa main libre des codes VBA faillibles (comme tout ce que produit l'être humain, car oui Staple1600 n'est pas qu'une agrafe, c'est aussi un être de chair et de sang
[/Précisions]

=>mapomme
Je ne suis pas pour l'exclusion.
Surtout en ce soir de Noel, je suis pour l'inclusion
(sauf pour l'écriture inclusive qui heurte un peu l'enfant de primaire que je fut dans les seventies)

=>laurent950
Je te remercie pour ta sollicitude.
Mon code fonctionne parfaitement dans les conditions de mon test.
Et j'avais zappé cette histoire du protection de feuilles (puisque vain et inutile)
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir le forum

VB:
Sub test_ok()
Dim feuilles() As String, ToutBord As Sheets
'
Set ToutBord = Worksheets(Split("2X1,2X2,2X3,2X4,2X5,2X6,2X7,2X8,2X9,2Y1,2Y2,2Y3,2Y4,2Y5,2Y6", ","))
ToutBord.Select

VB:
Sub test_ok()
Dim f() As String, ToutBord As Sheets
'
f = Split("2X1,2X2,2X3,2Z1,2X4,2X5,2X6,2X7,2X8,2X9,2Y1,2Y2,2Y3,2Y4,2Y5,2Y6", ",")
Set ToutBord = Worksheets(f)
ToutBord.Select
'
'Exclure feuilles 2Z1
Dim feuilles() As String
ReDim feuilles(1 To ToutBord.Count - 1)
Dim i, j As Integer: j = 1
Dim feuil As Worksheet
    For i = LBound(f) To UBound(f)
        Set feuil = ToutBord.Item(f(i))
        If feuil.Name <> "2Z1" Then
            feuilles(j) = CStr(feuil.Name)
            If j <= UBound(feuilles) Then j = j + 1
        End If
    Next i
'
Set ToutBord = Worksheets(feuilles)
ToutBord.Select
'
'Unprotect = Objet de la classe Worksheet
Dim myObject As Worksheet
    For Each myObject In ToutBord
        Set myObject = Worksheets(myObject.Name)
            myObject.Unprotect
    Next myObject
'
End Sub
 
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour,
Un mixte d'un peu tout.
Code:
Const MesFeuilles = ",2X1,2X2,2X3,2X4,2X5,2X6,2X7,2X8,2X9,2Y1,2Y2,2Y3,2Y4,2Y5,2Y6,"
For Each f In Worksheets
       If cbool(instr(MesFeuilles,"," & f.name & ",")) then f.Unprotect
Next

Je ne vois toujours pas l'intérêt d'une variable objet qui ce substituerait à l'objet Sheets !

Je suis un adepte des modules de classe ma la je vois pas!
 
Dernière édition:

ShrekL

XLDnaute Junior
avant de tomber définitivement dans le ridicule si tu nous précisait comment et à qu'elle fin tu compte utiliser cette variable multi objets?
Avant de tomber dans la condescendance et dans les commentaires qui ne répondent à rien, peut-être que de lire mon message initial répondra exactement à ta question alors que je donne même un exemple de ce que je tente de faire. Je vais tout de même répéter pour une personne qui ne comprend pas que je veux appliquer cette variable à plusieurs commandes.

Toujours étonnant de voir des gens sur un forum d'entraide qui se croient plus intelligents que tout le monde. Si nous savions tous ce qu'il y a à savoir sur le VBA, nous ne serions pas ici. Merci de vous abstenir si vous n'êtes pas foutu de lire et d'aider.

Gros merci à ceux qui se donne la peine de tenter une réponse.
 
Dernière édition:

ShrekL

XLDnaute Junior
Haha!!! Merci de votre réponse. Quand j'ai dit découragé, le mot "Déçu" de ne pas trouver ce que je cherchais aurait été plus approprié.

Et le but étant d'éviter de réécrire toutes les feuilles auxquelles appliquer mes commandes, j'avoue que ça perd son sens si je dois faire cette longue commande chaque fois. Mais gros merci quand même pour votre réponde.
 

Discussions similaires

  • Résolu(e)
Microsoft 365 Array
Réponses
8
Affichages
832
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…