Manipulation d'Array

Bonjour !

Voici le début de mon code, et par la suite l'explication.

Sub CommandButton1_Click()

Dim ImprimantePDF As String

Application.Dialogs(xlDialogPrinterSetup).Show

ImprimantePDF = ActivePrinter

'Toutes les options
If Option1 = True And Option2 = True And Option3 = True And Option4 = True And Option5 = False And Option6 = False Then
Sheets(Array("Option 1", "Option 2", "Option 3", "Option 4")).PrintOut ActivePrinter:=ImprimantePDF

'1 seulement
ElseIf Option1 = True And Option2 = False And Option3 = False And Option4 = False And Option5 = False And Option6 = False Then
Sheets("Option 1").PrintOut ActivePrinter:=ImprimantePDF

'1 et 2
ElseIf Option1 = True And Option2 = True And Option3 = False And Option4 = False And Option5 = False And Option6 = False Then
Sheets(Array("Option 1", "Option 2")).PrintOut ActivePrinter:=ImprimantePDF

'1 et 3
ElseIf Option1 = True And Option2 = False And Option3 = True And Option4 = False And Option5 = False And Option6 = False Then
Sheets(Array("Option 1", "Option 3")).PrintOut ActivePrinter:=ImprimantePDF

'1 et 4
ElseIf Option1 = True And Option2 = False And Option3 = False And Option4 = True And Option5 = False And Option6 = False Then
Sheets(Array("Option 1", "Option 4")).PrintOut ActivePrinter:=ImprimantePDF

Donc, à mon travail, je fais des soumissions pour mes clients, qui sont déjà toute prête, reste qu'à entrer leurs renseignements, et imprimer. J'ai donc plusieurs onglets pour plusieurs sortes de services. Présentement, j'ai 6 onglets, nommés de la façon suivante; "Option 1", "Option 2", etc.

Pour l'impression, j'ai un UserForm qui me fait sélectionner les pages à faire imprimer. Le code ci-haut est le début, puisque toutes les combinaisons possibles sont nombreuses. Ce que j'aimerais, c'est améliorer ce code, et j'ai pensé à la fonction Array;

En français;

