Créer un échéancier en fonction d'un tableau aux informations multiples

  • Auteur de la discussion adelitodelapampa
  • Date de début

magellan

Modérâleur
Staff
en fait tu peux les appliquer en globales pour les constantes par exemple. ça n'engage à rien et les rend lisibles.

Par contre, essaye plus de trimbaler la variable de méthode en méthode, comme ça elle évolue que quand tu le désires, et l'emploie que quand nécessaire.

Par exemple: si tu déclares une variable "compteur", tu ne peux plus réutiliser le nom nulle part... sauf à créer des bugs involontaires. Dans le cas contraire, tu peux dès lors avoir des variables nommées clairement, sans risque d'effets de bord.

Autre chose: j'utilise constamment le "explicit" comme déclaration de sorte à imposer le format des variables. le Var c'est le mal mais ça dépanne énormément pour contourner les limites du vba.
 

svoglimacci

check memory failed but no bug detected
Bien entendu, les indices de boucles et autres compteurs resteront en local c'est sûr.
Ma question est plus pour ce qui sert presque partout , comme les références de worksheet, les numéros de colonnes... Je sais que les mettre en global c'est le mal, mais ça serait tellement plus lisible pour notre ami...
Mais non, tu as raison, il faut faire propre, je retire ma question.

Explicit, je ne connaissais pas. J'ai cherché, j'ai compris : cela me semble évident !
:merci:Merci des conseils:merci:
 

drul

Obscur pro du hardware
Staff
Il est presque inconcevable que Explicit existe, tellement c'est la base ...
Pour ton problème de paramètre trop nombreux, tu peux toujours les regroupés dans un "type", c'est souvent un bonne solution.
Edit:
ta fonction "LettreNumCol" est vraiment inutile, il est toujours possible de s'en tirer avec un numéro.
De même pour
CLAlpha et CLRange, complétement inutile ...

Si t'es intéressé, il y pas mal de truc optimisable améliorable dans tes macros (des subtilité de VBA) ...
 
Dernière édition:

svoglimacci

check memory failed but no bug detected
Il est presque inconcevable que Explicit existe, tellement c'est la base ...
Clair.
Pour ton problème de paramètre trop nombreux, tu peux toujours les regroupés dans un "type", c'est souvent un bonne solution.
Je ne connais pas mais je suppose que cela doit ressembler au "struct" du C. Mais j'ai peur que cela devienne trop complexe pour @adelitodelapampa qui est déjà bien chargé pour un non codeur. Finalement, 15 paramètres (au max) donnent plus de lisibilité. D'autant que parfois il n'y a qu'une partie des paramètres et dans ce cas, sépabo.
ta fonction "LettreNumCol" est vraiment inutile, il est toujours possible de s'en tirer avec un numéro. De même pour
CLAlpha et CLRange, complétement inutile ...
Oui et j'ai honte mais je n'ai pas cherché (je me perds un peu, cerveau assez limité). Je vais regarder. Mais si je reste comme maintenant, je peux mettre l'existence de cette possibilité en commentaire de la fonction, pour une évolution future.
Si t'es intéressé, il y pas mal de truc optimisable améliorable dans tes macros (des subtilité de VBA) ...
Alors... :) Oui si et seulement si :
- Cela ne te fait pas perdre trop de temps, vraiment ! Surtout que je risque d'oublier tes explications dans 3 jours. J'ai réellement le cerveau en berne (troubles cognitifs). Du coup, mes apprentissages récents repartent aussi rapidement qu'ils sont venus. Tu t'appelles comment déjà ? :D
- Cela ne compromet pas la lisibilité pour un non codeur (il m'arrive de sacrifier un peu la qualité pour la compréhension d'un néophyte, pour ne pas gaver le cerveau comme l'estomac d'une oie :) )

