Matrice dans une macro
Bonjour le forum,
j'ai réalisé une macro personnelle dans excel qui me permet dans un nouveau classeur d'associer des valeurs à d'autres valeurs grâce a une fonction RECHERCHEV.
Mon problème est que cette matrice de la fonction RECHERCHEV n'existe pas dans le classeur (qui change à chaque fois) je dois donc l'intégrer à la macro.
La solution que j'ai trouve est au sein de la macro de réaliser la saisir de la matrice (Range("G18").Select
ActiveCell.FormulaR1C1 = "18"
puis de la supprimer après l'avoir utilisé.
Cette solution fonctionne mais elle est assez longue à saisir si la matrice est importante et me semble assez empirique.
Y a t'il une autre démarche?
Merci d'avance
MattJol
Bonjour,
Je n'ai rien compris à ta demande.
Peux-tu donner plus d'explications ou alors mettre cette macro ici.
A te lire
Dan
oui c sûr que j'ai pas été très très clair
Voici la macro en attachement https://www.excel-pratique.com/~files/doc/Delais_fournisseurs_V2.zip
Tu verras que dans cette macro j'utilise la fonction VLOOKUP qui nécessite une matrice, que je renseigne au préalable en enregistrant toute la saisie de cette matrice dans la feuille excel.
Je voudrais savoir s'il n'y a pas une méthode plus propre!
Re,
Merci pour ton fichier.
Une chose que tu peux déjà effectuer, c'est remplacer toutes les instructions de type :
Range("G2").Select
ActiveCell.FormulaR1C1 = "19"par :
Range("G2").value= 19A adapter selon chaque cellule bien entendu.
Je regarde pour le reste
Dan
Salut le forum
Pour remplir tes matrices utilise les "Array's"
'...
'Matrice #1
i = 0
For Each valeur In Array(18, 19, 16, 20, 15, 21, 14, 13, 22, 12, _
23, 24, 11, 25, 26, 27, 10, 28, 9, 8, _
29, 7, 6, 5, 4, 30, 31, 3, 2, 32, _
33, 34, 1, 35, 36, 37, 0, 38, 17, 39)
i = i + 1
Range("G" & i) = valeur
Next valeur
'Matrice #2
i = 0
For Each valeur In Array("90 JN", "90 JFQ", "90 JFM", "90 JFD", "60 JN", _
"60 JFQ", "60 JFM", "60 JFD", "50 JN", "50 JFQ", _
"50 JFM", "50 JFD", "45 JN", "45 JFQ", "45 JFM", _
"45 JFD", "30 JN", "30 JFQ", "30 JFM", "30 JFD", _
"25 JN", "25 JFQ", "25 JFM", "25 JFD", "20 JN", _
"20 JFQ", "20 JFM", "20 JFD", "15 JN", "15 JFQ", _
"15 JFM", "15 JFD", "10 JN", "10 JFQ", "10 JFM", _
"10 JFD", "0 JN", "0 JFQ", "0 JFM", "0 JFD")
i = i + 1
Range("H" & i) = valeur
Next valeur
'Matrice #3
i = 0
For Each valeur In Array(95,102.5,105,95,65,72.5,75,65,55,62.5, _
65, 55, 50, 57.5, 60, 50, 35, 42.5, 45, 35, _
30, 37.5, 40, 30, 25, 32.5, 35, 25, 20, 27.5, _
30, 20, 15, 22.5, 25, 15, 5, 12.5, 15, 5)
i = i + 1
Range("I" & i) = valeur
Next valeur
'...Mytå
Bonsoir,
Ah ben Myta c'est encore mieux avec ARRAY. Je l'avais complètement oubliée celle-là !
Revoici ta macro avec la proposition de Myta. Elle peut probablement encore être simplifiée mais là le fichier serait nécessaire.
Sub Delais_Fournisseurs()
Dim valeur
Range("B:B,E:E,F:G,I:M").Delete Shift:=xlToLeft
Columns("D:D").Select
Selection.Replace What:=",", Replacement:=".", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Rows("1:2").Insert Shift:=xlDown
Range("C1").Value = "MONTANT TOTAL"
Range("D1").FormulaR1C1 = "=SUM(R[2]C:R[999]C)"
'Matrice #1
i = 0
For Each valeur In Array(18, 19, 16, 20, 15, 21, 14, 13, 22, 12, 23, 24, _
11, 25, 26, 27, 10, 28, 9, 8, _
29, 7, 6, 5, 4, 30, 31, 3, 2, 32, 33, 34, 1, 35, 36, 37, 0, 38, 17, 39)
i = i + 1
Range("G" & i) = valeur
Next valeur
'Matrice #2
i = 0
For Each valeur In Array("90 JN", "90 JFQ", "90 JFM", "90 JFD", "60 JN", _
"60 JFQ", "60 JFM", "60 JFD", "50 JN", "50 JFQ", _
"50 JFM", "50 JFD", "45 JN", "45 JFQ", "45 JFM", _
"45 JFD", "30 JN", "30 JFQ", "30 JFM", "30 JFD", _
"25 JN", "25 JFQ", "25 JFM", "25 JFD", "20 JN", _
"20 JFQ", "20 JFM", "20 JFD", "15 JN", "15 JFQ", _
"15 JFM", "15 JFD", "10 JN", "10 JFQ", "10 JFM", _
"10 JFD", "0 JN", "0 JFQ", "0 JFM", "0 JFD")
i = i + 1
Range("H" & i) = valeur
Next valeur
'Matrice 3
i = 0
For Each valeur In Array(95, 102.5, 105, 95, 65, 72.5, 75, 65, 55, 62.5, _
65, 55, 50, 57.5, 60, 50, 35, 42.5, 45, 35, _
30, 37.5, 40, 30, 25, 32.5, 35, 25, 20, 27.5, _
30, 20, 15, 22.5, 25, 15, 5, 12.5, 15, 5)
i = i + 1
Range("I" & i) = valeur
Next valeur
Columns("C:D").Insert Shift:=xlToRight
With Range("C3")
.FormulaR1C1 = "=VLOOKUP(RC[-1],R1C9:R40C11,2,FALSE)"
.AutoFill Destination:=Range("C3:C" & Range("B65536").End(xlUp).Row)
End With
With Range("D3")
.FormulaR1C1 = "=VLOOKUP(RC[-2],R1C9:R40C11,3,FALSE)"
.AutoFill Destination:=Range("D3:D" & Range("B65536").End(xlUp).Row)
End With
Columns("C:D").Copy
Selection.PasteSpecial Paste:=xlValues
Columns("I:K").Delete Shift:=xlToLeft
With Range("G3")
.FormulaR1C1 = "=RC[-1]/R1C6"
.AutoFill Destination:=Range("G3:G" & Range("D65536").End(xlUp).Row)
End With
With Range("H3")
.FormulaR1C1 = "=RC[-1]*RC[-4]"
.AutoFill Destination:=Range("H3:H" & Range("E65536").End(xlUp).Row)
End With
Range("A1").FormulaR1C1 = "DELAIS MOYEN"
Range("C1").FormulaR1C1 = "=SUM(R[2]C[5]:R[999]C[5])"
Selection.NumberFormat = "0.00"" jours"""
Columns("F:F").NumberFormat = "#,##0"
Columns("G:G").NumberFormat = "0.00%"
Range("B:B").Delete Shift:=xlToLeft
Columns("A:F").EntireColumn.AutoFit
Range("A3").CurrentRegion.Select
Selection.Sort Key1:=Range("C3"), Order1:=xlDescending, Key2:=Range("B3") _
, Order2:=xlDescending, Key3:=Range("D3") _
, Order3:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom
Range("G:G").EntireColumn.Hidden = True
Range("A1").Select
End SubA te lire
Dan
Re le forum
Dan tu as oublié une déclaration de variable
Sub Delais_Fournisseurs()
Dim valeur as Variant
Dim i as byte
'.....
Le Variant étant facultatif pour le Dim valeur
Mytå
Bonjour,
Oups, je n'ai pas fait attention. Effectivement i était à déclarer aussi.
Merci de le préciser Myta.
Bon WE
Dan
Ok
Merci à tous les 2