Besoin aide VBA

Spinzi

XLDnaute Impliqué
Bonjour à tous,

étant toujours en quête d'optimisation et de rapidité, mais cependant nul en macro/VBA, je viens vers vous pour la construction d'un fichier que j'avais réussi avec des formules, mais qui s'avère légèrement long à l'éxécution (3-4 minutes).

Je pense procéder par phases (j'ai différentes bases mais surtout un gros fichier à optimiser).

J'ai déjà commencé par tout mettre en tableaux excel car j'ai lu plusieurs fois que les tableaux accéléraient la vitesse des programmes VBA.

Dans un premier temps je souhaite donc modifier le code VBA présent dans le fichier ci dessous qui permet d'alimenter les colonnes A, B et C avec des informations sans doublon.
Ces colonnes sans doublons serviront plus tard pour alimenter plusieurs listes de validation.

J'aimerai donc une modification du code pour prendre en compte le tableau qui est dynamique et qui est donc ajusté pile poil à la taille du tableau et donc des données : pas besoin de vérifier des milliers de lignes pour rien.

Si vous avez des questions, n'hésitez pas et merci d'avance pour les améliorations que vous pourriez apporter à ce fichier.
 

Pièces jointes

  • TravauxHercule.xlsm
    450.8 KB · Affichages: 195
  • TravauxHercule.xlsm
    450.8 KB · Affichages: 199
  • TravauxHercule.xlsm
    450.8 KB · Affichages: 204
Dernière édition:

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

Comme le rajout de lignes (une fois le rapport édité, je le transmets aux personnes concernées qui peuvent rajouter des lignes) suscite des erreurs (elles ne seront pas prise en compte dans les sous totaux), je préfère avoir une liste avec toutes les données que je retraite ensuite sous forme de graphique avec des sommeprod etc.
 

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

Si. Des lignes insérées seraient forcément prise en compte par les totaux puisque ils ne se réfèrent qu'à des ligne de rubriques, étant de la forme =SOUS.TOTAL(9;DECALER(CetteCelluleDeRubrique;+1;0):
DECALER(CelluleRubriqueSuivante;-1;0))
 

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

Je pense que je me suis mal exprimé : la ligne sera ajoutée directement dans le rapport, pas dans la base ! Si je rajoute une ligne à la fin du rapport (onglet budget) le montant de celle ci n'est pas pris en comtpe dans les totaux (ce qui parait logique). Là aussi c'est une de mes grandes problématiques (j'en avais parlé quelque page avant avec l'ajout de ligne par usf).

Comme pas de solution, le plus simple est d'avoir une liste simple des résultats et de les retraiter ensuite.
 

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

C'est pourquoi j'ai ajouté une bordure à la fin. Il ne faut de toute façon jamais écrire sur la ligne qui suit une rubrique, tout spécialement celle après la dernière puisque ce n'est plus une rubrique. Toujours insérer une ligne devant. On devrait d'ailleurs y inscrire en rouge petits caractères et italique "Ne rien inscrire dans cette ligne. Si besoin, en insérer une nouvelle devant."
Parce que si on se contente d'écrire dedans, bien sûr elle n'est pas prise en compte puisque le total se réfère à DECALER(CetteLigne; -1;0). Tandis que si on la chasse une ligne plus bas en insérant une nouvelle ligne, celle ci sera incluse.
Pourquoi croyez vous que je ne me sois amusé à faire des formules SOUS.TOTAL si compliquées avec des DECALER si ce n'est pas parce que j'avais pensé à ça ?
 
Dernière édition:

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

Ok donc si j'ai bien compris je m'y prends mal et je dois insérer la ligne non pas en dernier, mais en avant dernier ? Je teste, merci.

Une question : comment je fais pour exporter mon résultat pour qu'il soit exploitable par d'autres personnes ? Sachant que je ne transmettrai que l'onglet budget donc plus aucun lien ne pourra se faire avec la base ?
 

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

La Private Sub TotalJusqÀLrDispM1 installe une formule SUBTOTAL qui se réfère à la prochaine ligne disponible mais en faisant seulement, grâce au DECALER, le calcul jusqu'à celle qui la précède. On peut tout à fait insérer une ligne devant celle qui suit la dernière. Le tout c'est de ne pas utiliser celle qui suit la dernière sous prétexte qu'elle est vide, puisque la formule de total s'y réfèrent, bien qu'elle ne fasse pas le calcul jusqu'à elle.
Les feuilles de Rapport n'ont pas de lien avec la base.
 

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

Bonjour,

lorsque je copie l'onglet dans une autre feuille, j'ai un message d'erreur par rapport à

