Macros Excel VBA à expliquer

BUDGETS
5 contributions
Membre depuis le 22/05/2018
Envoyé le 02/06/2018 à 22:10


Bonjour,

Je cherche quelqu'un qui m'explique le fonctionnement de mes différentes macros de mon fichier (ce sera très long). Comment procéder ? Je pose toujours la même question et personne n'a la politesse de me répondre !



Bipbipcoyote Bipbipcoyote
3 003 contributions
Membre depuis le 06/03/2001
Envoyé le 05/06/2018 à 03:06 Modifié par Bipbipcoyote


Bonjour,
Tu peux aller dans l'éditeur de macro (ALT+F11) et exécuter les macros une à une en mode pas à pas avec la touche F8 en plaçant le curseur sur les variables tu verras alors leur valeur... sinon copie tes macros ici et nous tâcherons de les décortiquer
ou si ton fichier n'est pas confidentiel, tu peux le placer sur ci-joint et tu nous donnes l'url pour que nous puissions le télécharger
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
3 003 contributions
Membre depuis le 06/03/2001
Envoyé le 06/06/2018 à 21:08


Bonjour,
Heureusement que ce sont les autres qui sont impolis [:D]
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
BUDGETS
5 contributions
Membre depuis le 22/05/2018
Envoyé le 25/06/2018 à 21:58


Bonjour,
Ci-joint le fichier demandé, pour l'instant, il s'agit du module 1
Excuses-moi de ne pas avoir répondu plus tôt mais je n'ai jamais été averti de l'arrivée de ton message. Contrairement à une réponse, ce n'est pas de l'impolitesse puisque jamaisreçula réponse.
https://cjoint.com/c/HFztiynDDAJ

Bipbipcoyote Bipbipcoyote
3 003 contributions
Membre depuis le 06/03/2001
Envoyé le 26/06/2018 à 03:59 Modifié par Bipbipcoyote


Bonjour,
Comme je l'ai dit plus haut, il faut aller dans le VBE (Visual Basic Editor) avec les touches ALT+F11 et en faisant un double clic sur le nom des feuilles et modules, on entre dans la page qui les concerne...
J'ai récupéré ton fichier et je vois que le code est commenté, c'est ce qui est écrit en vert, apparemment le créateur de ce fichier a documenté son travail
Apparemment comme je peux comprendre l'application, on doit d'abord créer ce qu'il appelle un référentiel, c'est à dire une denrée et son conditionnement et on y associe le moment du repas, je suppose donc qu' in fine on obtient des menus pour la semaine ou quelque chose dans le genre

En fait, ça commence à l'ouverture du fichier, si tu vas dans le code de thisWorkbook on voit qu'il appelle une procédure nommée CacherFeuilles où il ne laisse visible que la page nommée Accueil, Ensuite là on remplit les combobox (liste déroulante) et on clique sur le bouton "Créer référentiels" , si on en a déjà créés on peut utiliser le bouton Modifier ou Supprimer, il y a du code associé à chaque bouton...

Au fait, as tu affiché l'onglet "Développeur" dans Excel, si oui tu peux te placer en mode création et sélectionner les objets (les boutons notamment) et choisir la commande "Visualiser le code" sur cet onglet Développeur, cela t'amènera dans le VBE à l'endroit ad hoc

Dans la procédure CacherFeuilles il faut déclarer la variable en ajoutant
Dim ws As Worksheet sinon tu obtiens une erreur... il est toujours préférable de déclarer le type d'une variable, donc ici tu veux parcourir la classe worksheets il te faut un objet de ce type... donc ça donne

Sub CacherFeuilles()
Dim ws As Worksheet
For Each ws In Worksheets 'pour chaque feuille du classeur
If ws.Name <> "Accueil" Then ws.Visible = False 's'il ne s'agit pas de la feuille "Accueil", on la masque
Next ws
End Sub