@adelitodelapampa t'es mort, achevé sous des monceaux de lignes ?
Ca va avec la manipulation des macros ?
Quand tu veux j'ai une nouvelle version, plus structurée. Pour le moment, j'espère que tu te penches plus sur les principes généraux (se promener dans les macros, déclaration de variables, appels de fonctions, instrucions, se balader dans la structure d'un document excel sans en connaitre toutes les possibilités). Le reste viendra plus tard et est à la limite moins important.
Par contre, je pense qu'il te faudra comprendre car tu seras responsable de l'évolution, au cas où. Sans devenir un expert pour autant.

Pu*ain ce que je suis bavard :D
 

drul

Obscur pro du hardware
Staff
ok juste une petite pour le fun:
Code:
            W3.Cells(2, (ARemplirCol * 3) + 1) = "SERVICE"
            W3.Cells(2, (ARemplirCol * 3) + 2) = "NOM"
            W3.Cells(2, (ARemplirCol * 3) + 3) = "ECHEANCE"

se remplace avantageusement par:
Code:
W3.Cells(2, (ARemplirCol * 3) + 1).Resize(1,3) = Array("SERVICE","NOM,","ECHEANCE")

P.S. (ARemplirCol*3) + 1, c'est atroce comme code :D

De manière générale, j'évite de travailler avec cells(iRow,jCol) qui me demande de gérer deux index, je préfère largement utiliser un truc du genre:
Code:
Dim targetCell As Range
Set targetCell = Cells(1, 1)
While targetCell.row <= LigNbTot
    targetCell.Value = "a"
    targetCell.Offset(0, 3).Value = "c"
    Set targetCell = targetCell.Offset(1, 0)
Wend

Ici à la place de la boucle while, une boucle for serait plus adéquate, ou encore mieux, l'incroyable boucle "for each" une tuerie du VBA
 
Dernière édition:

magellan

Modérâleur
Staff
ok juste une petite pour le fun:
Code:
            W3.Cells(2, (ARemplirCol * 3) + 1) = "SERVICE"
            W3.Cells(2, (ARemplirCol * 3) + 2) = "NOM"
            W3.Cells(2, (ARemplirCol * 3) + 3) = "ECHEANCE"

se remplace avantageusement par:
Code:
W3.Cells(2, (ARemplirCol * 3) + 1).Resize(1,3) = Array("SERVICE","NOM,","ECHEANCE")

P.S. (ARemplirCol*3) + 1, c'est atroce comme code :D

De manière générale, j'évite de travailler avec cells(iRow,jCol) qui me demande de gérer deux index, je préfère largement utiliser un truc du genre:
Code:
Dim targetCell As Range
Set targetCell = Cells(1, 1)
While targetCell.row <= LigNbTot
    targetCell.Value = "a"
    targetCell.Offset(0, 3).Value = "c"
    Set targetCell = targetCell.Offset(1, 0)
Wend

Ici à la place de la boucle while, une boucle for serait plus adéquate, ou encore mieux, l'incroyable boucle "for each" une tuerie du VBA
Bah ça dépend du raisonnement.
Le While est pratique si l'on ignore le nombre interne d'éléments. Il porte bien son nom "Tant que"!
Par exemple: tant qu'une condition n'est pas remplie, continuer. Très efficace quand il y a un traitement séquentiel à longueur variable (typiquement "tant que la cellule pointée contient un truc")

Le for est "trop précis" car il agit sur un élément prédéterminé. Par exemple "pour une valeur allant de 1 à n" où n est définitif (exemple: n est le nombre de valeurs d'un tableau)

Le foreach est indispensable UNIQUEMENT si l'on raisonne sur une liste dont on doit traiter tous les éléments. "Pour tout élément de la liste lst" par exemple.

Donc, me concernant... ça dépend des conditions préalables.
- Si je sais le nombre d'occurrences, ce sera un for
- Si je suis sur une itération variable avec un traitement partiel possible, while
- Si je traite tout dans une liste, alors foreach.
 

drul

Obscur pro du hardware
Staff
Je parlais du cas précis Magellan, évidement les 3 boucles ont leurs raisons d'exister ...
ici un
Code:
for each aRow in srcRange.Rows
Me semblerait tout particulièrement bien choisit ...
 

adelitodelapampa

Nouveau membre
Hello, je suis toujours là !

Juste MERCI pour tout ça, je n'ai pas encore eu le temps de me plonger dans les macros mais je m'y colle dès demain :hello:
 

magellan

Modérâleur
Staff
Je parlais du cas précis Magellan, évidement les 3 boucles ont leurs raisons d'exister ...
ici un
Code:
for each aRow in srcRange.Rows
Me semblerait tout particulièrement bien choisit ...
tout à fait! nous sommes bien d'accord. Un béotien a tendance à ne pas voir la différence et l'usage de ces trois méthodes, d'où mon petit laïus
 

svoglimacci

check memory failed but no bug detected
W3.Cells(2, (ARemplirCol * 3) + 1).Resize(1,3) = Array("SERVICE","NOM,","ECHEANCE")
C'est élégant, encore faut-il connaître la "structure" (comment on dit d'ailleurs ? Structure ? Objet ?) d'Excel ET les méthodes ET comprendre tout cela.
Pour moi, ce n'est pas évident, instinctif, coulant de source. J'ai du relire 3 fois. Je n'ai "fait" que du C de 89 à 92 avant de passer à un autre "Langage" , plus confidentiel, et pas Objet. Bon, moi on s'en moque, mais pense à @adelitodelapampa qui, pire, n'a jamais développé ! Donc, tu es applaudi mais recalé :D Merci en tous les cas 💙
P.S. (ARemplirCol*3) + 1, c'est atroce comme code :D
Il me faut bien aller de blocs de 3 colonnes en blocs de 3 colonnes ! Je sens que tu vas encore me sortir un truc offset de derrière les fagots (ah oui je le voisci-dessous). Tu seras applaudi mais recalé :D
Dim targetCell As Range
Set targetCell = Cells(1, 1)
While targetCell.row <= LigNbTot
targetCell.Value = "a"
targetCell.Offset(0, 3).Value = "c"
Set targetCell = targetCell.Offset(1, 0)
Wend
Tu as raison. Mais encore, je trouve que c'est ... rude. Sans rire, passer de rien à Objet, surtout pour des méthodes pas possibles ... Applaudi, Recalé :D
Ici à la place de la boucle while, une boucle for serait plus adéquate
Bof. Là je ne suis pas très d'accord, je suis plutôt @magellan sur ce coup.
l'incroyable boucle "for each" une tuerie du VBA
Avec un copyright Bill Gates !
Merci à tous pour vos conseils quoi qu'il en soit !
Mais vous trouvez mon code "pas à pas, pour débutant" réellement moche ?
N'est-il pas mieux de commencer facile puis, une fois le savoir bien rentré, monter d'un cran ? Pour les néophytes s'entend.

Bon, j'ai encore fait une tartine... :)
 

drul

Obscur pro du hardware
Staff
Pas d'accord non. Quand on s'apprend un langage on apprend "juste" sous peine de pendre de mauvaises habitudes ...
 

svoglimacci

check memory failed but no bug detected
<< N'oublions pas que nous traitons ici du cas particulier de @adelitodelapampa >>
1) Il ne me dérange pas qu'un néophyte complet en programmation, gavé comme une oie par un code soudain de 50 lignes (dans un langage inconnu puisqu'il est néophyte), n'y travaillant que peu d'heures par jour en plus du boulot code :
a = a+1 ; a = a+2 ; ... ; a= a+10; /* Exemple abusif je sais :D */
Plus tard, selon le temps qu'il y consacre, sa progression et son "focus" sur cette partie du programme, on lui indique la possibilité de passer par une boucle for en la lui expliquant. Et là "Oh oui punaise, c'est génial ce truc je vais en mettre partout !!". (Oui, j'ai forcé le trait par un exemple bien lourd, bourrin je suis ;) ).
2) Exemple en C : faire manger en peu de temps du ++a, a++, for, while, do while, boucles imbriquées, case, struct, pointeurs (vers tableaux de dimension 4 contenant des pointeurs sur des fonctions) ? A un non développeur ? Ouille :D
3) Bien entendu, tu as raison, le code doit être propre, on ne fait pas n'importe quoi. Mais entre propre et méga top optimisé... :)
4) En ce qui me concerne c'est différent. Ce que tu m'as appris est génial 💛 et, si je ne m'en souviens pas plus tard par manque de pratique, je saurai tout de même que ce genre de choses existe, et j'irai retrouver l'info. Mais même branquignole en VBA et en "structure" Excel, j'ai tripoté du C++, du Java, de l'Objet/Propriétés/Méthodes, du VB .net... Bref, j'ai une punaise d'avance sur adelito...
5) Tiens, je ne sais pas formater une date avec un 0 avant les mois de 1à 6. J'ai bidouillé, avec la ferme intention de demander plus tard une solution carrée.
6) C'est mon opinion, et je la partage ( chplésante :D )