Si la case à cocher 1 est sélectionnée (elle a un nom semblable à sa feuille, la case s'appelle "Option1") , alors ajoutée au groupe à imprimer (exemple Array(Imprimer).

Si la case à cocher 2 est sélectionnée, alors ajoutée au groupe à imprimer.

Etc, jusqu'aux 6ième options.

Je bute un mur, parce que quand je vois les formules d'array, il leur donne tout de suite un nombre, du genre =array(1), =array(2), mais mon problème, c'est que quand le 1 et le 3 sont sélectionnés, le 2 ne l'est pas automatiquement. Alors il y aura un trou dans le groupe array. J'aimerais pouvoir ajouter les feuilles, sans leur donner d'ordre, seulement les ajouté un après l'autre. Exemple; Add in Array(Imprimer).

Si vous avez des questions, ou besoins d'éclaircissement, dites-moi !

Merci beaucoup de votre aide!

Jessica

Bonjour,

Il te suffit de donner à tes Options "True" les valeurs

1, 2, 4, 8, 16, 32 et de faire la somme des valeurs cochées. (Tu stockes cette somme dans une variable)

Si la somme des valeurs cochées est 41 c'est que les options 1, 4 et 6 sont cochées.

Cette macro fait le décodage des sommes de contrôle. (l'impression)

Sub galopin()
Dim i, TaVariable
TaVariable = 41
For i = 0 To 5
If (2 ^ i) And TaVariable Then MsgBox "Print " & i + 1
Next
End Sub

A+

Bonjour,

Autre proposition de simplification

Sub CommandButton1_Click()

    Dim ImprimantePDF As String
    Dim tb_obj As Object, ctrl As Control, tb()

    Application.Dialogs(xlDialogPrinterSetup).Show

    Dim tb_obj As Object, ctrl As Control, tb()

    Set tb_obj = CreateObject("system.collections.arraylist")  'création objet tableau
     For Each ctrl In Me.Controls
        If ctrl.Name Like "Option*" Then
            If ctrl.Value = True Then tb_obj.Add ctrl.Name    'ajout feuille dans objet tableau
         End If
    Next ctrl

    tb = tb_obj.toarray 'conversion objet tableau en tableau à une dimension
     If tb_obj.Count > 0 Then Sheets(tb).PrintOut ActivePrinter:=ImprimantePDF

 End Sub

Pour reprendre la suggestion de Thev :

Pour ce type d'utilisation (directe) pas besoin d'Array :

Dim i
For i = 1 To 6
If (Me.Controls("Option" & i) * i) * -1 Then Sheets(i).PrintOut '(...)
Next

Nota : Le code que j'ai donné plus haut est plutôt destiné à une utilisation différée :

On stocke la variable de contrôle dans une variable publique et on traite... plus tard !

A+

Bonjour !

Merci de vos réponses.

Concernant cette partie de code;

If (2 ^ i) And TaVariable Then MsgBox "Print " & i + 1

Quelqu'un peut me l'expliquer ? Car j'essaie de la comprendre, mais en vain. Le but est que l'impression ce fasse d'elle même, et pas que le code me dise quelle feuille imprimer.

Et si je veux utilise le même code mais pour que ma cellule (exemple A4) affiche OptionX dépendamment du résultat. Et si plusieurs on été coché, que la cellule affiche alors Option1 et Option2, etc.

Tu n'as pas besoin de comprendre un code pour l'appliquer : L'important est que "ça marche"

Tu as demandé à imprimer les options cochées : Si tu suis mon explication et que tu donnes les valeurs indiquées aux boutons d'options cochées : ça marche.

Ce code est fortement optimisé donc je vais pas te faire un livre pour t'expliquer... L'important c'est de suivre le mode d'emploi. Après... Au pire si tu veux une variante pour 5 ou 7 boutons je te le modifie pour que tu voies la différence et que tu saches adapter le cas échéant. Pour le reste j'ai pas une vocation de romancier !

Sinon, bien sur, en dernier je t'ai mis un Msgbox dont tu n'as que faire...

YAKA remplacer le MsgBox "Print " & i + 1 par :

If (2 ^ i) And TaVariable Then Sheets(i+1).PrintOut 

et là tu auras l'impression directe... (J'avais mis un MsgBox par souçi d'économie... )

Enfin, je crois comprendre que ça te dépasse quand même un peu, alors je peux te le faire "clef en main" si tu nous mets un fichier test ressemblant comme 2 gouttes d'eau à ton classeur, mébon avec juste ton code de départ je peux pas faire mieux !

Ok ?

Bonsoir à tous...

Emergeant d'un assoupissement passager, je vais essayer d'achever de me réveiller en t'expliquant, le mieux possible (pour moi) comment fonctionne ce :

If 2 ^ i And TaVariable Then

dans laquelle explication Galopin n'a pas voulu se lancer...

And est un opérateur logique, réalisant une opération entre 2 valeurs logiques qui peuvent être : VRAI (ou 1) et FAUX (ou 0), et renvoyant une valeur logique comme résultat.

On peut établir une table de composition de cette opération :

gycxmfg

Comme on peut voir :

faux ET faux = faux

faux ET vrai = faux

vrai ET faux = faux

vrai ET vrai = vrai

Maintenant, comment peut-on traduire la détection de choix (et de choix multiples le cas échéant) au moyen de cette opération logique. Nous avons des choix que nous identifions par : 1 2 3 4 5 6, on va les traduire par des choix 0 1 2 3 4 5 qui constituerons des puissances de 2, lesquelles nous fourniront des nombres :

2^0 = 1

2^1 = 2

2^2 = 4

2^3 = 8

2^4 =16

2^5 = 32

Ces nombres, convertis en base binaire donnent respectivement :

1 —› 000001

2 —› 000010

4 —› 000100

8 —› 001000

16—› 010000

32—› 100000

Comme on voit la particularité des puissances de 2 successives, en base binaire donnent des nombres dont un seul chiffre est à 1, tous les autres étant à 0. Les éléments binaires étant la matière première des calculs informatiques, ces nombres se présentent comme des ensembles de bits dont un seul est actif...

Utilisons ces nombres pour enregistrer nos choix. Choix 1 + choix 4 + choix 6 va nous donner : 1 + 8 + 32 = 41.

Transformé en base binaire, ce nombre devient : 101001

On voit que le nombre résultant de 3 choix cumulés comporte trois 1 dont chacun correspond à l'un des choix.

Lorsque dans la boucle i = 0 à 5 (représentant les choix 1 à 6) on va opérer à chaque tour : 2^i And 41, l'opération est réalisée au niveau de chaque bit, et le résultat est celui conforme à la table de composition donnée au départ :

1 And 41 => 000001 ET 101001 = 000001 => VRAI

2 And 41 => 000010 ET 101001 = 000000 => FAUX

4 And 41 => 000100 ET 101001 = 000000 => FAUX

8 And 41 => 001000 ET 101001 = 001000 => VRAI

16 And 41=>010000 ET 101001 = 000000 => FAUX

32 And 41=>100000 ET 101001 = 100000 => VRAI

On aura par ce moyen détecté tous les choix effectué.

kpxgajh

Cordialement.

Pfff... C'est pourtant clair !

Bonsoir le fil, Bonsoir le forum,

Dans certains forums on peut liker ou mettre +1. Ici non, alors je like ^10 Môssieur Ferrand !

Rechercher des sujets similaires à "manipulation array"