Comment utiliser ReDim Preserve
Bonjour a tous, je fais un stage, et on me demande de faire une macro VB comme la suivante (voir ci dessous).
Le probleme etant que je ne la comprends pas entierement.
C'est pour faire une recherche sur un fichier, une sorte de Vlookup.
Si quelqu'un peut m'aider a la comprendre, ce serait gentil.
Voila le code de la macro.
J'ai mis en rouge ce qui me pose probleme et que j'aimerais que l'on m'explique.
Merci a tous.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| Sub data_analysis()
Dim Vector()
Dim Vector2()
Dim Party()
Dim Position()
Start = Sheets("Expiries").Range("C2")
Final = Sheets("Expiries").Range("C3")
z = 1
x = 1
teller = Sheets("per klant").Range("A65536").End(xlUp).[COLOR="Red"]Row - 13
teller2 = teller + 2
For i = 1 To teller
If Sheets("per klant").Range("G" & 13 + i) >= Start Then
If Sheets("per klant").Range("G" & 13 + i) <= Final Then
ReDim Preserve Vector(1 To z)
Vector(z) = 13 + i
z = z + 1
End If
End If
If Sheets("per klant").Range("K" & 13 + i) >= Start Then
If Sheets("per klant").Range("K" & 13 + i) <= Final Then
ReDim Preserve Vector2(1 To x)
Vector2(x) = 13 + i
x = x + 1
End If
End If
Next i
Sheets("Expiries").Range("C6").ClearContents
With Sheets("Expiries").Range("C12:I100")
.ClearContents
.Font.ColorIndex = 1
End With
Sheets("Expiries").Range("G6").ClearContents
y = 1
For i = 1 To teller2
If Sheets("per klant").Range("A" & 11 + i).Interior.ColorIndex = 2 Then
ReDim Preserve Party(1 To y)
ReDim Preserve Position(1 To y)
Party(y) = Sheets("per klant").Range("A" & 11 + i)
Position(y) = 11 + i
y = y + 1
End If
Next i
Sheets("counterparties").Range("B3:B1000").ClearContents
For a = 1 To UBound(Party)
With Sheets("counterparties").Range("B2")
.Offset(a, 0) = Position(a)
.Offset(a, 1) = Party(a)
End With
Next a
Sheets("Expiries").Range("C6") = z - 1
If z > 1 Then
For j = 1 To UBound(Vector)
With Sheets("Expiries")
.Range("C" & 11 + j) = Vector(j)
.Range("D" & 11 + j) = Sheets("per klant").Range("G" & Vector(j))
.Range("E" & 11 + j).FormulaR1C1 = "=vlookup(RC[-2],COUNTERPARTIES!R3C2:R" & UBound(Party) + 2 & "C3,2)"
End With
Next j
Else
Sheets("Expiries").Range("C12") = "no expiries in reference period"
End If
Sheets("Expiries").Range("G6") = x - 1
If x > 1 Then
For m = 1 To UBound(Vector2)
With Sheets("Expiries")
.Range("G" & 11 + m) = Vector2(m)
.Range("H" & 11 + m) = Sheets("per klant").Range("K" & Vector2(m))
.Range("I" & 11 + m).FormulaR1C1 = "=vlookup(RC[-2],COUNTERPARTIES!R3C2:R" & UBound(Party) + 2 & "C3,2)"
End With
Next m
Else
Sheets("Expiries").Range("G12") = "no calls in reference period"
End If
End Sub |
Je suis desole je n'arrive pas a incorpore dans ce message les print ecran du fichier excel (il me met fichier invalide ??). Mais je peux peut-etre les envoyer par email.
Pour les decrire :
Sur l'onglet "per klant", il y a de A1 a A10, des codes de couleur (telle couleur pour tel caracteristique).
Puis de A11 a K11, les intitules des colonnes avec en A11 "counterparty" et en G11 "expiry".
Sur l'onglet "expiries", je mets une date de debut en C2 et une date de fin en C3.
Puis je lance la macro et les resultats s'affichent en colonne a partir de C-D-E-12 et G-H-I-12.
C12 = le numero de la ligne de la reponse
D12 = la "expiry date"
E12 = le nom de la societe
G12, H12, I12 = Pareil que CDE12 sauf que ce n'est pas pour la date d'expiration mais la "call date".
Ce n'est pas important, juste l'explication pour la "expiry Date" me servira.
Merci.
Encore 2 petites choses s'il vous plait.
1/
Si je mets :
Code:
1 2 3 4 5 6 7
|
teller = Sheets("data").Range("A65536").End(xlUp).Row - 12
teller2 = teller + 2
...
For i = 1 To teller
If Sheets("data").Range("I" & 12 + i) >= Start Then
... |
Et que :
* mon tableau commence en A13, (la ligne 12 etant celles des intitules du tableau),
* et la dernier ligne de mon tableau est la ligne 40,
Cela me donne le resultat suivant ?
Pour i = 1
j'obtiens la ligne 12 + 1 = 13
Et pour i = teller
j'obtiens la ligne 12 + 28 = 40.
car teller = ligne 40 - 12 = ligne 28.
C'est ca ?
Et la ca marche.
Mais alors ils se seraient trompes dans la macro dont je dois m'inspirer ??
Parce que eux ils oublient que i commence a 1 et non a 0, et ils mettent :
Code:
1 2 3 4 5 6
|
teller = Sheets("data").Range("A65536").End(xlUp).Row - 13
teller2 = teller + 2
For i = 1 To teller
If Sheets("data").Range("I" & 13 + i) >= Start Then..... |
------------------------------------------------------------------------
2/
Pourquoi créer une seconde variable "teller2" et ne pas reutiliser la variable
"teller" ??
Il me semble que "teller2" fausse tout car pour le code :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
y = 1
For i = 1 To teller2
If Sheets("per klant").Range("A" & 11 + i).Interior.ColorIndex = 2 Then
ReDim Preserve Party(1 To y)
ReDim Preserve Position(1 To y)
Party(y) = Sheets("per klant").Range("A" & 11 + i)
Position(y) = 11 + i
y = y + 1
End If
Next i |
si i = 1
j'obtiens la ligne 11 + 1 = 12 [ce qui ne va pas, moi je veux 13]
Et si i = teller2
j'obtiens la ligne 11 + ((40 - 12) + 2) = 41 [ce qui ne va pas, moi je veux 40]
???
Merci, et desole si pour vous ces questions peuvent paraitre desuetes : je ne suis pas programmeur du tout, mais mes boss se sont mis dans la tete que oui.
Mon stage se finira bien !!
Merci beaucoup Dadavyvy.
J'ai fini ma macro, en changeant le code de départ, vu qu'il y avait des erreurs et des lourdeurs.
Je n'ai mis qu'une seule variable teller, et j'ai arrangé un peu l'ensemble.
Mes boss ont fait des tests et ca marche nickel.
Bon j'avoue n'avoir pas encore tout très bien saisi dans cette macro, mais quand même, je suis content d'avoir appris certaines choses, et d'en avoir fini.
Encore merci.
a+.