N'empêche merci encore pour tes "trucs" @drul, je ne pensais pas que les méthodes que tu m'as montrées existaient. Jamais y penser je n'aurais !
 

drul

Obscur pro du hardware
Staff
à la base les tricks que je t'ai montré s'adresse à toi, pas vraiment a
@adelitodelapampa ... :D

et vu ton background tu as aussi une sacrée punaise d'avance sur moi en programmation ...
 

svoglimacci

check memory failed but no bug detected
1/Oui c'est vrai. Adelito doit se barre en fusée :D
2/Avance sur toi ? Alors détrompes pas. J'ai poussé (3 ans) du C (mais en info de gestion) c'est tout. Je suis par contre admiratif de ce que tu sais sur l'Objet Excel. Tu te ballades dedans quand tu t'ennuies ? :D
 
Dernière édition:

svoglimacci

check memory failed but no bug detected
vu ton background tu as aussi une sacrée punaise d'avance sur moi en programmation ...
Je me suis mal exprimé. Quand j'ai écrit "tripoter"du Java, C++ et tout, c'est tripoter de très loin, c'est tripatouiller. La plupart du temps pour résoudre un problème ponctuel, guère plus. Alors non, je t'en prie, ne pense surtout pas que je puisse avoir de l'avance sur toi en programmation ! Tu mes mon modèle ! 😍😍
Par contre je suis grand, beau à pleurer, avec un corps d'athlète et un QI dépassant l'entendement et là, il va te falloir te lever tôt pour me concurrencer :D
 

