VBA améliorer vitesse pour inscription dans un tableau

Je m'occupe du code que pour l'impact que cela a sur les formules, notamment sur la formule intermédiaire "=R[-1]C+1" et les recherchev.

Mais je découvre aussi une nouvelle formule hyperchornophage dans le nouveau tableau calendrier des vacances et qui je comprends maintenant les amliorations proposées étaient encore insuffisantes.

=SI(SOMME.SI.ENS(Tableau2[Temps];Tableau2[Poste];$A7;Tableau2[Date];C$4;Tableau2[Calendrier absence];"o")=0;"";-SOMME.SI.ENS(Tableau2[Temps];Tableau2[Poste];$A7;Tableau2[Date];C$4;Tableau2[Calendrier absence];"o"))

je pense donc que la mise en place du calcul manuel/auto était indispensable mais pour cela il fallait oter "=R[-1]C+1"

Néanmoins, il faudrait revoir ces tableaux et les réaliser par TCD pour qu'il y ait un impact sur la vitesse.

Mais je te laisse le code (car en plus les userform ce n'est pas ma tasse de thé, je passe par des onglets dédiés).

Non en effet je n'ai pas beaucoup dormi cette nuit pour d'autres raisons...

@Steelson

Non en effet je n'ai pas beaucoup dormi cette nuit pour d'autres raisons...

J'espère que rien de grave...

Mais je te laisse le code (car en plus les userform ce n'est pas ma tasse de thé, je passe par des onglets dédiés)

Ok. Lol! pour les userform. Cela me rappelle d'avoir vu quelqu'un qui avait proposé d'utiliser une feuille plutot qu'une userform. Et là je me demande si ce n'est pas toi... Manière de faire à laquelle j'adhère assez d'autant que cela fonctionne sur toutes les versions d'excel (97 à 2019 !), que ce soit sous Windows ou sous MAC.

@jujule

Je n'avais pas fait attention à cela avant mais je vois que dans le code, il y a ces deux lignes --> jour = Day(TextBoxDateDebut): mois = Month(TextBoxDateDebut): annee = Year(TextBoxDateDebut):
et plus bas --> jourf = Day(TextBoxDateFin): moisf = Month(TextBoxDateFin): anneef = Year(TextBoxDateFin):

Quel est le but poursuivi car cela fait 6 variables qui ne sont pas utilisées plus bas ?

Je ne m’attendais pas à temps, merci encore et j’espère également que tout va bien. Merci aussi Dan 😊 Je me sens dans un cours accéléré +++

  • Le fichier test de 5;54 va à la vitesse de l’éclair 😊, celui de 8 :50 me donne une erreur d’exécution
  • Extra pour la solution doublon, que je comprends bien
  • Je découvre application.calculation, je ferai plus de lecture pour mieux comprendre
  • Pour les calendriers, si j’utilise l’option TCD, comment faire pour voir toutes les dates, même s’il n’y a aucune donnée inscrite pour une date? Si c’est possible, j’adhère complètement et je m’en occupera
  • J’ai utilisé le user form, mais si utiliser une feuille dédiée serait préférable, je peux y travailler. Est-ce que c’est mieux ou est-ce que ca défait tout le code?
  • Pour les 2 lignes de code : jour = Day(TextBoxDateDebut): mois = Month(TextBoxDateDebut): annee = Year(TextBoxDateDebut):
    et plus bas --> jourf = Day(TextBoxDateFin): moisf = Month(TextBoxDateFin): anneef = Year(TextBoxDateFin): Il s’agit d’un code que j’ai retrouvé qui me permet de valider l’entrée saisie comme date qui fonctionne bien
  • Je viens de découvrir dim… as… peut être ces lignes ne sont effectivement plus nécessaires.

Quelle est l'erreur d'exécution avec le fichier de 8:50 (ce dernier a pour but de rechercher les caractéristiques d'un nom dans le programme et éviter les deux RECHERCHEV) ? mais si tu es satisfait de celui de 5:54 reste là dessus.

Pour passer à un onglet ... faut pas forcément changer beaucoup de choses, mais en effet la macro sera légèrement différente, si j'ai le temps je m'y mettrais, mais compte tenu de ton investissement en temps je te conseille de poursuivre en userform (pour moi le gain, il est à la construction).

Tu as raison, un TCD ne donnera rien s'il n'existe pas la valeur MAIS tu peux faire un TCD et ensuite faire appel aux valeurs du TCD dans ton onglet calendrier via la formule LIREDONNEESTABCROISDYNAMIQUE, tu as l'avantage du calcul par TCD qui n'entrave pas la vitesse, et l'avantage ensuite de la présentation.

Pour répondre à vos différrents points :

J’ai utilisé le user form, mais si utiliser une feuille dédiée serait préférable, je peux y travailler. Est-ce que c’est mieux ou est-ce que ca défait tout le code?

Non restez avec l'userform. C'était juste une réflexion par rapport à un ancien post où Steelson, si je ne me trompe, avait proposé de mettre tout sur une feuille car la version excel était 2019 et dédiée au MAC. Là ce serait un peu tout refaire pour vous.

Pour les 2 lignes de code : jour = Day(TextBoxDateDebut): mois = Month(TextBoxDateDebut): annee = Year(TextBoxDateDebut):

et plus bas --> jourf = Day(TextBoxDateFin): moisf = Month(TextBoxDateFin): anneef = Year(TextBoxDateFin): Il s’agit d’un code que j’ai retrouvé qui me permet de valider l’entrée saisie comme date qui fonctionne bien

Oui j'ai vu cela quelque part mais dans votre cas cela ne sert à rien. J'ai inhibé ces deux lignes et également rajouté deux macros qui vont faire le controle de la date dans les deux rubriques (code textbox...update). De cette sorte, il y a deux contrôles. Un seul la textbox lors de l'entrée de l'information et un au moment où vous cliquez sur le bouton Validation.

Je viens de découvrir dim… as… peut être ces lignes ne sont effectivement plus nécessaires.

Les Dim sont juste une déclaration de variable et donc ne sont plus nécessaires puisque les lignes ne sont plus actives.

Votre fichier en retour dans lequel, je pense que Steelson va rajouter les formules

Votre fichier en retour dans lequel, je pense que Steelson va rajouter les formules

si en effet Jujule me donne la raison du plantage, sinon tout y est notamment pour ce qui est de calculation manuelle/auto

par contre, en terme de vitesse, je reste persuadé qu'il faut maintenant traiter les calendriers et éviter les formules NB.SI.ENS assez chronophages aussi car elles concernent tout le tableau2

Steelson,

c'est juste une idée mais ce ne serait pas les segments qui provoque la lenteur ? ou, je n'ai pas vérifié, mais je suppose qu'il n'y a pas de formules matricielles dans le fichier ...

Pour le fichier de 8:50, quand je valide le formulaire, j'obtiens Erreur d'exécution '9': L'indice n'appartient pas à la sélection sur cette ligne

.Range("c" & der & ":c" & der + n) = tblEmploy(ligne, 2)

Pour le dernier fichier, celui d'il y a 26 min, quand je clique pour ouvrir le formulaire, j'ai une erreur de compilation Nom amibgu détecté : TextBoxDateFin_afterupdate

Private Sub TextBoxDateFin_afterupdate()

Et je vais faire les calendriers de la façon indiquée, en apprenant la formule LIREDONNEESTABCROISDYNAMIQUE : )

Pour le fichier de 8:50, quand je valide le formulaire, j'obtiens Erreur d'exécution '9': L'indice n'appartient pas à la sélection sur cette ligne

.Range("c" & der & ":c" & der + n) = tblEmploy(ligne, 2)

La table des Employés était-elle bien triée par nom ? C'est indispensable pour appliquer une dichotomie. Ligne devait être égal à 0, ce qui ne devrait pas arriver car le choix du nom est fait sur la même table.

Ou alors tblEmploy n'était pas déclaré dans le module tout en haut avant la première sub !

Steelson,

c'est juste une idée mais ce ne serait pas les segments qui provoque la lenteur ? ou, je n'ai pas vérifié, mais je suppose qu'il n'y a pas de formules matricielles dans le fichier ...

Je ne sais pas, pas assez d'expérience, mais peut-être car elles prennent leur source dans une grande quantité de données. Bien vu.

Ce que je regarde en priorité, ce sont les formules matricielles ou pseudo-matricielles, qui brassent un grand nombre de données :

  • en formules :
    • les {=_____________}
    • les SOMMEPROD ou SOMME.SI et SOMME.SI.ENS (cas des calendriers qui étaient absents au début)
    • les NB.SI (ici il y avait la recherche des doublons)
    • et dans une moindre mesure les RECHERCHEV surtout avec le paramètre FAUX
  • ensuite il peut y avoir des MFC, surtout quand excel les duplique à l'infini (j'en viens parfois à programmer leur effacement et leur remise en place par macro)
  • pour les macros :
    • travailler avec des array et pas directement avec les cellules,
    • mettre en place dans la macro Application.Calculation = xlCalculationManual et Application.Calculation = xlCalculationAutomatic mais qui n'était pas possible ici du fait de la formule dans la macro "=R[-1]C+1"qu'il fallait d'abord remplacer par autre chose.

Lol! pour les userform. Cela me rappelle d'avoir vu quelqu'un qui avait proposé d'utiliser une feuille plutot qu'une userform.

en effet ... https://www.excel-pratique.com/fr/telechargements/utilitaires/excel-formulaire-no438

@ Jujule

Pour l'email, on ne t'a pas oublié (e ?) ... a moins que tu aies eu une réponse par ailleurs.

Et je vais faire les calendriers de la façon indiquée, en apprenant la formule LIREDONNEESTABCROISDYNAMIQUE : )

