Disposer des valeurs dans des colonnes selon les données
Bonjour,
je filtre une base sur une feuille de calcul . (nombre de valeur "ligne" et de date constamment variable)
il y a une colonne date (format 188701 (janvier 1887))
une colonne données
je voudrais (si c'est possible ) dispatcher les données dans différentes colonnes en fonction du mois et de l'année

merci pour votre aide
Bonjour,
Dans la cellule G9, tu mets cette formule :
=SIERREUR(INDEX($C$9:$C$25;EQUIV(--($F9&TEXTE(G$8;"00"));$B$9:$B$25;0));"")le -- dans la formule EQUIV sert à mettre sous forme de nombre la concaténation $F9&TEXTE(G$8;"00")
Puis tu incrémentes vers la droite et le bas dans ton tableau
Comme dans le fichier joint.
Bon courage
Bonjour,
solution via une macro
Sub dispatch()
With Sheets("cherche")
i = 9
su = Val(Left(.Cells(9, 2), 4))
While .Cells(i, 2) <> ""
ad = .Cells(i, 2)
ad4 = Val(Left(.Cells(i, 2), 4))
m = Val(Right(ad, 2))
.Cells(ad4 - su + 9, m + 6) = .Cells(i, 3)
i = i + 1
Wend
End With
End SubBonjour,
dans la cellule G9 : =RECHERCHEV(CNUM($F9&TEXTE(G$8;"00"));$B$9:$C$25;2;FAUX) …
A étirer à droite et vers le bas …
Bonjour le fil, bonsjour le forum,
Arf ! Mort aux formulistes ! Ils sont trop forts...
Malgré mon retard, je propose une autre solution beaucoup plus longue...
Deux macros, la seconde de Jacques BOISGONTIER :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim I As Integer 'déclare la variable I (Incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim LI As Integer 'déclare la variable LI (LIgne)
Set O = Sheets("Cherche") 'définit l'onglet O
TC = O.Range("B9:C" & O.Cells(Application.Rows.Count, 2).End(xlUp).Row) 'définit le tableau de cellules TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TC, 1) 'boucle sur toutes les lignes I du tableau de cellule TC
D(Left(TC(I, 1), 4)) = "" 'alimente le dictionnaire D avec l'année de la valeur ligne I , colonne 1 de TC
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublons
Call tri(TMP, LBound(TMP, 1), UBound(TMP, 1)) 'lance la procédure de tri alphabétique du tableau temporaire TMP
O.Range("F8").CurrentRegion.ClearContents 'efface d'éventuelle anciennes valeurs
For I = 0 To UBound(TMP) 'boucle sur touts les éléments du tableau temporaire TMP
O.Cells(I + 9, 6).Value = TMP(I) 'renvoie lélément dans la cellule ligne I+9 colonne 6 (=F) de l'onglet O
Next I 'prochain élément de la boucle
For I = 1 To 12 'boucle sur les 12 mois
O.Cells(8, I + 6).Value = I 'renvoie le mois dans la cellule ligne 8 colonne I + 6 de l'onglet O
Next I 'prochain mois de la boucle
For I = 1 To UBound(TC, 1) 'boucle sur tous les lignes I du tableau de cellule TC
COL = 0: LI = 0 'initialise la colone COL et la ligne LI
COL = CInt(Right(TC(I, 1), 2)) + 6 'définit la colonne COL (colonne des deux derniers caractères de TC(I,1) plus 6)
LI = O.Columns(6).Find(Left(TC(I, 1), 4), , xlValues, xlWhole).Row 'définit la ligne LI (recherche l'année dans la colonne 6 (+F)
O.Cells(LI, COL).Value = TC(I, 2) 'renvoie valeur de la pluie dans la cellule ligne LI colonne COL de l'onglet O
O.Cells(LI, COL).NumberFormat = "0.0" 'format de la valeur renvoyée
Next I 'prochaine ligne de la boucle
End Sub
Sub tri(a, gauc, droi) ' Quick sort (tiré du site de Jacques BOISGONTIER) : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm)
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 SubSalut Robert !
Les codes VBA les plus efficaces sont ceux se servant déjà des fonctionnalités existantes
évitant les usines à gaz, au lieu de réinventer la roue au risque qu'elle fusse carrée ‼
Ainsi le code prend moins de dix lignes !
Sub Demo1()
With Feuil4
SRC$ = .[A8].CurrentRegion.Columns("B:C").Address(, , xlR1C1)
With .[F8].CurrentRegion
.Cells(2, 2).Resize(.Rows.Count - 1, .Columns.Count - 1).FormulaR1C1 = _
"=VLOOKUP(VALUE(RC6&TEXT(R8C,""00""))," & SRC & ",2,FALSE)"
End With
End With
End SubEt cette variante sans conserver les formules ni les erreurs reste bien plus courte que ton code :
Sub Demo2()
With Feuil4
Application.ScreenUpdating = False
SRC$ = .[A8].CurrentRegion.Columns("B:C").Address(, , xlR1C1)
With .[F8].CurrentRegion
With .Cells(2, 2).Resize(.Rows.Count - 1, .Columns.Count - 1)
.FormulaR1C1 = "=VLOOKUP(VALUE(RC6&TEXT(R8C,""00""))," & SRC & ",2,FALSE)"
VA = .Value
For R& = 1 To UBound(VA)
For C& = 1 To UBound(VA, 2)
If IsError(VA(R, C)) Then VA(R, C) = ""
Next
Next
.Value = VA
End With
End With
End With
End SubAlors tu vas me dire que le code de h2so4 est encore plus court que cette variante !
Certes, mais dans le cas d'un tableau final de milliers de lignes, l'utilisation d'une formule est instantanée,
pas le code bouclant cellule par cellule …
La formule de cousinhub est valable à partir d'Excel 2007 mais comme là je n'ai à disposition que la version 2003 …
Penser Excel avant VBA, l'efficience même !
Je vous remercie tous cela m'a bien aidé
Bonjour le fil, bonjour le forum,
Arf Marc ! Tu as encore une fois raison. Mais il faut dire que je ne joue pas dans la même catégorie. Et le mot joue prend vraiment tout son sens. Car pour moi le VBA est un jeu alors que les formules m'emm..dent considérablement. C'est comme ça je n'y peux rien ! Je ne pense donc pas Excel avant VBA ! Je pense à m'amuser avant tout. Ça me laissera toujours dans la cour des petits mais c'est là que je me sens le mieux...
Toutefois, étant un imbécile qui peut changer d'avis, il est possible qu'un jour je dise exactement le contraire de ce que je viens de dire... Ce jour la d'ailleurs, vous trouverez des brosses à dents pour gallinacées dans le rayon Animalerie de vos supermarchés favoris...
Je suis d'accord avec toi pour certaines formules compliquées provoquant des maux de tête pour les comprendre …
Mais quand le B-A-BA d'Excel répond à la problématique via une simple fonction, quel dommage de s'en passer !
Récemment sur un autre forum, une procédure de pas mal de lignes de code à force de boucles,
de copier / coller, prenait des dizaines de secondes.
En utilisant directement une formule dans la procédure, résultat instantané en moins de dix lignes de code, what else ?!