[VBA EXCEL] besoin d'aide pour une macro
Fermé
Nyck0las
-
22 nov. 2007 à 12:03
ShaBoo Messages postés 392 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 5 septembre 2009 - 28 nov. 2007 à 16:01
ShaBoo Messages postés 392 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 5 septembre 2009 - 28 nov. 2007 à 16:01
Bonjour,
voila je suis super débutant en VBA et j'essaie de programmer une fonction complémentaire.
Mon but est de prendre comme argument une plage de cellules (plusieurs cellules sur une meme ligne ou sur une meme colone), de déterminer le nombre de cellules. A partir de là, je construis un vecteur colonne en prenant les données de la plage de cellules et une matrice.
On termine ensuite par un ou 2 petits calculs.
Je vous mets ce que j'ai écrit pour me dire ce qui ne va pas ...
Function Note(E)
' E correspond à une plage de cellules
Dim n As Integer
Dim an
Dim A, Am
Dim i As Integer, j As Integer
Dim lg As Integer, cl As Integer
Set P = Range("E")
lg = P.Rows.Count
cl = P.Columns.Count
'mes données sont sur une meme ligne ou sur une meme colonne
' et je souhaite le déterminer
If cl = 1 Then
n = lg
ElseIf lg = 1 Then
n = cl
End If
an = 2 * Pi / n
'définition de ma matrice et de mon vecteur
Dim M(n - 1, n - 1)
Dim X(n - 1, 0)
If cl = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = R(i - 1, 0)
Next i
ElseIf lg = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = R(0, i - 1)
Next i
End If
For i = 0 To n - 1
For j = 0 To n - 1
M(i, j) = 0
Next j
Next i
M(n - 1, 0) = 1
For i = 0 To n - 2
M(i, i + 1) = 1
Next i
'quelques petits calculs
A = 1 / 2 * Sin(an) * Transpose(X) * M * X
Am = 1 / 2 * Sin(an) * 100 ^ 2 * n
Note = A / Am
End Function
merci bp
voila je suis super débutant en VBA et j'essaie de programmer une fonction complémentaire.
Mon but est de prendre comme argument une plage de cellules (plusieurs cellules sur une meme ligne ou sur une meme colone), de déterminer le nombre de cellules. A partir de là, je construis un vecteur colonne en prenant les données de la plage de cellules et une matrice.
On termine ensuite par un ou 2 petits calculs.
Je vous mets ce que j'ai écrit pour me dire ce qui ne va pas ...
Function Note(E)
' E correspond à une plage de cellules
Dim n As Integer
Dim an
Dim A, Am
Dim i As Integer, j As Integer
Dim lg As Integer, cl As Integer
Set P = Range("E")
lg = P.Rows.Count
cl = P.Columns.Count
'mes données sont sur une meme ligne ou sur une meme colonne
' et je souhaite le déterminer
If cl = 1 Then
n = lg
ElseIf lg = 1 Then
n = cl
End If
an = 2 * Pi / n
'définition de ma matrice et de mon vecteur
Dim M(n - 1, n - 1)
Dim X(n - 1, 0)
If cl = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = R(i - 1, 0)
Next i
ElseIf lg = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = R(0, i - 1)
Next i
End If
For i = 0 To n - 1
For j = 0 To n - 1
M(i, j) = 0
Next j
Next i
M(n - 1, 0) = 1
For i = 0 To n - 2
M(i, i + 1) = 1
Next i
'quelques petits calculs
A = 1 / 2 * Sin(an) * Transpose(X) * M * X
Am = 1 / 2 * Sin(an) * 100 ^ 2 * n
Note = A / Am
End Function
merci bp
A voir également:
- Variable ou procédure attendue et non un module
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Déplacer une colonne excel - Guide
- Calculer une moyenne sur excel - Guide
- Formule excel pour additionner plusieurs cellules - Guide
26 réponses
"variable ou procédure attendue et non un module"
ça ne voudrait pas dire que tu aurais nommé un module Note dans ton application ? auquel cas, tu n'as pas le droit d'appeler une fonction Note aussi
ça ne voudrait pas dire que tu aurais nommé un module Note dans ton application ? auquel cas, tu n'as pas le droit d'appeler une fonction Note aussi
Bonjour,
Dim M(n - 1, n - 1) ne marche pas, les dimensions doivent être constantes. Pour céer un tableau de dimensions variables il faut faire :
Dim M()
Redim M(n-1,n-1)
Quand à savoir si l'argument passé est bien de type range... Il n'y a que toi qui peux le savoir, c'est toi qui sais comment tu appelles ta fonction ! Comment fais-tu pour l'appeler ?
S'il te plaît quand tu dis "ça ne marche pas", précise : as-tu un message d'erreur,lequel, le résultat est-il faux ?...
Dim M(n - 1, n - 1) ne marche pas, les dimensions doivent être constantes. Pour céer un tableau de dimensions variables il faut faire :
Dim M()
Redim M(n-1,n-1)
Quand à savoir si l'argument passé est bien de type range... Il n'y a que toi qui peux le savoir, c'est toi qui sais comment tu appelles ta fonction ! Comment fais-tu pour l'appeler ?
S'il te plaît quand tu dis "ça ne marche pas", précise : as-tu un message d'erreur,lequel, le résultat est-il faux ?...
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
>
Nyck0las
22 nov. 2007 à 17:05
22 nov. 2007 à 17:05
A quel niveau est défini ton n ? Feuille, Module, ... ???
Bonjour,
Mais si n est correctement défini avant, les dimensions sont constantes.
Dans ton exemple initial Dim M(n-1, n-1) n est une variable puisque tu définis n par Dim n as integer.
Attention, en informatique, une variable dont on ne change jamais la valeur n'est pas la même chose qu'une constante.
Mais si n est correctement défini avant, les dimensions sont constantes.
Dans ton exemple initial Dim M(n-1, n-1) n est une variable puisque tu définis n par Dim n as integer.
Attention, en informatique, une variable dont on ne change jamais la valeur n'est pas la même chose qu'une constante.
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
22 nov. 2007 à 17:03
22 nov. 2007 à 17:03
Bonjour,
Je viens de tester l'utilisation d'une constante dans la definition de dimension d'un tableau et ça marche (idem pour 2 dimensions)
(Je suis en Excel 2000)
Je viens de tester l'utilisation d'une constante dans la definition de dimension d'un tableau et ça marche (idem pour 2 dimensions)
Const cN = 10 Sub test() Dim aTab(cN - 1, cN) Debug.Print UBound(aTab()) End Sub
(Je suis en Excel 2000)
le père
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
22 nov. 2007 à 18:00
22 nov. 2007 à 18:00
Bonjour,
ça ne marche même QUE avec des constantes
ça ne marche même QUE avec des constantes
Bonjour,
avec ça, tu travailles sur la colonne E et non pas sur la plage E passée en paramètre
travaille directement avec E si c'est un objet range ou à la rigueur fais set P=E
Set P = Range("E")
avec ça, tu travailles sur la colonne E et non pas sur la plage E passée en paramètre
travaille directement avec E si c'est un objet range ou à la rigueur fais set P=E
j'ai donc supprimé la ligne
Set P = Range("E")
et je travaille directement avec E, c'est à dire que j'ai remplacé P par E partout (d'ailleurs je ne rends compte que dans les lignes de code il ne faut pas lire R mais P)
le message d'erreur est alors le suivant : "constante requise" en me surlignant le second n dans :
Dim M(n - 1, n - 1)
Set P = Range("E")
et je travaille directement avec E, c'est à dire que j'ai remplacé P par E partout (d'ailleurs je ne rends compte que dans les lignes de code il ne faut pas lire R mais P)
le message d'erreur est alors le suivant : "constante requise" en me surlignant le second n dans :
Dim M(n - 1, n - 1)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
quand je sélectionne une ou plusieurs plages de cellules en argumant de ma fonction, est-ce qu'elle le comprend ? Mon argument est bien un objet de type Range ? parce que j'ai essayé un truc tout simple :
Function Test(Z)
Test = Z.Areas.Count
End Function
et çà marche pas ...
Function Test(Z)
Test = Z.Areas.Count
End Function
et çà marche pas ...
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
22 nov. 2007 à 15:19
22 nov. 2007 à 15:19
Bonjour,
Quel erreur as tu ?
Quel erreur as tu ?
Nyck0las
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
22 nov. 2007 à 15:43
22 nov. 2007 à 15:43
soit il me renvoie 0 quand il devrait me sortir 1 et #valeur pour 2 ou plus
je définis n comme constante mais je lui affecte une valeur avant de l'utiliser donc normalement çà ne devrait pas poser de problème ...
j'ai modifié un peu mon code, voici la nouvelle version. A mon avis je crois qu'il y a un pb avec la plage de données en argument, son traitement ...
Function Note(P)
' P correspond à une plage de cellules
Dim n As Integer
Dim an
Dim A, Am
Dim i As Integer, j As Integer
Dim E As Range
E = P.Select
n = 0
For i = 1 To E.Areas.Count
n = n + E.Areas(i).Columns.Count
Next i
an = 2 * Pi / n
'définition de ma matrice et de mon vecteur
Dim M(n - 1, n - 1)
Dim X(n - 1, 0)
If cl = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = E(i - 1, 0)
Next i
ElseIf lg = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = E(0, i - 1)
Next i
End If
For i = 0 To n - 1
For j = 0 To n - 1
M(i, j) = 0
Next j
Next i
M(n - 1, 0) = 1
For i = 0 To n - 2
M(i, i + 1) = 1
Next i
'quelques petits calculs
A = 1 / 2 * Sin(an) * Transpose(X) * M * X
Am = 1 / 2 * Sin(an) * 100 ^ 2 * n
Note = A / Am
End Function
j'ai modifié un peu mon code, voici la nouvelle version. A mon avis je crois qu'il y a un pb avec la plage de données en argument, son traitement ...
Function Note(P)
' P correspond à une plage de cellules
Dim n As Integer
Dim an
Dim A, Am
Dim i As Integer, j As Integer
Dim E As Range
E = P.Select
n = 0
For i = 1 To E.Areas.Count
n = n + E.Areas(i).Columns.Count
Next i
an = 2 * Pi / n
'définition de ma matrice et de mon vecteur
Dim M(n - 1, n - 1)
Dim X(n - 1, 0)
If cl = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = E(i - 1, 0)
Next i
ElseIf lg = 1 Then
For i = 0 To n - 1
X(i - 1, 0) = E(0, i - 1)
Next i
End If
For i = 0 To n - 1
For j = 0 To n - 1
M(i, j) = 0
Next j
Next i
M(n - 1, 0) = 1
For i = 0 To n - 2
M(i, i + 1) = 1
Next i
'quelques petits calculs
A = 1 / 2 * Sin(an) * Transpose(X) * M * X
Am = 1 / 2 * Sin(an) * 100 ^ 2 * n
Note = A / Am
End Function
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 10:14
23 nov. 2007 à 10:14
Quelques petites réflexions ... ;p
Sinon, quels sont les erreurs que tu as ??
Function Note(P) ' P correspond à une plage de cellules Dim n As Integer Dim an Dim A, Am Dim i As Integer, j As Integer Dim E As Range E = P.Select 'est ce bien utile ? n = 0 'je ne vois pas pourquoi tu fais une boucle ici ' si P est une plage tu n'auras qu'un Area For i = 1 To E.Areas.Count n = n + E.Areas(i).Columns.Count Next i an = 2 * Pi / n 'définition de ma matrice et de mon vecteur Dim M(n - 1, n - 1) Dim X(n - 1, 0) ' tu devrais le définir comme ceci : Dim X(n - 1) If cl = 1 Then 'comment est initialisé cl ? For i = 0 To n - 1 X(i - 1, 0) = E(i - 1, 0) Next i ElseIf lg = 1 Then 'comment est initialisé lg ? For i = 0 To n - 1 X(i - 1, 0) = E(0, i - 1) Next i End If For i = 0 To n - 1 For j = 0 To n - 1 M(i, j) = 0 Next j Next i M(n - 1, 0) = 1 For i = 0 To n - 2 M(i, i + 1) = 1 Next i 'quelques petits calculs A = 1 / 2 * Sin(an) * Transpose(X) * M * X Am = 1 / 2 * Sin(an) * 100 ^ 2 * n Note = A / Am End Function
Sinon, quels sont les erreurs que tu as ??
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
23 nov. 2007 à 10:28
23 nov. 2007 à 10:28
en fait çà peut etre un ensemble de plages du type A1:C1;G1:J1 donc il peut y avoir plusieurs areas
pour lg et cl, c'est une erreur de ma part, il faut remplacer le paragraphe par
For i = 0 To n - 1
X(i - 1, 0) = E(0, i - 1)
Next i
pour lg et cl, c'est une erreur de ma part, il faut remplacer le paragraphe par
For i = 0 To n - 1
X(i - 1, 0) = E(0, i - 1)
Next i
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 10:33
23 nov. 2007 à 10:33
en fait çà peut etre un ensemble de plages du type A1:C1;G1:J1 donc il peut y avoir plusieurs areas
Peut etre ... mais un ensemble de plage fait une plage.
Fais un :
Pour t'en rendre compte
Peut etre ... mais un ensemble de plage fait une plage.
Fais un :
Debug.Print E.Areas.Count
Pour t'en rendre compte
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
23 nov. 2007 à 11:39
23 nov. 2007 à 11:39
j'ai fait cette petite macro
Sub Try()
Dim z As Range
Worksheets("Feuil1").Activate
Set z = ActiveSheet.Range("B2:C2", "E2")
Debug.Print z.Rows.Count
End Sub
et quand je la lance çà semble fonctionner mais rien ne s'affiche ...
Sub Try()
Dim z As Range
Worksheets("Feuil1").Activate
Set z = ActiveSheet.Range("B2:C2", "E2")
Debug.Print z.Rows.Count
End Sub
et quand je la lance çà semble fonctionner mais rien ne s'affiche ...
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 11:42
23 nov. 2007 à 11:42
Remplace :
Debug.Print z.Rows.Count
Par :
MsgBox z.Rows.Count
Debug.Print z.Rows.Count
Par :
MsgBox z.Rows.Count
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
23 nov. 2007 à 11:53
23 nov. 2007 à 11:53
hiihaaaaaaaaaaaaaa
enfin quelque chose qui marche !!!!!!!!!!!
il m'affiche bien 1 comme résultat donc tu as raison un ensemble de plage = 1 plage
enfin quelque chose qui marche !!!!!!!!!!!
il m'affiche bien 1 comme résultat donc tu as raison un ensemble de plage = 1 plage
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 11:53
23 nov. 2007 à 11:53
lol
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 11:55
23 nov. 2007 à 11:55
Tu aurais pu voir l'affichage de :
Dans la fenetre "Execution" (si elle est affichée bien sur ;p) de ton editeur vba ...
Debug.Print z.Rows.Count
Dans la fenetre "Execution" (si elle est affichée bien sur ;p) de ton editeur vba ...
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
23 nov. 2007 à 12:03
23 nov. 2007 à 12:03
j'ai pas trouvé ...
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
>
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
23 nov. 2007 à 12:05
23 nov. 2007 à 12:05
lol ...
quand tu es dans l'editeur vba, tu fais "CTRL+G"
quand tu es dans l'editeur vba, tu fais "CTRL+G"
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
23 nov. 2007 à 12:16
23 nov. 2007 à 12:16
çà marche !!
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
23 nov. 2007 à 11:55
23 nov. 2007 à 11:55
j'ai fait quelques tests de rows et columns.count
et je me rends compte que lorsque je prends un ensemble de plage, il considère la plage qui recouvre tout.
En gros si je choisis
Range("B2:C3", "E5:F5")
il comprend
Range("B2:F5")
et je me rends compte que lorsque je prends un ensemble de plage, il considère la plage qui recouvre tout.
En gros si je choisis
Range("B2:C3", "E5:F5")
il comprend
Range("B2:F5")
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
23 nov. 2007 à 12:15
23 nov. 2007 à 12:15
il faudrait une liste de range en argument dont la taille n'est pas définie
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 14:16
23 nov. 2007 à 14:16
La "taille" d'un Range n'est définie que par ce que tu veux bien lui mettre dedans.
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
23 nov. 2007 à 14:32
23 nov. 2007 à 14:32
mais encore ....?????...????
moi ce que je voudrais c'est que lorsque j'indique
B2:C3;E5:F5
il comprenne
B2:C3 + E5:F5
et non
B2:F5
et ce qu'il y ait 2 plages ou plus
moi ce que je voudrais c'est que lorsque j'indique
B2:C3;E5:F5
il comprenne
B2:C3 + E5:F5
et non
B2:F5
et ce qu'il y ait 2 plages ou plus
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
>
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
23 nov. 2007 à 14:40
23 nov. 2007 à 14:40
Il faudrait voir les fonctions Union ou bien Intersect pour voir ce cela peut resoudre ton pb.
Sinon tu fais 2 objets Range ...
Sinon tu fais 2 objets Range ...
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
23 nov. 2007 à 16:06
23 nov. 2007 à 16:06
je ne vois pas du tout comment faire pour avoir en argument d'une fonction un ensemble de plage.
Dans la fonction SOMME par ex, je peux mettre en argument tout un ensemble de cellules contigues ou non et çà marche. Je voudrais faire la même chose ...
Dans la fonction SOMME par ex, je peux mettre en argument tout un ensemble de cellules contigues ou non et çà marche. Je voudrais faire la même chose ...
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 16:31
23 nov. 2007 à 16:31
Tu met un bouton sur ta feuille, tu double-click dessus et tu arrives sur l'editeur vba.
Dans un module tu mets ceci :
Private Sub CommandButton1_Click() Debug.Print flNomDeTaFonction(ActiveSheet.Range("B2:C2"),ActiveSheet.Range("E5:C5") End Sub
Dans un module tu mets ceci :
Function flNomDeTaFonction(Dim oPlg1 As Range, Dim oPlg2 As Range) As Long Dim lRes As Long 'ici tu mets ta petite bidouille de calcul avec oPlg1 et oPlg2 (noublie pas : ce sont des ranges) 'avec lRes qui stocke le resultat fNomDeTaFonction = lRes End Function
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
23 nov. 2007 à 16:41
23 nov. 2007 à 16:41
ok c'est cool
mais comment je peux faire si je veux un nombre n de range, avec n non défini ?????????
that is the question ...
mais comment je peux faire si je veux un nombre n de range, avec n non défini ?????????
that is the question ...
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
23 nov. 2007 à 17:12
23 nov. 2007 à 17:12
Ok ...
Ceci devrait te ravir :
Ceci devrait te ravir :
Private Sub CommandButton1_Click() Debug.Print flNomDeTaFonction(Union(ActiveSheet.Range("B2:C3"), ActiveSheet.Range("E5:F5"))) End Sub
Function flNomDeTaFonction(oPlg As Range) As Long Dim lRes As Long Debug.Print oPlg.Areas(1).AddressLocal Debug.Print oPlg.Areas(2).AddressLocal 'ici tu mets ta petite bidouille de calcul avec oPlg.Areas(1) et oPlg.Areas(2) (noublie pas : ce sont des ranges) 'avec lRes qui stocke le resultat flNomDeTaFonction = lRes End Function
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
26 nov. 2007 à 14:36
26 nov. 2007 à 14:36
j'ai peut-etre trouvé une solution à mon pb avec :
Public Function Test(ParamArray Rng() As Variant) As Long
Dim I As Integer, CellCount As Integer
For I = 0 To UBound(Rng)
CellCount = CellCount + Rng(I).Cells.Count
Next
Test = CellCount
End Function
ce qui permet d'avoir un ensemble de plages en argument.
Public Function Test(ParamArray Rng() As Variant) As Long
Dim I As Integer, CellCount As Integer
For I = 0 To UBound(Rng)
CellCount = CellCount + Rng(I).Cells.Count
Next
Test = CellCount
End Function
ce qui permet d'avoir un ensemble de plages en argument.
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
26 nov. 2007 à 14:37
26 nov. 2007 à 14:37
par contre j'ai un autre problème et oui ....
cette fois par rapport à du calcul matriciel.
J'ai défini
le vecteur X(n-1) et la matrice M(n-1,n-1)
et je voudrais calculer tX*M*X avec tX représentant "transposé de X".
J'ai marqué :
Transpose(X) * M * X
mais çà ne marche pas
çà indique
"erreur de compilation : sub ou function non définie" en surlignant la fonction "transpose" dans le code
cette fois par rapport à du calcul matriciel.
J'ai défini
le vecteur X(n-1) et la matrice M(n-1,n-1)
et je voudrais calculer tX*M*X avec tX représentant "transposé de X".
J'ai marqué :
Transpose(X) * M * X
mais çà ne marche pas
çà indique
"erreur de compilation : sub ou function non définie" en surlignant la fonction "transpose" dans le code
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
27 nov. 2007 à 11:57
27 nov. 2007 à 11:57
j'ai fait quelques modifs dans le programme et voici le résultat :
Sub Notation()
Dim min As Integer, max As Integer
Dim PE(1), EE(0), SE(1)
Dim PA(0), EA(1), SA(1)
Dim i As Integer
Worksheets("Feuil1").Activate
min = 2
max = 9
EE(0) = "B"
PE(0) = "C"
PE(1) = "d"
SE(0) = "E"
SA(0) = "f"
EA(0) = "g"
PA(0) = "h"
EA(1) = "i"
SE(1) = "j"
SA(1) = "j"
For i = min To max
If Cells(i, "a") = "Eau" Then
Cells(i, "k").Value = Note(i, PE())
Cells(i, "l").Value = Note(i, EE())
Cells(i, "m").Value = Note(i, SE())
ElseIf Cells(i, "a") = "Ass" Then
Cells(i, "k").Value = Note(i, PA())
Cells(i, "l").Value = Note(i, EA())
Cells(i, "m").Value = Note(i, SA())
Next
End Sub
______________________________________________________
Function Note(lg As Integer, ParamArray Rng() As Variant) As Long
Dim i As Integer, j As Integer, n As Integer
Dim alpha, pi
Dim A, Am
'calcul du nombre de cellules
n = UBound(Rng) + 1
'calcul de l'angle
pi = 4 * Atn(1)
alpha = 2 * pi / n
Debug.Print n
'définition de ma matrice M
Dim M()
ReDim M(n - 1, n - 1)
For i = 0 To n - 1
For j = 0 To n - 1
M(i, j) = 0
Next
Next
M(n - 1, 0) = 1
For i = 0 To n - 2
M(i, i + 1) = 1
Next
'definition du vecteur X
Dim X()
ReDim X(n - 1, 0)
For i = 0 To n - 1
X(i, 0) = ActiveSheet.Cells(lg, Rng(i).Value)
Next
'création de la tranposé de X
Dim TX()
Call Tvect(X, TX)
'quelques petits calculs
Dim p1(), p2()
Call PMAT(M(), X(), p1())
Call PMAT(TX(), p1(), p2())
A = 1 / 2 * Sin(alpha) * p2(0, 0)
Am = 1 / 2 * Sin(alpha) * 100 ^ 2 * n
Note = A / Am
End Function
__________________________________________________
Sub PMAT(A(), B(), C())
Dim i As Integer, j As Integer, k As Integer
Dim n As Integer, M As Integer, p As Integer
n = UBound(A, 2)
M = UBound(A, 1)
p = UBound(B, 2)
ReDim C(M, p)
For i = 0 To M
For j = 0 To p
For k = 0 To n
C(i, j) = C(i, j) + A(i, k) * B(k, j)
Next
Next
Next
End Sub
__________________________________
Sub Tvect(X(), TX())
Dim i As Integer, n As Integer
n = UBound(X, 1)
ReDim TX(0, n)
For i = 0 To n
TX(0, i) = X(i, 0)
Next
End Sub
Quand je le lance, le message d'erreur est le suivant :
"variable ou précédure attendue et non un module"
et la première occurence de "note" est surlignée dans la procédure notation
perso je ne vois pas trop où çà coince ....
Sub Notation()
Dim min As Integer, max As Integer
Dim PE(1), EE(0), SE(1)
Dim PA(0), EA(1), SA(1)
Dim i As Integer
Worksheets("Feuil1").Activate
min = 2
max = 9
EE(0) = "B"
PE(0) = "C"
PE(1) = "d"
SE(0) = "E"
SA(0) = "f"
EA(0) = "g"
PA(0) = "h"
EA(1) = "i"
SE(1) = "j"
SA(1) = "j"
For i = min To max
If Cells(i, "a") = "Eau" Then
Cells(i, "k").Value = Note(i, PE())
Cells(i, "l").Value = Note(i, EE())
Cells(i, "m").Value = Note(i, SE())
ElseIf Cells(i, "a") = "Ass" Then
Cells(i, "k").Value = Note(i, PA())
Cells(i, "l").Value = Note(i, EA())
Cells(i, "m").Value = Note(i, SA())
Next
End Sub
______________________________________________________
Function Note(lg As Integer, ParamArray Rng() As Variant) As Long
Dim i As Integer, j As Integer, n As Integer
Dim alpha, pi
Dim A, Am
'calcul du nombre de cellules
n = UBound(Rng) + 1
'calcul de l'angle
pi = 4 * Atn(1)
alpha = 2 * pi / n
Debug.Print n
'définition de ma matrice M
Dim M()
ReDim M(n - 1, n - 1)
For i = 0 To n - 1
For j = 0 To n - 1
M(i, j) = 0
Next
Next
M(n - 1, 0) = 1
For i = 0 To n - 2
M(i, i + 1) = 1
Next
'definition du vecteur X
Dim X()
ReDim X(n - 1, 0)
For i = 0 To n - 1
X(i, 0) = ActiveSheet.Cells(lg, Rng(i).Value)
Next
'création de la tranposé de X
Dim TX()
Call Tvect(X, TX)
'quelques petits calculs
Dim p1(), p2()
Call PMAT(M(), X(), p1())
Call PMAT(TX(), p1(), p2())
A = 1 / 2 * Sin(alpha) * p2(0, 0)
Am = 1 / 2 * Sin(alpha) * 100 ^ 2 * n
Note = A / Am
End Function
__________________________________________________
Sub PMAT(A(), B(), C())
Dim i As Integer, j As Integer, k As Integer
Dim n As Integer, M As Integer, p As Integer
n = UBound(A, 2)
M = UBound(A, 1)
p = UBound(B, 2)
ReDim C(M, p)
For i = 0 To M
For j = 0 To p
For k = 0 To n
C(i, j) = C(i, j) + A(i, k) * B(k, j)
Next
Next
Next
End Sub
__________________________________
Sub Tvect(X(), TX())
Dim i As Integer, n As Integer
n = UBound(X, 1)
ReDim TX(0, n)
For i = 0 To n
TX(0, i) = X(i, 0)
Next
End Sub
Quand je le lance, le message d'erreur est le suivant :
"variable ou précédure attendue et non un module"
et la première occurence de "note" est surlignée dans la procédure notation
perso je ne vois pas trop où çà coince ....
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
27 nov. 2007 à 14:49
27 nov. 2007 à 14:49
Bonjour,
Essaye ceci :
Essaye ceci :
Function Note(lg As Integer, Dim Rng() As Variant) As Long
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
27 nov. 2007 à 14:58
27 nov. 2007 à 14:58
non il ne veut pas du dim çà me donne
"erreur de compilation : attendu : identificateur"
"erreur de compilation : attendu : identificateur"
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
27 nov. 2007 à 15:03
27 nov. 2007 à 15:03
pfff ... naouak (chui fatigué moi)
Function Note(lg As Integer, Rng() As Variant) As Long
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
27 nov. 2007 à 15:29
27 nov. 2007 à 15:29
dsl mais c'est pas mieux on est reparti sur l'erreur "variable ou procédure attendue et non un module"
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
>
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
27 nov. 2007 à 15:46
27 nov. 2007 à 15:46
sur quelle ligne l'erreur ???
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
>
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
27 nov. 2007 à 15:57
27 nov. 2007 à 15:57
toujours pareil sur la première occurence de "note" est dans la procédure "notation"
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
28 nov. 2007 à 10:36
28 nov. 2007 à 10:36
ouais en fait j'avais appelé un module Note, d'où la confusion ..
Nyck0las
Messages postés
83
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
4 septembre 2014
1
28 nov. 2007 à 10:49
28 nov. 2007 à 10:49
çà compile !!!
mais je crois que le résultat est faux :-(
il doit y avoir un bug quelque part ....
mais je crois que le résultat est faux :-(
il doit y avoir un bug quelque part ....
ShaBoo
Messages postés
392
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
5 septembre 2009
50
28 nov. 2007 à 11:01
28 nov. 2007 à 11:01
Met des points d'arrêts (F9) et fais le tourner ligne par ligne en appuyant sur F8.
Dans la fenetre "Variables locales" tu verras le résultat de chacune de tes variables.
Dans la fenetre "Variables locales" tu verras le résultat de chacune de tes variables.