Petite démo (mais j'ai mis n'importe quoi dans la colonne poste)

TCD ...

capture d ecran 125

Calendrier ... avec la formule

=SIERREUR(LIREDONNEESTABCROISDYNAMIQUE("Temps";TCD!$A$3;"Poste";$A7;"Date";C$108);0)

il suffit de faire = et sélectionner une valeur du TCD et ensuite retoucher manuellement la formule pour y mettre les variables A3 et C108 ici

capture d ecran 124

ajoute ensuite une macro d'actualisation du TCD quand tu actives la feuille du calendrier.

Re

Pour le dernier fichier, celui d'il y a 26 min, quand je clique pour ouvrir le formulaire, j'ai une erreur de compilation Nom amibgu détecté : TextBoxDateFin_afterupdate

Private Sub TextBoxDateFin_afterupdate()

Oui effectivement...c'est parce que le début du code est trouvé deux fois. Tout en haut des codes dans l'userform, il faut remplacer Private Sub TextBoxDateFin_afterupdate() par --> Private Sub TextBoxDatedebut_afterupdate()

@Steelson, yes ! ma mémoire ne me fait pas encore défaut....

Vous êtes des machines. J'ai des urgences à régler, je regarde le tout plus attentivement ce soir.

Énorme merci à vous 2

