XL pour MAC Refonte complete d'un fichier, besoin d'idées

nobodyuse

XLDnaute Occasionnel
Bonjour à toutes et tous

Après quelques temps de travail sur un fichier de suivi de commande d'articles pour des agents d'une entreprise reparties sur 3 sites différents
je me retrouve avec un fichier final fonctionnel, mais très lourd (26Mo pour les 5 années) ce qui rend mon fichier très lent

Tout d'abord je précise que je suis archi novice !
Je viens donc vers vous les pro du Excel afin de quérir quelques idées pour refaire mon entièrement mon fichier de manière a ce qu'il soit moins lourd et utilisable sur serveur d'entreprise par 3 personnes minimum (1 sur chaque site)

je vous expose donc le projet:

j'ai une base de donnée qui doit contenir les différents articles possible, pour lesquels il y a un prix unitaire, différentes tailles possible,
dans cette base de données il y a également une base de Nom/prénom, chef référent, leur site, et la somme qui leur ai attribué au 1er janvier 2020 (repris des années précédentes) il y a pour l’heure quelques 300 agents environs... Mais comme cela peut évoluer (départ en retraite, embauche, ...) il faut donc que ce fichier soit évolutif facilement
il me faut donc un système qui aille cherche les noms, en fonction du nom son chef, que 'l’on sépare les 3 sites si cela est possible...
il y a 3 commande par année civile (Janvier, Mai et Septembre)
il faut que l'on puisse rentrer leur éléments de commande avec des liste deroulantes (Articles, taille, quantité, Prix Unitaire) que ce soit calculé automatiquement et déduit de leur somme initiale
Évidemment chaque fois la somme est reporté sur la feuille de suivi de commande suivants (3 par année) une feuille de Bilan est ajouté pour la fin d'année et permet de voir le nombre d'articles commandé par agents et les totaux par sites (et total global) une feuille de suivi peux éventuellement être inséré ce qui permettrai d'avoir un archivage de ce qui a été commandé .... (si l'on pouvais même réussir a trier par articles et taille de manière a avoir une forme "d’état de la commande" ce serai top pour voir et suivre d'un coup d'oeil les quantités qu'il y a à commander et en quels tailles)
j'avais ajouté une fonction de Statut de remise a l'agent avec la date automatique (qui permet de suivre un peu savoir ou l'on en est)
Afin de réduire la taille du fichier sur chaque page de bilan j'ai inséré une macro qui permet de transformer le résultat des formules en données brutes et supprimer les feuilles de Janvier, Mai et Sept de l'année qui viens de s’écouler, afin de ne pouvoir garder que la feuille de bilan et reprendre la somme en fin d'année sur la nouvelles feuille de Janvier (Auquel on crédite chaque année la somme de 40€ cumulable d'une année sur l'autre sans jamais dépasser un montant de 120€)


je ne peux pas vous mettre le fichier que j'ai créer (Car trop gros même zippé)
je vous met cela dit des captures d'écrans une de la feuille de Janvier, une de la feuille bilan et une du type de feuille de suivi possible (qui pourrai remplacer la feuille de bilan (à voir)
je sais ce n'est pas top mais c'est vraiment pour donner une idée de ce que j'avais fait jusque la, mais comme cela ne vas pas forcement ....

Merci d'avoir pris le temps de lire jusqu'au bout en espérant avoir réussi a être assez clair
D'avance merci à tous

Feuille actuel de Janvier:
Capture d’écran 2021-03-26 à 17.55.11.png



Feuille actuel de bilan:
Capture d’écran 2021-03-26 à 17.55.36.png




Idée de feuille de suivi a voir:
Capture d’écran 2021-03-26 à 18.00.18.png


Autre tentative de mise en forme:
Capture d’écran 2021-03-26 à 18.15.07.png


D'avance Merci à tous
 
Dernière édition:
Solution
Re

Pour rester Kissien ;)
J'ai simplifié la précédente macro
VB:
Sub Archivage()
Application.ScreenUpdating = False
Dim arrINap As Range, arrIN, arrOUT(), i&, n&, k&, j%
arrINa = Array([D3], [D5], [D7], [D9], [D11], [D13])
Set p = Range("F3:I13"): arrIN = p: k = UBound(arrIN, 1)
For i = 1 To k
For j = 1 To 4
If Trim(arrIN(i, j)) <> vbNullString Then
If Trim(arrIN(i, j)) > 0 Then
n = n + 1
ReDim Preserve arrOUT(1 To 2, 1 To n)
arrOUT(1, n) = arrIN(i, j)
End If
End If
Next j
Next i
Feuil2.Cells(Rows.Count, 1).End(3)(2).Resize(, UBound(arrINa, 1) + 1) = arrINa
Feuil2.Cells(Rows.Count, 7).End(3)(2).Resize(, n) = arrOUT
End Sub