Option Explicit

Private Sub Worksheet_Activate()
SélectionColonnes Me
UfBudget.Show
End Sub

Private Sub Worksheet_Deactivate()
Unload UfBudget
End Sub

Si c'était aussi possible que la colonne Société et Département et nom de centre de cout soient rempli pour chaque ordre

Merci d'avance
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

Bonjour.
Cherchez les 4 dans tous le projet et remplacez les par des 1.
Mais au coup par coup, hein ! Parce qu'il y en a aussi dans les modules de classe, ceux là il ne faut pas les toucher !
Essayez un tout petit peu de comprendre avant chaque remplacement si ça peut avoir un rapport avec un numéro de colonne de départ !
Et s'il y a une instruction "CrMax = 3:" devant un Redim, enlevez la au passage.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

Ben si, vous n'avez rien compris.
Vous faites Ctrl+H, Rechercher : 4, Remplacer par : 1, Dans "Projet en cours", cochez "Mot entier", bouton Suivant.
À chaque fois que c'est en relation avec le numéro de colonne de départ vous cliquez sur le bouton Remplacer, sinon Suivant.
 

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

Bonjour,

je reviens vous voir car malgré mes efforts, impossible de modifier ce que je souhaite :
_j'ai essayé de jouer avec crmax et chercher les 4 pour les remplacer par 1 mais rien. J'ai seulement réussi a remplir la colonne "nom centres de couts",
_j'ai rajouté des arguùments dans la combobox, je les pense bien implémentées mais j'aurai aimé que vous vérifiiez,
_toujours le problème d'erreru quand je souhaite copier la feuille budget dans un autre classeur (car ce fichier va bouger)
_depuis que j'ai modifié, j'ai un "#ref" qui est apparu dans le total général

Merci à vous
 

Pièces jointes

  • RapportSpinziV5ED.xls
    862 KB · Affichages: 101

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

Bonjour.
Premier module sur lequel je tombe : SélectColonnes, les 4 n'ont pas été changé en 1 de sorte qu'il ne traite toujours qu'à partir de la colonne 4. Il en reste aussi un a changer dans l'UfBudget et dans l'Worksheet_SelectionChange de FBdD. Quoique là c'est tout le dernier Or qui doit être supprimer plutôt puisque Target.Column ne peut pas être < 1. Et dans le même esprit CrMax = 3 devrait être supprimé dans SélectionColonnes, puisqu'il est d'office à 0 alors. Vous voulez bien en somme que les 3 1ères colonnes soient en tout point comme les autres et plus des titres de rubriques.
 

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

bonjour,

effectivement je souhaiterai que les 3 premieres colonnes soient aussi remplies à l'instar des autres colonnes.
Je souhaite aussi pouvoir copier ma feuille dans un autre classeur sans qu'il n'y ai de message d'erreur.
 

Dranreb

XLDnaute Barbatruc
Re : Besoin aide VBA

Bonjour
Avez vous vérifié qu'il effectue bien toutes les opérations, aussi bien la sélection des colonnes à reproduire lors de l'analyse de la ligne 1 de Base en cours que par la suite, à partir de la colonne 1 et plus de la 4 ?

P.S. J'ai commis une erreur en disant que CrMax = 3 devrait être supprimé. C'est une variable Public, alors pour qu'elle ne reste pas initialisée à sa valeur précédente il faut CrMax = 0 à la place. Vous voyez bien comment ça marche: à chaque fois qu'on trouve quelque chose (une croix) on l'incrémente et on ajoute le numéro de colonne (Ce) de la boucle dans la tableau TCe.
Ce tableau TCe est ensuite utilisé dans les 1ères instructions de Private Sub BtnAjouter_Click pour obtenir pour chaque colonne résultante Cr la colonne d'entrée correspontante Ce. c'est la ligne Lr = Lr + 1: For Cr = 1 To CrMax: Ce = TCe(Cr): Rés(Lr, Cr) = Te(Le, Ce): Next Cr, N
 
Dernière édition:

Spinzi

XLDnaute Impliqué
Re : Besoin aide VBA

Bonjour,

je ne comprends pas vraiment : je souhaiterai que dans les 3 premières colonnes, il y ait les occurences. A savoir que les colonnes se remplissent à coup de EE, AD pour société, ainsi de suite.

Le code que vous me donnez à la fin ce celui que je dois coller à la place de l'ancien ?
 

Discussions similaires

Réponses
13
Affichages
261

Statistiques des forums

Discussions
311 735
Messages
2 082 024
Membres
101 873
dernier inscrit
excellllll