Tout semble fonctionner à merveille! Je suis en train de finaliser les calendriers en passant par TCD. La vitesse des nouvelles inscriptions est parfaite. Je continue à tester, je suis enthousiaste :) Merci!

Est-ce que je demande trop si je demande de l'aide pour qu'un courriel outlook soit envoyé automatiquement à chaque nouvelle entrée ayant comme statut "nouvelle demande" ? (à chaque nouvelle entrée de formulaire, pas pour chaque date) C'était ma prochaine étape, mais avant de m'y lancer je voulais m'assurer que ma base était bonne.

Edit: Finalement voici le fichier modifier avec la fonction d'email que j'ai trouvée et qui semble fonctionnelle, j'aurais juste aimé indiquer en plus le contenu de la ligne dans le texte

Pendant que tu dors, on te prépare la suite ...

Le plus simple du plus simple si vous avez outlook comme client de messagerie :

Sub envoi(destinataire As String, titre As String, texte As String)
Dim messagerie As Object
Dim email As Object

    Set messagerie = CreateObject("Outlook.Application")
    Set email = messagerie.CreateItem(0)
    With email
        .To = destinataire
        .Subject = titre
        .htmlbody = texte & .htmlbody ' envoi html avec signature
        .display ' .send pour envoi direct
    End With
    Set email = Nothing
    Set messagerie = Nothing

End Sub

j'ai pris l'option du texte en html avec la signature du demandeur. Dans ce cas, selon le texte que tu veux faire passer et sa mise en forme, tu auras à utiliser des balises html comme par exemple :

envoi "jujule@quebec.ca", _
    "Nouvelle demande de " & ComboBoxNom, _
    "Demande de <b>" & ComboBoxNom & "</b><br>pour la période du " & Format(CDate(TextBoxDateDebut), "jj/mm/aaaa") & " au " & Format(.Range("g" & der), "jj/mm/aaaa") & "<br>pour le motif de : " & ComboBoxMotif

avec

  • <b>____________</b> pour gras
  • <br> retour à la ligne (et non vbcrlf)
  • et si les é, à etc. ne passent pas -ce qui devrait être le cas, mettre & e a c u t e ; ou & a g r a v e ; sans espace que je suis obligé de mettre ici sinon cela disparaît , etc. ... pas de soucis, j'ai une fonction de transformation du texte

:D

Au fait, comment pourrais je faire pour que ma colonne M de mon tableau 2, Tableau2[Motif] soit automatiquement "férié" si la journée est inscrite dans ma plage TableauFériés[Fériés] ?

Merci!

Bonjour

Au fait, comment pourrais je faire pour que ma colonne M de mon tableau 2, Tableau2[Motif] soit automatiquement "férié" si la journée est inscrite dans ma plage TableauFériés[Fériés] ?

La colonne M du tableau2 ce sont les mois non ? Motifs est dans la colonne Q

Une idée à creuser ce serait que la liste déroulante Motifs dans l'USF mette fériés automatiquement si la date début tombe sur un jour férié. Mais au delà de cet proposition, comment allez vous faire si le férié se situe entre la date début et la date de fin ?

C'est que j'ai rafraichi un peu mon tableau et ai supprimé le superflu, certaines colonnes ont changé, mais je suis très à l'aise de continuer sur le test et je recopie. Ca me permet de bien comprendre.

En fait je voudrais que quand c'est un férié, ultimement le temps pour cette date seulement s'affiche à 0.

J'Aimerais que cette ligne s'affiche sur le tableau de données.

Rechercher des sujets similaires à "vba ameliorer vitesse inscription tableau"