Microsoft 365 Macro VBA - Excel

gpera

XLDnaute Nouveau
Bonjour,

J'ai besoin d'une macro qui me simplifierait la vie qui:
1/ trie par montant du plus grand au plus petit la colonne U (Montant Réception)
2/ crée un onglet différent pour chaque site (colonne C : Code Site) avec les données propres à chaque site
3/ que les onglets créés s'insèrent après l'onglet "Détail Site ->" par ordre croissant de numéro de site.

Puis dans un second temps, ou via une seconde macro:
4/ Envoi du fichier ainsi terminé à une liste de diffusion par mail avec un message prédéfini à l'avance

J'ai essayé pour la première partie en enregistrant une macro en même temps que je le faisais mais rien de concluant.

L'idée étant que je puisse copier coller l'extraction de l'ERP puis lancer la macro plutôt que de filtrer site par site.

D'avance merci pour votre aide!
 

Pièces jointes

  • FNP_test macro.xlsx
    210.1 KB · Affichages: 7

Cousinhub

XLDnaute Barbatruc
RE-,
Tu comprendras aisément que je n'ai nulle envie de décortiquer un code indigeste...
J'ai juste sélectionné l'onglet suivant
Et Ctrl + Alt + Suppr
Bref, nostalgie d'un code très simple comme le faisait JBoisgontier avec les filtres avancés.
Bonne soirée
 

Dranreb

XLDnaute Barbatruc
La procédure n'a que 20 lignes de code et n'est vraiment pas compliquée !
Mais si tu n'a pas envie de savoir pourquoi ça ne marche pas seulement chez toi, libre à toi.
Y aurait-il une référence portée MANQUANT ?
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir à tous,

Chez moi sur Win 11 Excel 2019 la macro de Dranreb oblige à sortir par le Gestionnaire des tâches.

Voici une solution très classique avec le Dictionary :
VB:
Sub Supprime_Feuilles()
Dim w As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each w In Worksheets
    If IsNumeric(w.Name) Then w.Delete
Next
End Sub

Sub Cree_Feuilles()
Dim d As Object, P As Range, a, i&, x$
'---supression des feuilles---
Supprime_Feuilles
'---liste des feuilles---
Set d = CreateObject("Scripting.Dictionary")
With Sheets("extraction")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    Set P = .Range("A4:U" & .Range("C" & .Rows.Count).End(xlUp).Row)
    If P.Row < 4 Or P.Rows.Count < 2 Then Exit Sub
End With
P.Sort P(1, 21), xlDescending, Header:=xlYes 'tri sur la colonne U
a = P.Columns(3)
For i = 2 To UBound(a)
    x = a(i, 1)
    If x <> "" Then d(x) = ""
Next
a = d.keys
tri a, 0, UBound(a)
'---création des feuilles---
For i = 0 To UBound(a)
    Sheets.Add After:=Sheets(Sheets.Count)
    With ActiveSheet
        .Name = a(i)
        P.AutoFilter 3, a(i)
        P.Copy .Cells(1)
        .Columns.AutoFit
    End With
Next
P.AutoFilter 3
Sheets(a(0)).Select
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Je ne m'occupe pas de l'envoi des emails, c'est toujours une galère.

A+
 

Pièces jointes

  • FNP_test macro.xlsm
    130.8 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Deux cas, ça commence à faire beaucoup. Mais comment pourrais-je savoir ce qui ne va pas ?
Déjà est-ce que c'est la fonction Gigogne qui plante ? J'ai mis deux MsgBox : Avant et après.
Pour l'envoi d'E-Mail, je n'ai pas OutLook installé, alors je ne peut pas régler ça.

Édition : si ça a l'air de planter dans la fonction Gigogne, il pourrait être intéressant de changer comme suit la toute première ligne du module MGigogne qui est une directive de compilation conditionnelle :
VB:
      #Const AvecMoveMemory = 0
 

Pièces jointes

  • GigogneGpera.xlsm
    281.3 KB · Affichages: 1
Dernière édition:

gpera

XLDnaute Nouveau
Bonjour à tous,
Au final les 2 macros fonctionnent et répondent au besoin.
Le seul petit bémol avec la fonction Gigogne est que la macro semble se relancer à chaque fois que je sélectionne un onglet (après je n'ai pas essayé la modification du code avec #Const AvecMoveMemory = 0).
Pour la partie envoi, je vais demander à un collègue qui avait l'avait fait sur un autre fichier excel.
Merci beaucoup pour votre aide!
Bonne journée à vous,
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Non, seulement depuis la feuille susceptible d'avoir changé.
Mais on peut perfectionner les condition sous lesquelles c'est exécuté si vous voulez.
VB:
Option Explicit
Private ÉtatInitial As Boolean
Private Sub Worksheet_Activate()
   ÉtatInitial = True
   End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
   ÉtatInitial = False
   End Sub
Private Sub Worksheet_Deactivate()
   Dim SGrSite As SsGr, L As Long, TRésu(), Détail, C As Integer, NomFeuil As String, Wsh As Worksheet
   If ÉtatInitial Then Exit Sub
Si tout marche chez vous ce n'est pas utile de dégrader très légèrement la performance du tri en définissant à 0 la constante de compilation conditionnelle AvecMoveMemory
 

Cousinhub

XLDnaute Barbatruc
La procédure n'a que 20 lignes de code et n'est vraiment pas compliquée !
Mais si tu n'a pas envie de savoir pourquoi ça ne marche pas seulement chez toi, libre à toi.
Y aurait-il une référence portée MANQUANT ?
Bonsoir,
Désolé, mais l'envie n'est pas trop là...
Juste cette petite capture d'écran :

1708542339420.png

Mais qui n'est pas du tout dans les 20 malheureuses pauvres lignes de code du Deactivate...(plutôt dans la (les) centaine(s) de lignes situées ailleurs)
Si ça peut t'avancer.
(il n'y a pas de "MANQUANT", je connais très bien ce symptôme, et qui n'oblige jamais à un recours au gestionnaire des tâches)
Bonne soirée
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Cette ligne n'est pas forcément compilée, mais c'est curieux qu'elle soit signalée en erreur de syntaxe. C'est plutôt celle avec PtrSafe qui est signalée sur d'anciennes versions bien qu'elle n'y gène pas non plus la compilation.
Normalement on ne devrait pas avoir à plonger dans ce code. C'est de la programmation de service, au même titre que les méthodes de la bibliothèque Excel ou autres.
Si c'est le MoveMemory qui plante, essayez en mettant à 0 la constante de compilation conditionnelle AvecMoveMemory, voir message #8.
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 237
Membres
103 162
dernier inscrit
fcfg