Vider partiellement mon formulaire et faire apparaitre en pdf la fiche Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
s
siga2fadial
Membre fidèle
Membre fidèle
Messages : 156
Inscrit le : 24 octobre 2017
Version d'Excel : 2016

Message par siga2fadial » 11 décembre 2017, 12:47

Bonjour à tous,

J'ai bien avancé dans mon travail et celà grâce à vous donc un grand MERCI.
Cependant , je rencontre 2 difficultés majeures :
la 1ère consiste à faire apparaitre mes fiches c'est mon userform qui appaeait alors que je demande que ce soit la feuille
qui a un statut xlveryhidden
la 2ème difficulté est que je dois seulement la faire apparaître en pdf pour éviter une modif après la saisie du formulaire.

Je dois faire une macro je pense pour la 2ème mais je ne peux pas régler cette difficulté sans régler la première ,
avez-vous une idée ou une astuce ?

Merci d'avance,

Siga
test pdf.xlsm
(38.36 Kio) Téléchargé 12 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 11 décembre 2017, 13:48

Bonjour,

Ta feuille F1 n'est pas masquée en xlSheetVeryHidden mais normalement (xlSheetHidden)...

Avant d'activer ta feuille (bouton Visualiser) il convient de mettre d'abord sa propriété Visible à xlSheetVisisible.
Si elle doit être masquée en temps normal et en xlSheetVeryHidden, il convient de l'avoir fait par VBA (et de la remasquer de même après l'avoir rendue visible...)
NB- Pas besoin de démasquer une feuille pour écrire dessus...
Si tu veux l'afficher en pdf, il convient alors de l'exporter en pdf et la remasquer...

La proc. du bouton Sauvegarder me semble devoir poser quelques problèmes :
- Vérification que la TextBox8 n'est pas vide : sans Exit Sub, la procédure continuera de s'exécuter.
- Une commande Load UserForm1 lancée par ce bouton, donc à partir du même Userform1 à ce moment là bien chargé, et affiché ! ?

Je passe sur la déclaration de variable qui suit, qui devrait se trouver en tête de procédure, et être typée... et aussi sur la répétition à rallonge de Worksheets("F1") qui demanderait une mise sous bloc With... L'affectation semble un peu compliquée, il faudrait la revoir de près et utiliser des tableaux...

Cordialement.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 11 décembre 2017, 14:53

Proposition pour tes deux proc. :
Private Sub CommandButton1_Click()
    Dim dln%, i%, ctl, col
    If TextBox8 = "" Then
        MsgBox "Saisie du numéro Adhérent obligatoire", vbExclamation, "N°. Adhérent"
        TextBox8.SetFocus
        Exit Sub
    End If
    ctl = Split("TextBox7 TextBox2 ComboBox2")
    col = Array(7, 11, 15)
    With Worksheets("F1")
        For i = 0 To 2
            .Cells(col(i), 3) = Controls(ctl(i)).Value
        Next i
        dln = 21
        Do While .Cells(dln, 2) <> ""
            dln = dln + 1
        Loop
        ctl = Split("TextBox8 TextBox8 ComboBox3 ComboBox4 TextBox3 TextBox4 TextBox6 TextBox5")
        col = Array(1, 8, 2, 9, 3, 10, 5, 12)
        For i = 0 To 7
            .Cells(dln, col(i)) = Controls(ctl(i)).Value
        Next i
    End With
    Me.Hide
End Sub

Private Sub CommandButton2_Click()
    With Worksheets("F1")
        .Visible = xlSheetVisible
        .ExportAsFixedFormat xlTypePDF, "Fiche.pdf", OpenAfterPublish:=True
        .Visible = xlSheetVeryHidden
    End With