On boucle sur les noms (=name) des feuilles de travail (= worksheet) avec la fonction For Each (= pour chaque) en leur donnant un nom temporaire (=ws) Excel connaissant automatiquement ce que contient actuellement la collection(on doit dire "classe" normalement, mais moi je trouve le mot collection plus explicite) Worksheets
(remarque le S en plus entre un objet et sa classe), il fait le nombre de boucles utiles . On passe à la feuille suivante avec l'opération Next

Le reste des fonctions ne m'a pas posé de souci et comme il est documenté par l'auteur, je ne vois pas ce que je peux ajouter

Je suppose que lorsqu'il veut voir ses menus, il clique sur le bouton "Afficher TabData" et il utilise le filtre automatique sur la colonne "Jour articles" et les ingrédients se regroupent et il a la liste des marchandises composant son repas ou quelque chose dans le genre

NB: je conseille d'inscrire au dessus de chaque page de code du VBE (au sommet de la page en dehors des procédures)

Option explicit

cette commande vous oblige de déclarer le type des variables et l'avantage, c'est que Excel rouspète au moment où vous codez et que vous oubliez ces déclarations. C'est une bonne habitude
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
BUDGETS
5 contributions
Membre depuis le 22/05/2018
Envoyé le 26/06/2018 à 09:52


Bonjour,

Je t'envoie un autre fichier pour que tu voies le but recherché. Dans ce fichier, il n'y avait rien pour la suppression et la modification (autant que je m'en souvienne).
Pour ce qui est des commentaires, en vert, c'est moi qui les ai écrits (avec l'aide de VBA) mais je ne suis pas l'auteur du programme en lui-même.
https://cjoint.com/c/HFAhKGW76cJ
Bonnes journée et continuation.

Bipbipcoyote Bipbipcoyote
3 003 contributions
Membre depuis le 06/03/2001
Envoyé le 26/06/2018 à 13:42 Modifié par Bipbipcoyote


