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
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


je sais pas ce que je t'ai copié comme code mais j'ai fait du caca je suis a la ramasse a force

voila le code présent qui fonctionne mais dés que je touche à la plage report en ayant les cellules correspondantes dans la fichier Suivi ca me met 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
   Next cell
        .Cells(nvl, 1).Resize(1, .Columns.Count) = t
End With

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
Bonjour Staple, Phil, la communauté

en parallèle n'arrivant a rien sur rien d'ailleurs

j'ai fait ceci une sorte de formulaire a l'aide de liste déroulante (classique et en cascade) :
Capture d’écran 2021-03-29 à 16.36.51.png



j'ai voulu utiliser ton bouton Staple en adaptant la partie "donnees" au case dont j'ai besoin de récupérer la valeur
mais j'ai une erreur VB400
ce doit être une erreur du au Mac car même en n'incluant qu'une case j'ai cette erreur
 

Staple1600

XLDnaute Barbatruc
rE

Concernant le code de mon bouton, je le remets ici avec commentaires
VB:
Sub SimiliForm()
Dim donnees$, r As Range
donnees = "B2,B4,B6,B8,B10" ' adapter les adresses des cellules
Application.ScreenUpdating = False
Set r = Range(donnees) ' définition de la plage de cellules r
If Application.CountA(r) <> r.Cells.Count Then
MsgBox "Saisie incomplète", vbCritical, "ERREUR"
Exit Sub
Else
r.Copy ' on copie la plage
Feuil2.Cells(Rows.Count, 1).End(3)(2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=True
' et on colle en transposant dans la première cellule vide de la colonne A
Application.CutCopyMode = False
r.ClearContents
r(1).Select
End If
End Sub
Dans cet exemple, la recopie se fait sur une feuille dont le codename est Feuil2
(Donc il faut adapter le cas échéant)
 

nobodyuse

XLDnaute Occasionnel
rE

Concernant le code de mon bouton, je le remets ici avec commentaires
VB:
Sub SimiliForm()
Dim donnees$, r As Range
donnees = "B2,B4,B6,B8,B10" ' adapter les adresses des cellules
Application.ScreenUpdating = False
Set r = Range(donnees) ' définition de la plage de cellules r
If Application.CountA(r) <> r.Cells.Count Then
MsgBox "Saisie incomplète", vbCritical, "ERREUR"
Exit Sub
Else
r.Copy ' on copie la plage
Feuil2.Cells(Rows.Count, 1).End(3)(2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=True
' et on colle en transposant dans la première cellule vide de la colonne A
Application.CutCopyMode = False
r.ClearContents
r(1).Select
End If
End Sub
Dans cet exemple, la recopie se fait sur une feuille dont le codename est Feuil2
(Donc il faut adapter le cas échéant)
Re Staple

c'est bien ce que j'avais fait pourtant
même avec juste une cellule j'ai ce résultat
Capture d’écran 2021-03-29 à 17.46.10.png
:
 

Staple1600

XLDnaute Barbatruc
Re, Bonsoir Phil

Tout pareil que Phil
Vire-moi toutes ces cochoncetés
Pas de format, pas de couleur, pas de cellules fusionnées etc..
Nous sommes en phase de test
Donc on part d'un fichier vierge ( ce qui d'emblée règle la question RGPD et anonymat )
et on conçoit le bousin, brique par brique.
Ici il s'agit de rendre ergonomique la saisie des données puis de les archiver ensuite sur un autre feuille.
Ce n'est que quand tout sera fonctionnel que tu pourras faire du gribouillage et de l'esthétique.
Et c'est à cet étape, que tu verras ton classeur prendre de l'embonpoint.
;)

Evidemment tu peux jeter aux orties tout ce que je viens d'écrire ;)
Ce qui me permettra de me convaincre que je n'ai pas réussi à te sensibiliser au K.I.S.S
 

nobodyuse

XLDnaute Occasionnel
Re, Bonsoir Phil

Tout pareil que Phil
Vire-moi toutes ces cochoncetés
Pas de format, pas de couleur, pas de cellules fusionnées etc..
Nous sommes en phase de test
Donc on part d'un fichier vierge ( ce qui d'emblée règle la question RGPD et anonymat )
et on conçoit le bousin, brique par brique.
Ici il s'agit de rendre ergonomique la saisie des données puis de les archiver ensuite sur un autre feuille.
Ce n'est que quand tout sera fonctionnel que tu pourras faire du gribouillage et de l'esthétique.
Et c'est à cet étape, que tu verras ton classeur prendre de l'embonpoint.
;)

Evidemment tu peux jeter aux orties tout ce que je viens d'écrire ;)
Ce qui me permettra de me convaincre que je n'ai pas réussi à te sensibiliser au K.I.S.S


pour le fichier BC je part d'un truc déjà existant

mais comme tu a pu le constater sur le fichier que je t'ai joint dans le post #126 je suis resté sur du très sobre pour les tests je t'ai écouté 😉
par contre effectivement j'ai la fâcheuse tendance a fusionner des cellules pour rien en plus car en redimensionnant les colonnes ça fait parfaitement le job (mais je n'ai pas encore le réflexe)
 

Phil69970

XLDnaute Accro
Re
Bonjour @Staple1600 (Je ne t'avais point salué aujourd'hui)

Staple
Transpose= true c'est bon pour la colonne D
Mais pour "F6:I6" (quand les colonnes fusionnées seront supprimées) cela plante....
A la fois transpose pour D (colonne) et "F6:I6" (ligne) ne me semble pas possible

@nobodyuse
C'est la feuil4 qu'il faut prendre
VB:
Feuil4.Cells(Rows.Count, 1).End(3)(2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=True

@Phil69970
 

Discussions similaires

Haut Bas