Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Transformer un sommeprod en code vba

jean_jack

XLDnaute Junior
Bonjour tout le monde, je viens vous solliciter une nouvelle fois pour un soucis sur excel . Alors je m'expliques j'utilise actuellement une formule excel dans un tableaux pour mettre à jour des données et afficher des données qui sont stockés dans une base de données en fonction de la date entrée : SOMMEPROD((BASEPROD!$C$2:$C$50000=$C5)*(MOIS(BASEPROD!$A$2:$A$50000)=MOIS($V$1))*(ANNEE(BASEPROD!$A$2:$A$50000)=ANNEE($V$1))*(BASEPROD!$D$2:$D$50000)) voici la formule en question que je répète dans un certain nombre de cellules . La formule marche super bien le seule soucis c'est que vu que ma base de données est assez longue et est amenée à s’agrandir la formule qui tourne en boucle dans plusieurs cellules ralentit considérablement mon classeur. Je n'arrive plus à l'utiliser pendant deux min quand je veux faire une action. J'aimerai donc si possible remplacer la formule par un code vba pour rendre cela plus fluide.

Dans le fichier excel c'est la formule qui se trouve dans les colonnes E et F de la feuille 'RAPPORT' . Et l'idée c'est d'afficher les données en fonction de la date dans V1.

Si quelqu'un à une idée de comment faire ça serait génial.

Merci d'avance
 

CHALET53

XLDnaute Barbatruc
Bonjour,
Je ne sais pas si globalement ce sera plus rapide en VBA
Comme la colonne E de la feuille RAPPORT est fonction des colonnes A, C, D de la feuille BASEPROD
Une macro événementielle exploite toute modification dans ces trois colonnes pour aller modifier le montant dans la colonne E de la feuille RAPPORT
Ainsi seules, les lignes qui font l'objet d'une modification vont agir sur la feuille RAPPORT

A tester sur grand nombre et faire la même chose pour la colonne F
a+
 

jean_jack

XLDnaute Junior
J'ai fait une modification dans le fichier
Merci CHALET je suis entrain d'essayer de comprendre ton code pour l'adapter au reste du fichier et sur la colonne F mais j'avoue que je rame un peu (je suis débutant en vba). Je pense qu'une fois adapté il répondra bien à ce que je veux, encore merci c'est du bon boulot.

Par-contre je ne vois plus le fichier excel de réponse que tu as posté ?
 

jean_jack

XLDnaute Junior
Merci CHALET tous marche nickel et le fichier est beaucoup plus rapide, parcontre j'aimerai rien qu'en echangeant la date dans "V1" la mise à jours des données dans E et F se fasse automatiquement pour cela il faudrait que je supprime la ligne : Application.ScreenUpdating = False il me semble ? Maic cela ne marche pas , tu as une autre idée de comment ça pourrait se faire automatiquement sans modification préalable des colonnes A , C et D de la feuille BASEPROD ?

Encore mille merci pour tes réponses
 

CHALET53

XLDnaute Barbatruc
Pas aussi simple
Un programme spécial est nécessaire. Il est présent dans le module 1 (majtotale)
Un changement de date en V1 entraine la mise à jour de toute la feuille RAPPORT
Le bouton Réinitialisation Evénementiel est utile car en cas de plantage, la gestion événementielle pourrait être désactivée. Ce bouton permet de relancer
Le pgm majtotale peut permettre en simulant une date (la même que celle déjà mentionnée) de faire une mise à jour de la feuille

A tester
 

Pièces jointes

  • Jean Jack RAPPORT-AMELIORE Bis.xlsm
    759.3 KB · Affichages: 10

jean_jack

XLDnaute Junior
Un grand Merci CHALET ça marche super bien c'est exactement ce que je voulais, franchement Bravo
 

jean_jack

XLDnaute Junior
 

CHALET53

XLDnaute Barbatruc
Tu remplaces le code associé au Userform SUPPRESSION par celui-ci
Je te laisse (pour l'apprentissage) le soin de compléter le programme pour les autres feuilles : en recopiant après next i toute la boucle pour chaque feuille concernée
Si problème reviens


Private Sub SUPPRESSION_Click()
Application.ScreenUpdating = False
If Not IsDate(Me.JDATE.Value) Then MsgBox ("Format date incorrect"): Me.JDATE.Value = "": Exit Sub
Application.EnableEvents = False
Sheets("BASEPROD").Activate
derligne = Range("A65536").End(xlUp).Row
For i = derligne To 2 Step -1

If Range("A" & i) = CDate(Me.JDATE.Value) Then
Rows(i).Delete
End If

Next i
Application.EnableEvents = True
Unload Me
End Sub

Private Sub userform_initialize()
Me.JDATE.SetFocus
End Sub
 

jean_jack

XLDnaute Junior
Merci CHALET le code marche bien sur toutes les feuilles , le seul bémol c'est que je suis révenu au problème du départ le fichier excel est devenu très lent c'est probablement du au fait qu'il cherche les données dans l'intégralité de la colonne et ceux sur toutes les feuilles , ça ralentit pas mal le fichier tout de mème.
 

Discussions similaires

Réponses
11
Affichages
353
Réponses
7
Affichages
299
Réponses
10
Affichages
404
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…