drul

Obscur pro du hardware
Staff
Le VBA je me débrouille, je l'utilise de temps en temps au boulot pour des outils de prototypage rapide ou de traitement de données machines, mais c'est pas mon métier, le pro ici, c'est Magellan.

D'accord, c'est toi le plus beau ;) (je n'ai aucune prétention dans ce domaine, une longue asperge qui ne ressemble à rien ... à part à une ... asperge ...)
 

magellan

Modérâleur
Staff
Pro? Je suis développeur certes, mais il y a toujours plus compétent, d'autant que le vba je l'ai pratiqué pour le "fun" ;) donc de fait j'en apprends aussi ici en lisant vos codes respectifs.

Pour ma part j'ai surtout l'expertise de conception au titre de mon expérience sur une palanquée de langages différents. Quand je vois des choses qui ne me plaisent pas (côté algo notamment) je le dis... après les bonnes pratiques sont, de mon point de vue totalement personnel, qu'on s'adosse à des règles pour ainsi dire immuables (à quelques exceptions près)
- On type les variables tant que faire se peut.
Par exemple, quand on manipule des chiffres on utilise le type adapté (réel pour les virgules, l'entier pour les entiers...)

- On conçoit des structures/objets (selon les langages) de manière à avoir quelque-chose de facilement manipulables.
Par exemple:
Java:
public class objVille{

public Ville(){
  String nomVille;
  String nomPays;
  int nbreHabitants;
    String adresseMairie;
    int numeroVoie;
    int codePostal;
}
}
Comme ça, on manipule l'objet Ville (une fois déclaré) est manipulé avec les propriétés déclarées

Java:
Object maville = new Ville();
maville.nomVille="Ma ville s'appelle toto";
maville.numeroVoie = 10;
system.out.println(maville.nomVille);
La dernière commande retournera un affichage console "Ma ville s'appelle toto"

Si l'on va plus loin, on peut de plus jouer sur le contenu en créant des méthodes associées à l'objet de manière à simplifier la validation du contenu.
Par exemple
Java:
public class objVille{
// On enrichit
public Ville(){
  String nomVille;
  String nomPays;
  int nbreHabitants;
    String adresseMairie;
    int numeroVoie;
    int codePostal;
}
public String nomConstuit() {

return nomVille + " " numeroVoie.toString() + " "+adresseMairie;
}
Ce qui donne quand on appelle la méthode
Java:
Object maville = new Ville();
maville.nomVille="Ma ville s'appelle toto";
maville.numeroVoie = 10;
maville.adresseMairie ="PAF";
system.out.println(maville.nomConstuit());
-> "Ma ville s'appelle toto 10 PAF"

Cette façon de procéder améliore notablement la lisibilité du code!

- N'utiliser les constantes qu'en cas de besoin ABSOLU
On ne fait des constantes que pour des choses dont on a la certitude qu'elles n'évolueront pas... (en tout cas en théorie)
Par exemple, si l'on estime un nombre maxi de connexions sur un service donné, on fixera cette valeur en constante de sorte à ne plus y revenir.

- Se constituer une "caisse à outils"
Tant de choses sont récurrentes: des calculs de moyennes, trouver des notions de dates avec bornes, des calculs de TVA... alors on se crée ces méthodes en librairies qu'on met systématiquement en place. Cela épargne de la surcharge, et surtout de se dire "merde je refais à chaque fois ce truc".
Un exemple efficace: une méthode où l'on passe le montant TTC et le taux de TVA appliqué pour recevoir en réponse le HT et la TVA (avec les arrondis et ajustements qui vont bien)

- Créer des méthodes CLAIRES
Une méthode "hamburger" à qui on donne des valeurs en String et qui retourne un entier sans la moindre explication... c'est le mal

- Prévoir tant que faire se peut de préparer le code avec des commentaires
On précise les données et le format en entrée, le résultat en sortie, ainsi qu'un résumé de la règle de fonctionnement.

- On COMMENTE
Rien n'est plus insupportable que de déplier du code illisible, compact et sans la moindre explication.
Pire: quand je vois des variables intermédiaires toutes nommées varx où x est un chiffre... je craque. C'est si compliqué de faire "compteur", "ListeUser" ...

Enfin voilà quelques fondamentaux...
 

svoglimacci

check memory failed but no bug detected
++Magellan.
Mais toi, en plus, tu as la class' :ouimaitre: . Le nombre de points auxquels tu réponds dans la journée avec de beaux chapitres bien écrits et bien longs me laisse penser que tu es plusieurs :lol:
une longue asperge qui ne ressemble à rien ... à part à une ... asperge ...
J'ai menti. Moi c'est plutôt une largeur d'asperge.
Sinon les gars, vous ne m'avez encore pas dit comment on appelle "L'objet" Excel. Objet ? Structure ? Dom (genre page Web) ? Machin ?
Sinon je vois que j'aurais dû déclarer mes passages de paramètres "ByVal" mais je ne veux plus toucher au code sauf demande de Adelito.

[Edit]
@adelitodelapampa
Je n'y touche plus, sauf demande de ta part.
Il manque :
- sortir le bloc de ruptures en Fonction pour la lisibilité / y mieux nommer les variables, c'est peu lisible.
- affecter la macro à une combinaison de touches, un bouton, un menu (c'est sûrement possible).
- faire la mise en forme (couleurs, cadres...).
Le code suit, il parait que je dépasse 10 000 caractères dans mon message.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 060
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut