Ray95370
Messages postés3Date d'inscriptionmardi 15 juillet 2008StatutMembreDernière intervention16 juillet 2008 15 juil. 2008 à 16:50
Je copies ce post là où il aurait du être, enfin je l'espère :p
Bonjour,
dans le cadre de mon stage je suis amené à bidouiller sous VBA.
Aujourd'hui j'ai essayé de passer sous une fonction, une macro qui fonctionnait déjà.
Pour une valeur j allant de 1 ( "ARM") à 3 ("ARM+Offset"), cette macro me rappatrie le nombre d'itérations du concaténé
calendar & j.
Elle cherche cette valeur dans une autre feuille de calcul ( Calendrier ) et me rappatrie le résultat dans la feuille Offset.
Sub test()
Dim calendar As String
Dim datedebut, datefin As Date
Dim j, ARM, i As Long
Dim offset, armoff As Integer
Dim compt, comp As Integer
calendar = "CHICAGO_USD"
ARM = 1
offset = 2
armoff = ARM + offset
compt = 0
comp = 0
i = Worksheets("Calendrier").Range("A7").End(xlDown).Row
Worksheets("Calendrier").Activate
For j = ARM To armoff
For Each cell In Range("A2:A" & i)
If cell.Value = calendar & j Then
compt = compt + 1
End If
Next cell
comp = compt
Next j
Worksheets("Offset").Range("J2").Value = comp
End Sub
Le problème est que lorsque j'introduis une fonction :
Function nb(calendar As String, ARM As Long, offset As Integer) As Integer
Dim i, j As Long
Dim compt, comp, armoff As Integer
compt = 0
comp = 0
armoff = ARM + offset
i = Worksheets("Calendrier").Range("A7").End(xlDown).Row
Worksheets("Calendrier").Activate
For j = ARM To armoff
For Each cell In Range("A2:A" & i)
If cell.Value = calendar & j Then
compt = compt + 1
End If
Next cell
comp = compt
Next j
End Function
...Et bien les boucles ne fonctionnent plus et j'obtiens tout le temps 0.
Merci d'avance pour toute l'aide que vous pourrez m'apporter
Le savoir est la seule matière qui s'accroît quand on la partage.
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 15 juil. 2008 à 19:13
salut,
je corrige ta fonction, mais cela n'aura aucune incidence, je commente les modif.
Sinon, comment appelles-tu ta fonction ?
As-tu essayé en mode pas à pas (F8) ?
Option Explicit
Function nb(ByVal calendar As String, ByVal ARM As
Long, ByVal offset As Integer) As Integer
' ^^ Passage à ByVal, sinon, c'est
ByRef
'Dim i, j As Long ici seul j est Lont,
i est variant
Dim i As Long, j As Long
Dim compt As Integer, comp As Integer, armoff As Integer
' idem ici pour le
type ^^
'compt = 0 inutile, pas de
valeur ? donc ça vaut 0
'comp =
0
armoff = ARM + offset
i = Worksheets("Calendrier").Range("A7").End(xlDown).Row
Worksheets("Calendrier").Activate
For j = ARM To armoff
For Each cell In Range("A2:A" & i)
If cell.Value = calendar & j
Then
compt = compt + 1
End If
Next cell
comp = compt ' ici, comp n'est utilisé
nulle part, donc il est inutile
Next j
End Function
~
<small>Mortalino ~ [code.aspx?ID=39466 Colorisation
automatique]</small>
Sinon, ce que je trouve bizarre, ce sont tes deux boucles imbriquées,
For j = ARM To armoff' admettons, ARM 1 et armoff 3
Apres avec ton For Each, tu attribue une valeur dans ta cellule, mais à la seconde boucle de j, tout s'efface, bref, seule la dernière boucle de j inscrit quelque chose dans ta plage de données A2:Ai
Ray95370
Messages postés3Date d'inscriptionmardi 15 juillet 2008StatutMembreDernière intervention16 juillet 2008 16 juil. 2008 à 09:47
Bonjour à vous 2,
et merci pour vos interventions :)
Alors,
As-tu essayé en mode pas à pas (F8) : Je ne sais pas comment faire ce "pas à pas" dans le cadre d'une fonction. Pour ma macro tout fonctionne, le passage à la fonction la fait planter :'(
i est variant : Euh pour moi il était long vu qu'il était censé compter le nombre de ligne (+ ou - 30k). Mais je peux le mettre en variant :)
Comp : En effet c'était l'ancien nom de ma fonction, je le remplace aussitot par NB :))
pourquoi deux boucles , quel objectif ? En fait ce que je souhaites faire c'est chercher une valeur dans une colonne (d'où la 1re boucle), et cette même valeur peut prendre plusieurs valeurs (d'où la 2nde boucle)... C'est un peu flou et je penses que l'on doit pouvoir faire bcp plus simple, mais je suis un Noob :'(
if ( StrComp (
cell.Value, calendar & j , vbDatabaseCompare) = 0 )
Merci, maintenant je vais n'utiliser que cette écriture que je ne connaissais pas :))
Ray
Le savoir est la seule matière qui s'accroît quand on la partage.