nobodyuse

XLDnaute Occasionnel
Re

Je n'ai pas eu le temps de voir ta dernière PJ
(mais puisque Mac obligatoire)
Voici sur quoi je partirai pour saisir les données
Regarde la pièce jointe 1100324
Et ci-dessous le code VBA attaché au bouton
VB:
Sub SimiliForm()
Dim donnees$, r As Range
donnees = "B2,B4,B6,B8,B10"
Application.ScreenUpdating = False
Set r = Range(donnees)
If Application.CountA(r) <> r.Cells.Count Then
MsgBox "Saisie incomplète", vbCritical, "ERREUR"
Exit Sub
Else
r.Copy
Feuil2.Cells(Rows.Count, 1).End(3)(2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=True
Application.CutCopyMode = False
r.ClearContents
r(1).Select
End If
End Sub

Je pense que c’est un peu plus ou moins ce que je propose dans le post#102 que tu n’a pas regardé du coup

mais la mise en œuvre par la suite ... comme je l’ai expliqué dans le 102 aussi je sais pas :/
 

Staple1600

XLDnaute Barbatruc
Re


Bah il suffit de t'inspirer et d'adapter le code du bouton qu'on peut voir dans le message#103

Question au passage
Pourquoi tu n'utilises ce fichier depuis le début?
(Ou plus exactement depuis le 26/01/2021, juste avant ta pause café, lorsque l'horloge affichait 10h56)
;)
 

nobodyuse

XLDnaute Occasionnel
Re


Bah il suffit de t'inspirer et d'adapter le code du bouton qu'on peut voir dans le message#103

Question au passage
Pourquoi tu n'utilises ce fichier depuis le début?
(Ou plus exactement depuis le 26/01/2021, juste avant ta pause café, lorsque l'horloge affichait 10h56)
;)
re le fil!

Je l’ai expliqué ce fichier n’étire initialement prévu que pour moi et mon site
On m’a ensuite demandé de le fournir aux 2 autres sites
Mais je ne sais pas comment gérer les commandes quadrimensuel à partir de celui ci
Il me m’a que sans doute trop de notion
La partie report de la macro je ne la pige pas et n’arrive pas à gérer d’autres infos ou des infos différentes
Je n’arrive pas à dupliquer la page de suivi pour gérer les différentes périodes de commandes et encore moins les années
Ni lier et réutiliser le suivi des points sur la période d’après

j’ai bien tenté de dupliquer feuille suivi et BC en changeant quelques trucs dans le code mais ça ne ce passe pas comme je voudrai

et comme il y avais un peu urgence pojr la autre fichier étant donné que la période de commande été arrivée...

bref je n’ai pas votre niveau bien loin de la !

Merci à tous
 

Staple1600

XLDnaute Barbatruc
Re

C'est cette macro que tu ne comprends pas?
VB:
Sub Archive(remplacer As Integer)
With Range("Suivi")
    If remplacer = 0 Then
        nvl = .Rows.Count - Application.CountBlank(.Columns(1)) + 1
    Else
        nvl = Evaluate("MATCH(1, (Suivi[NomPrenom]=BC!D4;E4)*(INT(Suivi[DateDemande])=INT(BC!D6)), 0)")
    End If
    ReDim t(1 To .Columns.Count)
    For Each cell In Range("Report").Cells
        k = k + 1
        t(k) = cell.Value
    Next cell
        .Cells(nvl, 1).Resize(1, .Columns.Count) = t
End With
End Sub
Si c'est le cas, quelles lignes?
 

nobodyuse

XLDnaute Occasionnel
Re

C'est cette macro que tu ne comprends pas?
VB:
Sub Archive(remplacer As Integer)
With Range("Suivi")
    If remplacer = 0 Then
        nvl = .Rows.Count - Application.CountBlank(.Columns(1)) + 1
    Else
        nvl = Evaluate("MATCH(1, (Suivi[NomPrenom]=BC!D4;E4)*(INT(Suivi[DateDemande])=INT(BC!D6)), 0)")
    End If
    ReDim t(1 To .Columns.Count)
    For Each cell In Range("Report").Cells
        k = k + 1
        t(k) = cell.Value
    Next cell
        .Cells(nvl, 1).Resize(1, .Columns.Count) = t
End With
End Sub
Si c'est le cas, quelles lignes?

un peu l’ensemble 😬
J’avais tenté de dupliquer et renommer les feuilles Suivi et BC pour tenter d’avoir une pour chaque période mais ça enregistre tjr dans la première feuille suivi (probablement à cause de la plage report du fichier)
Du coup je gère pas trop
Et je n’en suis pas à réutiliser les donner de suivi des points, de générer un TCD pour résumer l’ensemble de la commande, ou d’ajouter un système de statut de remise de la dotation (qui doit ce faire article par article étant donné que les livraisons arrivent de manière échelonné et la remise des articles aux agents ce fait au fur et à mesure et éviter ainsi d’oublier qui n’a pas eut un article ou inversement qu’un agent dise qu’il n’a pas eut son article)
Le tableau de suivi ne me plaît pas trop mais ça semble rigide
Alors que je l’aurai aimé de manière verticale et non horizontale ....
J’en suis bien loin et la prochaine période arrive 😱
 

nobodyuse

XLDnaute Occasionnel
Re

L'est où le petit gars ou la p'tite dame qui a pondu ce code?
Plus dans l'entreprise?
Re
Ici ou que une autre communauté !
Je lui avais demandé un coup de main mais sans suite c’est pas grave il m’avait bcp aidé déjà à l’époque de la création de mon fichier BC qui sans lui ne serai pas aussi bien réussi
J’avais fait la trame avec des fonctions basique il a réussi à partir de mon fichier à faire pas mal de chose
Pour mes besoin personnel ensuite j’avais fini de modifier !
 

nobodyuse

XLDnaute Occasionnel
Re

Ah, tu fais dans le multipostage (non signalé)...:rolleyes:
(je te laisse cherché pourquoi j'ai mis ce mot en gras ;)

Et ca ne réponds pas à ma précédente question:
Quelles lignes de code tu ne comprends pas dans la macro Archiver ?

je ne fréquente pas qu’une seule communauté
Mais je me suis fait rappeler à l’ordre ailleurs à cause d’une question posé à 2 endroits... bien que je ne vois pas bien le problème.
Cela m’a servi de leçon je n’ai pas réitéré

si je t’ai répondu c’est un peu tout. N’ayant pas de connaissance en codage de ce type ..
je ne fonctionne ptet pas comme tous le monde mais ma logique a besoin de la compréhension de l’ensemble.
Bien que je pense avoir compris le principe
Ce n’est pas tout à fait la macro qui me pose problème mais plutôt l’ensemble que je n’arrive pas à reproduire ni à modifier
 

nobodyuse

XLDnaute Occasionnel
Bonjour le fil revoilà le relou 😁

je reprend la ou j'en suis a savoir:
pour suivre les conseils précédemment donnés a défaut de Userforms j’essaie de travailler à partir de mon fichier BC.
j'ai a priori réussi la duplication des feuilles, la feuille BC renommée en BCJanv2021 inscrit bien les données dans la feuille de suivi renommée en SuiviJanv2021(idem pour les feuilles de Mai)
j'ai transformé pour le coup la possibilité de générer le PDF en une option via une MsgBox Yes/No (a priori cela fonctionne aussi) 🥳

sans aller plus loin (dans les ajout de fonction, je me heurte à un premier soucis, si je prend plusieurs commande au même non celle ci s'ajoute dans la feuille suivi, mais comme les point de départ sur pris sur la base de donnée ce n'est pas bon
dans l'idéal déjà ce serai bien que pour un même agents les données sais s'ajoute a la suite mais le système en place est trop rigide (et trop complexe pour moi pour le modifier sans le foirer entièrement, j'ai déjà fait quelques essai infructueux, heureusement je me garde une copie de sauvegarde a chaque fois que j'avance un truc)
j'ai aussi tenté une formulation du type (ne me jetez pas de cailloux s,'il vous plait 🥴 soyez indulgent)
VB:
=SI(RECHERCHEV(D4;SuiviJanv2021!A:DF;110;0);SIERREUR(RECHERCHEV(D4;AGENT;4;0);"");RECHERCHEV(D4;SuiviJanv2021!A:DF;110;0))
évidement (sans surprise pour vous, ça ne marche pas ! Mais de toute façon comme il est possible que la fiche Suivi possède plusieurs lignes au même nom même si la formule marchai ça n'irai pas

Donc:
1/pensez vous qu'il soit possible de réagencer la fiche suivi déjà d'un point de vue esthétique de manière a mettre les éléments un peu moins dans le sens horizontal et plus dans le sens vertical ?
2/ y a t'il une possibilité que l'enregistrement pour une même personne s'ajoute a la suite sur la même ligne dans la feuille suivi et fasse le calcul --- > si oui comment ? HELP!

Edit: j'ai essayer de mettre en place un TCD a partir de la feuille suivi qui ne donne pas (C'est quand même pas évident ça)
 
Dernière édition:

nobodyuse

XLDnaute Occasionnel
Re

C'est cette macro que tu ne comprends pas?
VB:
Sub Archive(remplacer As Integer)
With Range("Suivi")
    If remplacer = 0 Then
        nvl = .Rows.Count - Application.CountBlank(.Columns(1)) + 1
    Else
        nvl = Evaluate("MATCH(1, (Suivi[NomPrenom]=BC!D4;E4)*(INT(Suivi[DateDemande])=INT(BC!D6)), 0)")
    End If
    ReDim t(1 To .Columns.Count)
    For Each cell In Range("Report").Cells
        k = k + 1
        t(k) = cell.Value
    Next cell
        .Cells(nvl, 1).Resize(1, .Columns.Count) = t
End With
End Sub
Si c'est le cas, quelles lignes?


si je change la table "report" en indiquant ceci:
Code:
=BCJanv2021!$D$4;BCJanv2021!$H$4;BCJanv2021!$D$6;BCJanv2021!$D$9:$D$23;BCJanv2021!F9:H23;BCJanv2021!$H$24;BCJanv2021!$H$26

même si j'ai le même nombre de cellules dans la page suivi

ça m’indique une erreur dans cette partie la que je ne comprend pas

VB:
    For Each cell In Range("ReportJanv21").Cells
        k = k + 1
        t(k) = cell.Value
    Next cell
 

ChTi160

XLDnaute Barbatruc
Bonjour nobodyuse
Bonjour le Fil ,le Forum
si je peux me permettre !
VB:
For Each cell In Range("ReportJanv21").Cells
        k = k + 1
        t(k) = cell.Value
    Next cell
cela veut dire /
Pour chaque Cellules --- > For Each Cell
In Range("ReportJanvier21") --> de la plage Nommée "ReportJan21"
on incrémente le redimensionnement du Tableau t() --> k=k+1
puis on redimensionne le Tableau --> t(k)
et on y colle la valeur de la variable Cell considérée
t(k)=Cell.value
il te faut aussi pour incrémenter le tableau t() le redimensionner avant d'y mettre la valeur de Cell
en Mettant
VB:
Redim Preserve t(k)
je n'ai pas tout suivi
mais pourquoi ne récupères tu pas la plage "ReportJanvier21" directement dans un Tableau
VB:
Dim T as variant
puis
T=Range("ReportJan21").value
en espérant avoir pu aider
jean marie
 
Dernière édition:

nobodyuse

XLDnaute Occasionnel
Bonjour nobodyuse
Bonjour le Fil ,le Forum
si je peux me permettre !
VB:
For Each cell In Range("ReportJanv21").Cells
        k = k + 1
        t(k) = cell.Value
    Next cell
cela veut dire /
Pour chaque Cellules --- > For Each Cell
In Range("ReportJanvier21") --> de la plage Nommée "ReportJan21"
on incrémente le redimensionnement du Tableau t() --> k=k+1
puis on redimensionne le Tableau --> t(k)
et on y colle la valeur de la variable Cell considérée
t(k)=Cell.value
il te faut aussi pour incrémenter le tableau t() le redimensionner avant d'y mettre la valeur de Cell
en Mettant
VB:
Redim Preserve t(k)
je n'ai pas tout suivi
mais pourquoi ne récupères tu pas la plage "ReportJanvier21" directement dans un Tableau
VB:
Dim T as variant
puis
T=Range("ReportJan21").value
en espérant avoir pu aider
jean marie
Bonjour Jean Marie,

Ca reste un peu du chinois pour moi, comme quoi la programmation est un langage ^^

j'ai inclus la "variable que tu m'a donné mais sans doute pas de la bonne facon car j'ai toujours une erreur


VB:
Sub Archive(remplacer As Integer)

With Range("SuiviJanv21")
    If remplacer = 0 Then
        nvl = .Rows.Count - Application.CountBlank(.Columns(1)) + 1
    Else
        nvl = Evaluate("MATCH(1, (Suivi[NomPrenom]=BCJanv2021!D4;E4)*(INT(Suivi[DateDemande])=INT(BCJanv2021!D6)), 0)")
    End If
    ReDim t(1 To .Columns.Count)
    For Each cell In Range("ReportJanv21").Cells
        k = k + 1
        t(k) = cell.Value
ReDim Preserve t(k)
    Next cell
        .Cells(nvl, 1).Resize(1, .Columns.Count) = t
End With

End Sub

les données récoltées de la plage report sont justement envoyé vers un tableau mais je ne peux rien changer dedans c'est hyper rigide

pour celles et ceux qui on suivi le fil
comme je me retrouve encore bloqué 🤬 😭

je regarde d'un autre coté en repartant de zero et en faisant un formulaire (sans userforms) avec des liste en cascade et recherche dans tableau un truc basque donc :/
a voir ensuite comment je pourrai réutiliser les données récoltées

j'en peux plus j'ai le cerveau qui vas exploser et les larmes qui montent
 

ChTi160

XLDnaute Barbatruc
Re
tu as mis :
VB:
 ReDim t(1 To .Columns.Count)
    For Each cell In Range("ReportJanv21").Cells
        k = k + 1
        t(k) = cell.Value
ReDim Preserve t(k)
    Next cell
tu as deux Redim
VB:
 ReDim t(1 To .Columns.Count)
tu auras donc un Tableau T qui comptera autant de Colonnes que de Colonne dans ta plage
"SuiviJanv21"
Donc plus besoin de redimensionner avec ReDim Preserve t(k) surtout que tu redimensionnes après avoir collé la Valeur de Cell
On ReDim Preserve avant de Coller la valeur!
c'est l'un ou l'autre
Tu pourrais mettre Redim Preserve t(1 to 10000) tu auras alors 10000 place de stockage. plus besoin de Redim
et ensuite faire
k=k+1
t(k)=cell.value
Tu auras en fonction de tes données des lignes du tableau qui seront vides!
que si tu Redim au fur et à mesure soit
CODE=vb]For Each cell In Range("ReportJanv21").Cells
k = k + 1
ReDim Preserve t(k) 'on Redim le tableau
t(k) = cell.Value 'on entre la valeur sur cette Nouvelle position ajoutée
Next cell[/CODE]
je vais essayer de regarder à quoi correspond
VB:
Range("ReportJanv21").Cells
jean marie
 

Discussions similaires

Haut Bas