comptage de variables

erics83

XLDnaute Impliqué
Bonjour,

J'ai un petit souci : j'ai une feuille "Compilation", dans laquelle se trouve en colonne 25 une donnée "caractère" (exemple : "2017 - Janvier"). J'ai 30 feuilles (de "2015 - Janvier" à "2017 - Juin").
je cherche à prendre les données se trouvant dans "Compilation" et de les répartir dans chacune des feuilles.
J'ai fait :
Code:
Dim fe(100)
'identification et écriture des données par feuilles
'Lecture
For i = 2 To Sheets("Compilation").Range("A" & Rows.Count).End(xlUp).Row
'idexation des lignes par référence feuille
fe(Sheets("Compilation").Cells(i, 25).Value) = fe(Sheets("Compilation").Cells(i, 25).Value) + 1
'recopie de la colonne 1 à 25 des données Compilation dans Feuille concernée
For j = 1 To 25
Sheets(Sheets("Compilation").Cells(i, 25)).Cells(fe(Sheets("Compilation").Cells(i, 25)), j) = Sheets("Compilation").Cells(i, j)
Next

Next
"Fe" me permettant d'aller à la ligne suivante pour chaque feuille.....mais...cela ne fonctionne pas....et je pense que cela vient du format....j'ai essayé avec "Fe$()", mais idem, marche pas....

Une idée et/ou autre solution ?

En vous remerciant pour votre aide,
 
Dernière édition:

erics83

XLDnaute Impliqué
Merci gosselien,

En PJ, un fichier test,

(J'ai rempli les feuilles mai et juin, mais "normalement" elles sont vides et devraient être alimentées par Compilation, comme je souhaiterai le faire....), peut importe le tri (si nécessaire), l'essentiel étant que je puisse avoir, rapidement, les données de compilation sur chaque feuilles....

merci pour ton aide,
 

Pièces jointes

  • Fichier test 1.xlsm
    1.4 MB · Affichages: 25

erics83

XLDnaute Impliqué
Merci gosselien,

Et surtout merci pour toutes tes explications dans le code, cela m'a permis de comprendre la logique.
Par contre, j'ai un problème : les feuilles existent déjà et sont soumises à d'autres codes (je ne rentre pas dans le détail, mais elle sont crées à l'ouverture, un ensemble de manip sur ces feuilles), et ton code créée la feuille en fonction du nom de la série...et donc, cela ne peut pas aller....

Par contre, chapeau pour la rapidité....lol....avant, je faisais : aller sur la feuille, boucle sur "Compilation" et repérage des "séries" et écriture, mais la boucle sur compilation (qui contient 400000 lignes était trop longue, d'où mon désir de partir de Compilation et d'incrémenter les feuilles...mon "ancien code ":
Code:
For i = 1 To Sheets("Compilation").Range("A" & Rows.Count).End(xlUp).Row

If Sheets("Compilation").Cells(i, 25) = a Then 'a= nom de la feuille, qui porte le même nom que la série

b = b + 1
For j = 1 To 25
Sheets(k).Cells(b, j) = Sheets("Compilation").Cells(i, j)
Next
End If
Next
End If

Mais j'ai compris la logique, et effectivement, le passage par un dictionaire et/ou tableau, semble être une solution....mais j'aurai besoin d'être un peu guidé....

Merci pour ton aide,
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour eris83, gosselien,

Deux autres pistes dans le fichier joint. Les codes sont dans module1. La méthode v2 (moins de 15 s) est un peu plus rapide que la v1 (moins de 11 s) quand le nombre de lignes de données est grand. Les deux méthodes font d'abord le tri de la feuille Compilation. C'est pourquoi, la première exécution (de v1 ou v2) dure un peu plus longtemps que les exécution suivantes.

nota : l'initialisation des 400 000 lignes est un peu longue. Si on veut moins de lignes de données de départ, modifier la constante dans la procédure Init.
 

Pièces jointes

  • erics83- Ventil- v2.xlsm
    44.2 KB · Affichages: 26
Dernière édition:

erics83

XLDnaute Impliqué
Merci mapomme,

Whouf, impressionnant !!!
Si j'ai bien compris la logique du code (ventilation2) : on trie "Compilation" par série; et ensuite on essaye de déterminer le début (N) et la fin (m), et on copie/colle le bloc....Impressionnant de simplicité et d'efficacité !!!
Merci !!

Juste pour voir jusqu'où on pourrait aller : j'ai dans une feuille ("Form"), une série de formules qui sont en AJ2:AT2, qui calculent différentes choses par rapport aux données de A:AI.
Jusqu'à présent, j'utilise un code style (enfin, c'est pas moi qui l'ai fait, c'est l'assistant macro...lol) :
Code:
'boucle sur les feuilles
k = ActiveSheet.Name
Sheets("Form").Select
    Range("AJ2:AT2").Select
    Selection.Copy
    Sheets(k).Select
    Range("AJ2").Select
    ActiveSheet.Paste
    Range("AJ2:AT2").Select
    Application.CutCopyMode = False
    Selection.AutoFill Destination:=Range("AJ2:AT" & Range("A" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault
Peut on réutiliser votre méthode pour copier/coller rapidement ces formules afin qu'elles puissent calculer dans les feuilles serie ? Si oui, comment procéder ? (vous avez compris que je cherche aussi à comprendre les logiques des codes, afin de m'améliorer....)

En vous remerciant pour votre aide,
 

gosselien

XLDnaute Barbatruc
Re,

autre test à faire :)

VB:
Option Explicit
Sub SplitterEnOnglet()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim f As Worksheet
Dim T
Dim i&, n&
Dim Code$, Rng
Dim Lastrow&
Dim A
Set f = Sheets("feuil1")
T = Timer()
Set f = Sheets("feuil1")
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Lastrow = Range("F650000").End(xlUp).Row
Set Rng = f.Range("F2:R" & Lastrow)
Rng.Sort Key1:=f.[K2]
A = Rng
i = 1: n = 0
Do While i <= UBound(A)
   Code = A(i, 6)
   Do While A(i, 6) = Code
      i = i + 1: If i > UBound(A) Then Exit Do
   Loop
   On Error Resume Next: Sheets(Code).Delete: On Error GoTo 0
   Sheets.Add after:=Sheets(Sheets.Count)
   ActiveSheet.Name = Code
   f.Cells(2 + n, 1).Resize(i - 1 - n, 20).Copy [A2]
   f.[F1:R1].Copy [F1]
   n = i - 1
Loop
MsgBox Timer() - T
End Sub
 

Discussions similaires

Réponses
17
Affichages
760

Statistiques des forums

Discussions
311 711
Messages
2 081 783
Membres
101 817
dernier inscrit
carvajal