End Sub
Pour le 1, rectif. des points litigieux et écriture diférente des affectations...
Pour le 2, modifier le nom de fichier pdf par celui qu'on veut mettre et indiquer éventuellement un chemin de dossier pour l'enregistrement... mais cela posera un problème en cas de répétition (on peut toujours faire écraser un fichier par l'enregistrement d'un autre, mais erreur s'il est ouvert à ce moment... il faudrait alors intercepter l'erreur pour demander à l'utilisateur de fermer le fichier... Et inhiber aussi les messages d'alertes lors de l'enregistrement).

Remarque relative à Activate :
A moins d'avoir des dimensions de contrôles modifiables durant l'exécution, la fixation du positionnement et des dimensions ne se justifie pas dans le code... La variable Sh (non déclarée ni typée, encore !) serait avantageusement remplacée par une mise sous bloc With, plus efficace.

Cordialement.
s
siga2fadial
Membre fidèle
Membre fidèle
Messages : 156
Inscrit le : 24 octobre 2017
Version d'Excel : 2016

Message par siga2fadial » 11 décembre 2017, 16:13

Merci pour vos réponses M.Ferrand.
Mais là pour le coup, je ne comprends pas les instructions en ce sens que si je devais les commenter, je serai incapable de
commenter toutes les lignes, autrement dit ce code est trop sophistiqué pour moi qui suis qu'une novice et non
un expert comme vous et je suis suceptible de devoir le justifier auprès de mon manager ou le transmettre à un événuel collègue :cry:

Ainsi ici " Dim dln%, i%, ctl, col" est une expression que je découvre pour la 1ère fois et suis assez troublée par les %
Je suppose que "ctl" correspond à mes contrôles et que "col" aux colonnes de mes fiches
Je sais que "Me" est une autre façon de nommer mon formulaire.
"Loop" ne m'est pas non plus familier mais je sais que cela correspond à la boucle.
Les fonctions "Array "et "Split" me sont totalement inconnues...je vais voir ce que je trouve en faisant des recherches

En définitive, votre proposition me fait penser à de la factorisation, au sens mathématique du terme, sachant que je suis plutôt pour ne pas dire carrément une litterraire :oops:
Vous écrivez ainsi pour avoir moins de lignes à reproduire , n'est pas M.Ferrand ?

Je prends, donc, note que mes instructions sont parfois trop répétitives et qu'il existe un ordre pour passer des instructions, ce dont je n'avais pas conscience . J'ai testé la visualisation en PDF et cela fonctionne très bien.

Je m'aperçois en plus que dans ma précipiation j'ai oublier de poser la question comment effacer partiellement mon formulaire, sachant que je souhaite conserver le haut du formulaire sauf le n°adhérent et effacer le reste : cad le contenu du multipage et le n°adhérent lorsque je sauvegarde.

une de mes erreurs est de cacher le userform avec le bouton de sauvegarde et de le vider avec le bouton de fermeture.
Je recherche une solution entre les 2 à affecter à mon bouton sauvegarder en fait .

Si vous avez des idées , elles sont d'autant plus bienvenues qu mon manager veut que je retourne systématiquement en page 1
du multipage et là je n'ai rien vu concernant cette possibilité. ::~

MERCI !
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 11 décembre 2017, 17:27

Bonsoir,

Il y a toujours diverses façons d'écrire du code... Je m'efforce de choisir d'une part ce qui paraît le plus efficace (en principe le plus rapide à l'exécution) ou le plus pratique dans le contexte, et d'autre part d'en écrire le moins possible... Deux soucis le plus souvent compatibles (même si pas toujours).

Quelques explications rapides avant de me préoccuper du repas... :)

% : c'est ce qu'on appelle un caractère de déclaration de type.
Ecrire :
Dim i As Integer
ou :
Dim i%
c'est strictement la même chose.
Cela permet d'écrire plus rapidement les déclarations...
Il existe de tels caractères pour les variables de types :
String : $
et numériques :
Integer : %
Long : &
Single : !
Double : #
Currency : @

Me est un mot-clé qui désigne dans tout module d'objet l'objet auquel le module est dédié : dans un module de feuille de calcul, Me c'est la feuille concernée, dans le module classeur (ThisWorkbook), Me c'est le classeur, et dans un module de Userform, Me c'est le Userform.
C'est clair, vite écrit, et ça peut même éviter des erreurs... Pourquoi s'en priver !

Loop est le mot clé de fin d'une instruction Do... Loop (boucle) [de même que Next est le mpt-clé de fin d'une boucle For... Next]
Plus intéressant est la raison pour laquelle j'ai substitué Do... Loop à For... Next que tu avais : d'une part j'ai dû faire quelques allers-retours avec la feuille pour décoder tes calculs utilisant 21+i... il était plus naturel de partir de la ligne 21 pour trouver la première ligne vide, et si on le fait directement avec la variable qui doit prendre la valeur, on n'a plus à la lui affecter dans un second temps. Avec Do... Loop la condition est indiquée dans l'initialisation de la boucle et à l'intérieur on n'a que l'incrémentation, la valeur répondant à la condition atteinte on sort automatiquement de la boucle (on peut faire la même chose avec For... Next mais de façon un peu moins élégante)....
Note-toi aussi cependant que la méthode classique aurait été :
dln = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
C'est ce que tu verras le plus souvent utilisé. Mais la méthode n'étant pas plus rapide (ni moins) je n'avais aucune raison de changer de méthode à cet égard...