Bonjour,
Ce fichier fait à peu près la même chose (bien qu'il me semble incomplet (feuille Accueil; ici il semblerait que la page principale soit Saisie des menus) et dans le code VBA, il n'y a que 2 choses supplémentaires

1. ActiveCell.End(xlDown).Select qui permet de sélectionner la dernière cellule remplie en prenant une colonne de référence et la recherche de cette cellule s'effectue à partir du bas.

NB: Si cette fonction est utilisée pour retrouver une donnée pour que cette fonction délivre correctement cette adresse de cellule, il ne doit pas y avoir de cellule vide dans la colonne. Exemple tu as rempli les cellules de A1 à A5, respectivement
A1 contient a
A2 contient b
A3 contient c
A4 contient d
A5 contient e
si tu veux retrouver b ça va marcher, mais si tu vides la cellule A3, ça ne fonctionnera plus parce que la recherche s'arrêtera sur A3 puisque maintenant c'est une cellule vide
Exemple à tester

Sub recherche()
''on détermine une variable de type cellule
Dim cel As Range

''on détermine une boucle sur une plage de cellule,
'ici de la cellule A1 jusque la dernière cellule remplie de la colonne A
'il ne peut pas y avoir d'interruption entre les données
'sinon la boucle s'arrête
For Each cel In Range("A1", Range("A1").End(xlDown))
If cel = "b" Then
MsgBox "Vous avez trouvé une cellule qui contient la lettre b dans la cellule " & cel.Address
Else: MsgBox "Rien trouvé", vbOKOnly, "Attention" 'se déclenche si on efface A3 dans notre exemple

End If
Next
End Sub

2. il fait un usage intensif de la commande Offset ce qui correspond à un déplacement fictif du focus (c'est comme si tu changeais de cellule mais ton curseur ne change pas de place)....

donc un truc comme ci-dessous signifie
If Range("A4") <> "" Then ActiveCell.End(xlDown).Select 'si la cellule A4 est vide alors on sélectionne la dernière cellule remplie de la colonne A (puisque A4 se trouve dans la colonne A)

ActiveCell.Offset(1, 0).Select 'puisque la cellule trouvée contient quelque chose et qu'on ne veut pas l'effacer on va se placer sur la ligne en dessous qui elle est vide. On pouvait regrouper les 2 lignes en une seule en écrivant If Range("A4") <> "" Then ActiveCell.End(xlDown).Offset(1,0).Select mais bon on ne va pas pinailler là-dessus

ActiveCell.Value = Numéro_du_menu 'dans cette cellule active maintenant puisqu'on a fait un select dans la ligne de code précédente, on y inscrit le contenu de la variable Numéro_du_menu

ActiveCell.Offset(0, 1).Value = Date_du_menu 'Sans déplacer le curseur de la cellule active , excel tend ses petits bras sur la colonne d'à côté et y dépose le contenu de la variable Date_du_menu

ActiveCell.Offset(0, 2).Value = Code_période_concernée 'Idem mais cette fois 2 colonnes plus loin et pour une autre variabe

l'auteur avec cette méthode finit par remplir une ligne supplémentaire sur la feuille qu'il a désignée un peu avant dans son code ceci sans changer de cellule active

NB: Offset (Ligne, Colonne) permet de réaliser un déplacement fictif du focus, les chiffres utilisés pour Ligne et Colonne peuvent être négatifs, il faut juste s'assurer que ce déplacement fictif ne sort pas de la feuille, donc un truc comme Range("A3").Offset(2,-3).Select, ça va gueuler, parce que 3 colonnes avant la cellule A3, il n'y a rien. Ici cela semble évident parce que j'ai utilisé une adresse de cellule en "dur" mais on peut facilement obtenir une erreur si on utilise une variable
Dim cel as range
cel.Offset(2,-3) 'c'est nettement moins facile à découvrir

Un bon truc pour découvrir des erreurs est d’exécuter la macro pas à pas avec la touche F8 (on place le curseur n'importe où dans la procédure et on appuie sur cette touche et on découvre souvent quelle ligne est fautive et quand le message d'erreur ne semble pas convaincant, c'est que l'erreur se trouve au dessus. Exemple dans une boucle for next, on y place souvent une condition if et bien si on oublie le end if on recevra comme message d'erreur "next sans for" mais en fait, ce serait plutôt un if sans end if... c'est parfois marrant et agaçant tout à la fois)

Voilà, je ne vois pas ce que tu souhaites en plus, poses d'autres questions peut-être un peu plus précises
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
BUDGETS
5 contributions
Membre depuis le 22/05/2018
Envoyé le 26/06/2018 à 20:24


Bonjour,

En ce qui concerne le module 1, mes commentaires sont-ils exacts ? Si oui, demain, je passerai à autre chose. Comment faire BipBipCoyote pour répondreà toi personnelllement.

BUDGETS
5 contributions
Membre depuis le 22/05/2018
Envoyé le 26/06/2018 à 21:25


Bonjour Bipbipcoyote
En définitive, les commentaires du module 1 que j'ai rédigés personnellement sont-ils exacts. Si oui, demain, je passerai à une autre étape.
Bonnes soirée,nuit et continuation.


Bipbipcoyote Bipbipcoyote
3 003 contributions
Membre depuis le 06/03/2001
Envoyé le 27/06/2018 à 01:43 Modifié par Bipbipcoyote


Bonjour,
oui, cela me paraît correct

Pour me répondre personnellement, il faut soit utiliser la messagerie de mémoclic. Pour cela il suffit de cliquer sur mon pseudo qui est dans un rectangle bleu au dessus de chacune de mes réponses, tu seras dirigé vers une autre page qui contiendra la mention "Envoyer un message à Bipbipcoyote"
ou alors, tu peux m'écrire sur bipbipcoyote2000@yahoo.fr commence le sujet de ton mail par Memoclic - et le sujet de ton message. Ainsi je peux reconnaître la source du courrier
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions

Discussion trop ancienne

Cette discussion a été automatiquement fermée car elle n'a plus reçue de nouveau message depuis trop longtemps.

Nous vous suggérons de créer un nouveau message

« Retour sur la liste des messages de ce forum