[VBA]vraiment débutant [Résolu]

Signaler
Messages postés
10
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
24 novembre 2011
-
 Utilisateur anonyme -
Bonjour

Je ne vais pas y aller par 4 chemins : j'ai 49 ans (faudra y aller doucement). Je pense parfaitement maitriser toutes les focntions standards d'Excel 2007, depuis les claissiques conditions, en passant par les tableaux dynamiques croisés, jusqu'au plus complexes calculs matriciels. J'utilise courament les macro, mais en mode "enregistrement" uniquement (je comprend néanmoins un peu le code généré). J'ai quelques vagues souvenir du vieux "basic" et donc je comprend le fonctionnement des boucles, entre autre. Voilà pour la présentation (j'ai oublié : je m'appelle Philippe !)

Je réalise un big classeur avec plusieurs feuilles à l'intérieur, imbriquées, pour les besoins de gestion analytique de ma petite PME. Il ya tellement de calculs que cela devient très très lent.
Pas d'autres solutions que de passer par du VBA, que je ne connais pas (sauf via les macro, bien sûr).

J'espère trouver une âme charitable qui pourra m'accompagner, armer de patiente, dans ma quête d'apprentissage ...

Voici donc un calcul matricelle écrit dans la cellule ED6 de la sheet "Commandes" de mon classeur :

{SOMME(SI(Fournisseurs!$AA$6:$AA$3000Commandes!$A6;SI(Fournisseurs!$AC$6:AC$3000=ED$4;Fournisseurs!$AB$6:$AB$3000;0);0))}