Array et Split sont 2 fonctions VBA qui renvoient un tableau.
Array à partir d'une énumération d'éléments séparés par des virgules (séparateur en VBA)
Split à partir d'une chaîne-texte (String) dont elle sépare les éléments sur un séparateur inclus dans la chaîne. Le séparateur est indiquée en 2e argument de la fonction et peut être omis s'il s'agit de l'espace standard.
Un autre intérêt de la fonction Split est qu'il existe une fonction Join en quelque sorte symétrique, qui elle constitue une chaîne à partir d'un tableau en y introduisant un séparateur indiqué. Deux fonctions qui peuvent s'avérer fort utiles dans des manipulations sophistiquées de textes.
On utilise normalement ces fonctions pour constituer des tableaux placés dans des variables de type Variant (non typées). Les tableaux sont par défaut de base 0 (indice du premier élément), ils contiennent donc un élément de plus que l'indice maximal du tableau (accessible par la fonction UBound(tablo))
Si j'ai utilisé la constitution de tableaux pour opérer l'affectation, c'est que si on n'a ni les cellules à servir dans l'ordre, ni les contrôles contenant les valeurs à affecter renommés pour suivre un ordre déterminé, on peut de cette manière toujours faire une boucle d'affectation en bouclant sur des tableaux qui pointent eux sur les éléments se correspondant.

Il y a encore d'autres méthodes d'affectation... et les tableaux justifieraient d'un cours complet... mais on apprend au fur et à mesure...

[intermède repas]

Cordialement.
2 membres du forum aiment ce message.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 12 décembre 2017, 02:16

Re,

En complément, pour ce qui concerne la réinitialisation du formulaire, je ne m'y étais pas spécialement penché, mais j'ai vu que tu avais opté pour une procédure Activate à la place de l'Initialize habituelle. Ce qui différencie les deux, c'est que l'Initialize est exécutée une seule fois au chargement du Userform (qu'il soit affiché ou non à la suite du chargement), l'Activate est elle exécuté à chaque affichage ou réaffichage.
Il conviendrait d'éliminer les éléments qui n'ont rien à faire, aussi bien dans Activate que dans Initialize, vérifier que la constitution de la liste de la Combo doit bien être mise à jour avant chaque affichage, sinon la déplacer, et logiquement la réinitialisation des contrôles prend place dans cette procédure.

Ceci dit, il reste toujours possible de bâtir une procédure de réinitialisation lancée à la suite de la validation d'une opération. Il me semble d'ailleurs que la seule que j'ai vue est la sauvegarde.

Cordialement.
1 membre du forum aime ce message.
s
siga2fadial
Membre fidèle
Membre fidèle
Messages : 156
Inscrit le : 24 octobre 2017
Version d'Excel : 2016

Message par siga2fadial » 13 décembre 2017, 14:15

Bonjour MFerrand,

merci pour ces explications.
C'est fou tout ce que tu sais sur VBA. Chapeau bas ! 8[] ::D
Je prends aussi note que je peux "raccourcir mon code" et faire un choix entre activate et initialize.

Me reste à trouver comment aller en page 1 de mon multipage lorsque je ferme l'userform et comment vider
uniquement le multipage.

Siga
s
siga2fadial
Membre fidèle
Membre fidèle
Messages : 156
Inscrit le : 24 octobre 2017
Version d'Excel : 2016

Message par siga2fadial » 13 décembre 2017, 14:48

Rebonjour à tous,

j'ai découvert en faisant quelques recherches sur le forum que tout comme le UserForm, il existe des évements
pour le multipage: ainsi Multipage_Change pourrait bien me servir! :wink:
je vais faire des tests et je reviens vers vous.

à +

Siga
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 13 décembre 2017, 15:10

Je n'ai pas l'habitude des Multipage, mais en regardant un peu, tu peux afficher la page 1 avec :
    MultiPage1.Value = 0
Quant à vider les contrôles du Multipage, tu passes la valeur des TextBox à "" et le ListIndex des Combo à -1...

Cordialement.
1 membre du forum aime ce message.
s
siga2fadial
Membre fidèle
Membre fidèle
Messages : 156
Inscrit le : 24 octobre 2017
Version d'Excel : 2016

Message par siga2fadial » 14 décembre 2017, 13:27

Bonjour à tous,
Bonjour M.Ferrand,

C'est nickel , cela fonctionne très bien :)
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message