[VBA] Macro à écrire en fonction

Signaler
Messages postés
3
Date d'inscription
mardi 15 juillet 2008
Statut
Membre
Dernière intervention
16 juillet 2008
-
Messages postés
3
Date d'inscription
mardi 15 juillet 2008
Statut
Membre
Dernière intervention
16 juillet 2008
-
Le savoir est la seule matière qui s'accroît quand on la partage.

4 réponses

Messages postés
3
Date d'inscription
mardi 15 juillet 2008
Statut
Membre
Dernière intervention
16 juillet 2008

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.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
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

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
Bonjour Ray95370,
Bonjour Mortalino,

J'approuve totalement le fait de commenter une fonction,
surtout dans un forum, ca aide !

Ou en es tu ?

Quelques conseils :



cell.Value = calendar & j pourrait être remplacé par : if ( StrComp  (

cell.Value
,
calendar & j


  , vbDatabaseCompare)  = 0 ) , par exemple




car tu pourrais avoir un problème de casse !

Initialise malgré tout ta variable compt = 0 , on est jamais trop prudent !! (j'ai eu un jour un bug à cause de cela )

Ou se trouve ton "return" :nb = compt ?
( a mon avis ta fonction s'appelait précédement comp ? )

Et j'approuve la question : pourquoi deux boucles , quel objectif ?

 
Bat,

m100
Messages postés
3
Date d'inscription
mardi 15 juillet 2008
Statut
Membre
Dernière intervention
16 juillet 2008

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.