Pour les besoin de ma feuille de calcul, je dois reporter ce calcul sur 6 colones (la variable ED$4 pouvant prendre 6 valeurs différentes, et ce, sur toute la longueur du tableau, soit 3000 lignes ... d'où la lenteur.

Sur la ligne 6 :
- Fournisseurs!$AA$6:$AA$3000 est un nom du client que je compare au nom du client de la ligne 6 colonne A (Commandes!$A6)
- Fournisseurs!$AC$6:AC$3000 est l'affection analytique que je compare donc à ED$4
- Fournisseurs!$AB$6:$AB$3000 est le montant que j'affecte au client si l'analytique est le même

Je cherche à remplacer ce lourd calcul par un code VBA sur la cellule ED6 que je devrais affecter ensuite sur la zone ED6 à EI3006

Merci par avance pour votre aide, et votre "accompagnement" pendant quelques jours.

Amicales salutations.

Phil

la vérité est (souvent) ailleurs ...

15 réponses


Private Sub Worksheet_Change(ByVal Target As Range)
If Range("J4") = 10 Then Tricont
End Sub


Je ne vois pas où est la difficulté...



CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

Passer par VBA n'accéléra pas forcément le calcul.
Après, je n'utilise pas Excel intensément.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site

Bonjour,

Je suis aussi de l'avis de Henry.
Mis à part quelques calculs très simples du genre '=E25*G25' ou encore des pourcentages c'est tout ce que j'utilise sur excel.

Après ton "Big" fichier va se retrouver à 200Mo il sera lent à l'ouverture et utilisation, plantages etc.

Nous on a l'habitude de créer des petites applications qui ouvrent le(s) fichier(s), qui lisent (ou écrivent) les données dans les cellules de notre choix et tous les calculs se font dans le petit 'soft', pas dans le classeur excel. En gros excel sert de base de données.

Sans parler que si tu utilises ce Big classeur pour la totalité de la gestion de ta PME, et que un jour ta clé usb tombe dans l'eau et que ton disque dur se fait écraser par un bus, t'es pas sorti d'affaire.




CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Bonjour,
Je cherche à remplacer ce lourd calcul par un code VBA sur la cellule ED6 que je devrais affecter ensuite sur la zone ED6 à EI3006

={SOMME(SI(Fournisseurs!$AA$6:$AA$3000=Commandes!$A6;SI(Fournisseurs!$AC$6:AC$3000=ED$4;Fournisseurs!$AB$6:$AB$3000;0);0))} 

n'est pas un "lourd calcul" ! et 3000 lignes ne sont qu'une goutte d'eau, y compris sur tes 6 colonnes !
Si tu as des lenteurs observées, il y a fort à parier que :
- soit tu as (le plus vraisemblable) des références circulaires
- soit tu as plein d'autres petites choses sur tes feuilles, dont tu ne nous parles pas.

Dans le 1er cas : cherche-les en analysant ton fichier
Dans le second cas (plein de petites "bébelles" pour "enjoliver"), l'affichage lui-même te bouffe beaucoup de temps (car se met à jour à chaque formule exécutée). Il serait alors bon d'inhiber cette mise à jour pendant tout le calcul, puis de la restituer in fine?. Et oui : VBA peut alors t'y aider (regarde dans ton aide en ligne le mot ScreenUpdating )


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
10
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
24 novembre 2011

Bonjour à tous et merci pour vos réponses.

En effet acive, je n'ai pas tout dit : ce genre de calculs (ma formule répétée sur 3000 lignes et 6 colonnes) se répêtent à plusieurs reprises dans mon classeur, sur plusieurs feuilles. d'où "ma" lenteur. le fichier xlsx fait .. 3Mo.
J'ai pris ce cas au hasard histoire de comprendre le code pour pouvoir le dupliquer ailleurs.

Je ne gère pas toute la boutique par ce classseur .. juste l'analytique, mais je multiplie les sauvegardes sur des suports différents : pas de crainte de ce coté.

J'en suis un peu revenu des multiples classeurs et des appels à références externes qui se synthétisent sur un seul tableau de bord : lent et sujet à plantages fréquents, d'où ma préférence pour un seul classeur, soit, qu'il faut ouvrir mais une fois ouvert ...

Alors en effet, j'ai quelques graphiques sur l'une de mes feuilles : est-il possible de faire en sortes que ces graphqiques (et uniquement ceux-ci) se mettent à jour par une commande, su un bouton par exemple (le reste des tableaux se calculant en mode auto).
et malgré tout, j'essaierais bien mon calcul en VBA histoire de voir si ça améliore ou pas.

Merci encore pour votre aide.

la vérité est (souvent) ailleurs ...

Salut Fouding

En ce qui concerne les sauvegardes, à titre indicatif, regarde les 2 messages que j'ai laissé dans ce post:
http://www.vbfrance.com/forum/sujet-HOST-CHECK-FOR-UPDATE_1555558.aspx

Ca pourrait t'intéresser...



CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
10
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
24 novembre 2011

Bonjour

Juste pour vous signaler que j'ai avantageusement réglé mon pb par cette astuce :

Je définie de manière dynamique le nbre de libre de mon tableau par la fonction NBVAL
j'inclus la fonction Indirect dans ma somme.
Ainsi, le calcul ne se fait plus tout le temps sur mes 3000 lignes (dimensionnement du tableau) mais uniquement sur ls lignes utilisées.

J'ai divisé par 10 le tps de calcul de mon classeur.

Merci pour vos réponses en tout cas.
Messages postés
10
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
24 novembre 2011

.... mais j'ai une autre question, car je me mets quand mêm au VB

Ce code, qui devrait me lancer la macro "Tricont" lorsque J4 est à 10 me renvoie "End sub attendu"

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("J4") = 10 Then
        Sub Tricont()
        End Sub
    End If
End Sub


Merci pour votre aide

Salut,

Tu as crée une sub dans une autre sub, c'est pas cohérent...

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("J4") = 10 Then Call Tricont
    '(je crois en VBA)
End Sub



CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
10
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
24 novembre 2011

Hello la guadeloupe. Merci

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("J4") = 10 Then Call Tricont
    End If
End Sub


me renvoie à présent : End if sans bloc if ..

Si tu as une idée ...

Re:
Regarde le code que j'ai mis, j'ai pas mis end if, d'où il sort?
Enlève-le...

Mais je ne suis pas sur sur le "call tricont", je ne suis pas trop VBAtiste




CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("J4") = 10 Then Call Tricont
End If

End Sub

C'est tout de même incroyable, un tel niveau (ce sont les rudiments eux-mêmes qui font ici défaut)
Et même copier/coller t'est impossible ?
Ce n'est pas sérieux !



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Oui ...
et c'est Then Tricont (sans le call)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient

Merci Uc je note pour la prochaine fois




CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
10
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
24 novembre 2011

Je n'ai pas tout suivi mais merci.