cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006
-
28 janv. 2005 à 14:34
adn28 -
15 févr. 2005 à 15:08
Private Sub transfert()
Dim vnomfeuille As String
Dim vmatiere As String
Dim vnummatiere As Integer
Dim vnumeleve As Integer
Dim vnomeleve As String
Dim vprenomeleve As String
Dim vnote As String
Dim vsur As String
Dim i As Integer
Dim j As Integer
Dim velevetraite As Integer
Dim vmatieretraite As Integer
Dim vnombreds(1 To 10) As Integer
Dim vnombrenote As Integer 'Mémorise le nombre total de notes par élève
Dim vCellule As String 'Mémorise le nom de la cellule de démarrage pour la feuille Test
Dim vDecalage As Integer 'Mémorise le nombre de cellule à décaler pour mémoriser les informations
Dim vClasse As String 'Mémorise le nom de la classe traitée
Worksheets("test").Activate
Range("A2").Activate
Do
'Initialisation du nombre de ds à 0
For i = 1 To 10
vnombreds(i) = 0
Next i
vCellule = "A2"
vnombrenote = 0
'offset permet le deplacement dans la feuille
vClasse = ActiveCell.Value
vnomfeuille = ActiveCell.Value & " " & ActiveCell.Offset(0, 8).Value
If ActiveCell.Offset(0, 8).Value = "1" Then
vnomfeuille = vnomfeuille & "ère période"
Else
vnomfeuille = vnomfeuille & "ème période"
End If
Worksheets(vnomfeuille).Activate
Range("c1").Activate
Worksheets("test").Activate
velevetraite = ActiveCell.Offset(0, 9).Value
Do
vnummatiere = ActiveCell.Offset(0, 3).Value
Select Case vnummatiere
Case Is = 1
vmatiere = "LITTERATURE(Dire,Lire,Erire)"
Case Is = 2
vmatiere = "OBSERVATION REFLECHIE DE LA LANGUE FRANCAISE Grammaire - Conjugaison - Ortographe - Vocabulaire "
Case Is = 3
vmatiere = "HISTOIRE - GEOGRAPHIE"
Case Is = 5
vmatiere = "MATHEMATIQUES"
Case Is = 6
vmatiere = "SCIENCES EXPERIMENTALES ET TECHNOLOGIE"
Case Else
vmatiere = ""
End Select
Do
vnombreds(vnummatiere) = vnombreds(vnummatiere) + 1
ActiveCell.Offset(1, 0).Activate
Loop Until vnummatiere <> ActiveCell.Offset(0, 3).Value Or velevetraite <> ActiveCell.Offset(0, 9).Value
vnombrenote = vnombrenote + vnombreds(vnummatiere)
If vmatiere <> "" Then
Worksheets(vnomfeuille).Activate
ActiveCell.Value = vmatiere
ActiveCell.Offset(0, vnombreds(vnummatiere) + 1).Activate
Worksheets("test").Activate
Else
'Mémorisation d'une valeur négative pour indiquer que cette matière n'est pas à traiter
vnombreds(vnummatiere) = -vnombreds(vnummatiere)
End If
Loop Until velevetraite <> ActiveCell.Offset(0, 9).Value
Worksheets(vnomfeuille).Activate
ActiveCell.Value = "Total sur 100"
ActiveCell.Offset(0, 1).Value = "Total sur 20"
'Retour au départ pour gérer la suite de l'entête
Range("B2").Activate
Worksheets("test").Activate
Range(vCellule).Activate
'Ajouter dans cette boucle, une boucle qui gère selon les matières (à la fin de chaque matière il faut ajouter une colonne moyenne) en utilisant le tableau vnummatiere où on a mémorisé le nombre de notes par matière
For vnummatiere = 1 To 10
'Pour chaque note de la matière
For j = 1 To vnombreds(vnummatiere)
i = 0
'Tant que la note est abs on passe à l'élève suivant pour la même matière
While ActiveCell.Offset(i, 6).Value = "abs"
i = i + vnombrenote
Wend
vsur = ActiveCell.Offset(i, 7).Value
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, 1).Activate
ActiveCell.Value = vsur
Worksheets("test").Activate
ActiveCell.Offset(1, 0).Activate
Next j
'Création de la colonne moyenne pour la matière
If vnombreds(vnummatiere) > 0 Then
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, 1).Activate
ActiveCell.Value = "Moy"
Worksheets("test").Activate
Else
ActiveCell.Offset(-vnombreds(vnummatiere), 0).Activate
End If
Next vnummatiere
'Retour au départ pour gérer les élèves (avant on ne fait que créer les entêtes des colonnes)
Worksheets(vnomfeuille).Activate
Range("A3").Activate
Worksheets("test").Activate
Range(vCellule).Activate
'Mémorisation du nombre d'élèves traités pour se repositionner dans les formules et savoir si on doit griser ou pas la ligne
velevetraite = 0
Do
velevetraite = velevetraite + 1
vnomeleve = ActiveCell.Offset(0, 1).Value
vprenomeleve = ActiveCell.Offset(0, 2).Value
Worksheets(vnomfeuille).Activate
ActiveCell.Value = vnomeleve
ActiveCell.Offset(0, 1).Value = vprenomeleve
'Permet de connaître le décalage à faire pour la mémorisation des valeurs
vDecalage = 2
Worksheets("test").Activate
'Pour chaque matière
For vnummatiere = 1 To 10
'Pour chaque ds de la matière
For j = 1 To vnombreds(vnummatiere)
vnote = ActiveCell.Offset(0, 6).Value
Worksheets(vnomfeuille).Activate
If vnote = "abs" Then
ActiveCell.Offset(0, vDecalage).Value = ""
Else
ActiveCell.Offset(0, vDecalage).Value = vnote
End If
vDecalage = vDecalage + 1
Worksheets("test").Activate
ActiveCell.Offset(1, 0).Activate
Next j
'Si la matière est traitée, mémorisation des formules en fin de matière
If vnombreds(vnummatiere) > 0 Then
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, vDecalage).FormulaR1C1 = "=IF((RC[" & -vnombreds(vnummatiere) & "]:RC[-1]="");"";AVG((SUM(RC[" & -vnombreds(vnummatiere) & "]:RC[-1])/SUM(R[" & -velevetraite & "]C[" & -vnombreds(vnummatiere) & "]:R[" & -velevetraite & "]C[-1]))*10))"
vDecalage = vDecalage + 1
Worksheets("test").Activate
Else
ActiveCell.Offset(-vnombreds(vnummatiere), 0).Activate
End If
Next vnummatiere
'Mémorisation des formules en fin de ligne
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, vDecalage).FormulaR1C1 = "somme" 'Mettre la formule pour calculer la somme de toutes les matières
ActiveCell.Offset(0, vDecalage + 1).FormulaR1C1 = "sur 20" 'Mettre la formule pour ramener la somme sur 20 points
ActiveCell.Offset(1, 0).Activate
Worksheets("test").Activate
Loop Until ActiveCell.Value <> vClasse
Loop Until ActiveCell.Value = ""
End Sub
mon pbc'est la ligne rouge j'aimerais savoir quel est le code pour la formule
en faite je desre pouvoir mettre une formule dans la colene moyenne correspondante pour pouvoir calculer la moyenne sans que les notes de la matiere ou ya un blanc ne soit pas comptabiliser en acces sa donne
SI(C:C"";"";MOYENNE((SOMME(C4:C4)/SOMME(C2:C2))*10))
j'amerais donc pouvoir integrer cette foncto avec le code vba pour pouvoir l'avoir automatiquement dans la collonne moyenne
je sais pas si la syntaxe est bone pourtant cela me semble bon
pouvez vous m'aider
'* on réinitialise le compteur pour chaque nouveau traitement !
Cpt_Abs = 0
Next vnummatiere
Autre problème observé :
Parcontre, je me suis rendu compte que le calcul sur la valeur 11.75 ne
se faisait pas à cause d'un problème d'affichage de nombre => 11,75
est considéré comme du text, à cause certainement du mode d'importation
des données : dans test tu a devant des nombres "'"11,75 et ça gène pour la reconnaissance du format numérique des réels.
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 3 févr. 2005 à 10:28
voici le code qui fonctionne je tien a remercie tres fortement madbob qui s'est triturer les meninges pour aporter la solution sans lui et bien j'aurais pus chercher longtemps
je le remercirais jamais assez
Private Sub transfert()
Dim vnomfeuille As String
Dim vmatiere As String
Dim vnummatiere As Integer
Dim vnumeleve As Integer
Dim vnomeleve As String
Dim vprenomeleve As String
Dim vnote As String
Dim vsur As String
Dim i As Integer
Dim j As Integer
Dim velevetraite As Integer
Dim vmatieretraite As Integer
Dim vnombreds(1 To 10) As Integer
Dim vnombrenote As Integer 'Mémorise le nombre total de notes par élève
Dim vCellule As String 'Mémorise le nom de la cellule de démarrage pour la feuille Test
Dim vDecalage As Integer 'Mémorise le nombre de cellule à décaler pour mémoriser les informations
Dim vClasse As String 'Mémorise le nom de la classe traitée
Dim maformule As String
Dim Cpt_Abs As Integer
Worksheets("test").Activate
Range("A2").Activate
Do
'Initialisation du nombre de ds à 0
For i = 1 To 10
vnombreds(i) = 0
Next i
vCellule = "A2"
vnombrenote = 0
'offset permet le deplacement dans la feuille
vClasse = ActiveCell.Value
vnomfeuille = ActiveCell.Value & " " & ActiveCell.Offset(0, 8).Value
If ActiveCell.Offset(0, 8).Value = "1" Then
vnomfeuille = vnomfeuille & "ère période"
Else
vnomfeuille = vnomfeuille & "ème période"
End If
Worksheets(vnomfeuille).Activate
Range("c1").Activate
Worksheets("test").Activate
velevetraite = ActiveCell.Offset(0, 9).Value
Do
vnummatiere = ActiveCell.Offset(0, 3).Value
Select Case vnummatiere
Case Is = 1
vmatiere = "LITTERATURE(Dire,Lire,Erire)"
Case Is = 2
vmatiere = "OBSERVATION REFLECHIE DE LA LANGUE FRANCAISE Grammaire - Conjugaison - Ortographe - Vocabulaire "
Case Is = 3
vmatiere = "HISTOIRE - GEOGRAPHIE"
Case Is = 5
vmatiere = "MATHEMATIQUES"
Case Is = 6
vmatiere = "SCIENCES EXPERIMENTALES ET TECHNOLOGIE"
Case Else
vmatiere = ""
End Select
Do
vnombreds(vnummatiere) = vnombreds(vnummatiere) + 1
ActiveCell.Offset(1, 0).Activate
Loop Until vnummatiere <> ActiveCell.Offset(0, 3).Value Or velevetraite <> ActiveCell.Offset(0, 9).Value
vnombrenote = vnombrenote + vnombreds(vnummatiere)
If vmatiere <> "" Then
Worksheets(vnomfeuille).Activate
ActiveCell.Value = vmatiere
ActiveCell.Offset(0, vnombreds(vnummatiere) + 1).Activate
Worksheets("test").Activate
Else
'Mémorisation d'une valeur négative pour indiquer que cette matière n'est pas à traiter
vnombreds(vnummatiere) = -vnombreds(vnummatiere)
End If
Loop Until velevetraite <> ActiveCell.Offset(0, 9).Value
Worksheets(vnomfeuille).Activate
ActiveCell.Value = "Total sur 100"
ActiveCell.Offset(0, 1).Value = "Total sur 20"
'Retour au départ pour gérer la suite de l'entête
Range("B2").Activate
Worksheets("test").Activate
Range(vCellule).Activate
'Ajouter dans cette boucle, une boucle qui gère selon les matières (à la fin de chaque matière il faut ajouter une colonne moyenne) en utilisant le tableau vnummatiere où on a mémorisé le nombre de notes par matière
For vnummatiere = 1 To 10
'Pour chaque note de la matière
For j = 1 To vnombreds(vnummatiere)
i = 0
'Tant que la note est abs on passe à l'élève suivant pour la même matière
While ActiveCell.Offset(i, 6).Value = "abs"
i = i + vnombrenote
Wend
vsur = ActiveCell.Offset(i, 7).Value
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, 1).Activate
ActiveCell.Value = vsur
Worksheets("test").Activate
ActiveCell.Offset(1, 0).Activate
Next j
'Création de la colonne moyenne pour la matière
If vnombreds(vnummatiere) > 0 Then
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, 1).Activate
ActiveCell.Value = "Moy"
Worksheets("test").Activate
Else
ActiveCell.Offset(-vnombreds(vnummatiere), 0).Activate
End If
Next vnummatiere
'Retour au départ pour gérer les élèves (avant on ne fait que créer les entêtes des colonnes)
Worksheets(vnomfeuille).Activate
Range("A3").Activate
Worksheets("test").Activate
Range(vCellule).Activate
'Mémorisation du nombre d'élèves traités pour se repositionner dans les formules et savoir si on doit griser ou pas la ligne
velevetraite = 0
Do
velevetraite = velevetraite + 1
vnomeleve = ActiveCell.Offset(0, 1).Value
vprenomeleve = ActiveCell.Offset(0, 2).Value
Worksheets(vnomfeuille).Activate
ActiveCell.Value = vnomeleve
ActiveCell.Offset(0, 1).Value = vprenomeleve
'Permet de connaître le décalage à faire pour la mémorisation des valeurs
vDecalage = 2
Worksheets("test").Activate
'initialisation du compteur d'absence par matière et par éléve
Cpt_Abs = 0
'Pour chaque matière
For vnummatiere = 1 To 10
'Pour chaque ds de la matière
For j = 1 To vnombreds(vnummatiere)
vnote = ActiveCell.Offset(0, 6).Value
Worksheets(vnomfeuille).Activate
If vnote = "abs" Then
'Pour chaque matière on veut connaître le nombre d'absence
Cpt_Abs = Cpt_Abs + 1
ActiveCell.Offset(0, vDecalage).Value = ""
Else
ActiveCell.Offset(0, vDecalage).Value = vnote
End If
vDecalage = vDecalage + 1
Worksheets("test").Activate
ActiveCell.Offset(1, 0).Activate
Next j
'Si la matière est traitée, mémorisation des formules en fin de matière
If vnombreds(vnummatiere) > 0 Then
'Règle de gestion sur les absences
'pas d'absence (nombre de note - le compteur d'absence = nombre de note)
If vnombreds(vnummatiere) - Cpt_Abs = vnombreds(vnummatiere) Then
Worksheets(vnomfeuille).Activate
maformule = "=AVERAGE((SUM(RC[" & -vnombreds(vnummatiere) & "]:RC[-1])/AVERAGE(SUM(R[" & -velevetraite & "]C[" & -vnombreds(vnummatiere) & "]:R[" & -velevetraite & "]C[-1])))*10)"
'* Pas de note du tout => absent à tous les contrôles (=> le nombre de note s'anule avec le nombre s'absence)
ElseIf vnombreds(vnummatiere) - Cpt_Abs = 0 Then
maformule = """"
'* n absence sur y contrôles => nouvelle formule
Else
'* la moyenne est calculée sur (les n valeurs sommées divisée par les n diviseur de la matière le tout ramené à 10
'* (Somme(Aj:Aj)/(Notesur* cpt_abs))*10
maformule = "=(SUM(RC[" & -vnombreds(vnummatiere) & "]:RC[-1]))/((R[" & -velevetraite & "]C[" & -vnombreds(vnummatiere) & "])*" & Cpt_Abs & ")*10"
End If
'* Mise à jour de la cellule
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, vDecalage).FormulaR1C1 = maformule
vDecalage = vDecalage + 1
Worksheets("test").Activate
Else
ActiveCell.Offset(-vnombreds(vnummatiere), 0).Activate
End If
'* on réinitialise le compteur pour chaque nouveau traitement !
Cpt_Abs = 0
Next vnummatiere
'Mémorisation des formules en fin de ligne
Worksheets(vnomfeuille).Activate
ActiveCell.Offset(0, vDecalage).FormulaR1C1 = "somme" 'Mettre la formule pour calculer la somme de toutes les matières
ActiveCell.Offset(0, vDecalage + 1).FormulaR1C1 = "sur 20" 'Mettre la formule pour ramener la somme sur 20 points
ActiveCell.Offset(1, 0).Activate
Worksheets("test").Activate
Loop Until ActiveCell.Value <> vClasse
Loop Until ActiveCell.Value = ""
End Sub
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 28 janv. 2005 à 14:54
Salut,
Pas évident de répondre à ta question
Si ça ne marche pas tu peux essayer de remplacer tes Sum et AVG par
application.WorksheetFunction.Average(Arg1,Arg2,.......)
application.WorksheetFunction.Sum (Arg1, Arg2, ......)
c'est la methode normale pour appeller une fonction excel sous VBA
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 31 janv. 2005 à 14:58
vnombreds est un variable permettant de compter le nombrede ds pour la matiere et vnummatiere est le numero de la matiere
si tu prefere je recupere des notes dans un feuille excel a partir de acces et par la suite je recupere ces notes de cette feuille pour les mettre dans les bulletins
qui ce rempli automatiquement avec le code
donc j'ai un case moyenne qui aparait apres un nombre de notes qui peut etre varaible 10,20,30etc
et je voudrais calculer la moyenne
c'est a dire =SI(C:C="";"";MOYENNE((SOMME(C4:C4)/SOMME(C2:C2))*10))
a part que le c:c n'est pas valable ici mais c'est pour l'idee de la formule
en gros si une cellule est a blanc alor il ne faut pas que la note soit comptabiliser
ex j'ai 5 note
toute sur 20
mais une case est a blanc
au lieu de diviser le total par 100 il faut que je divise par 80
j'epsre avoir ete clair
la je viens de trouver une autre methode
je n'est plus le pb de #valeur dans la cellule excel il me calcule bien la moyenne mais le pb c'est qu'il me fais la somme de mes notes sur le total de notes
ex j'ai 20 note dont 3 blanche il m'additionne les 17 notes et me les divises par la somme des 20
madbob
Messages postés285Date d'inscriptiondimanche 14 décembre 2003StatutMembreDernière intervention13 mars 2012 31 janv. 2005 à 15:24
Oui... désolé tu t'es tapé une grosse page d'écriture pour pas grand chose ;-))))
car ça je pense que je comprend ...
Pas tout à fait quand même car j'ai au moins les élément pour le faire
En attendant, ce que je comprends pas c'est la notation RC[y] si tu
références une cellule y a un probleme..Partout la notation est
R[-13]C[-4] sauf là.
Hors t'a une erreur de #valeur... Donc Excel pige pas. non plus et moi toujours pas non plus
;-)
Là je dois sortir,
En rentrant j'essaye quelque chose si ce que je t'ai dit ne t'a toujours pas aidé.
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 31 janv. 2005 à 17:03
oki franchement la je suis bloquer et je m'en sort pas
pour moi le RC[ et bien il est ps bon du tout la
t'a raison je doit separe les ligne et les colonnes
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 31 janv. 2005 à 17:03
oki franchement la je suis bloquer et je m'en sort pas
pour moi le RC[ et bien il est ps bon du tout la
t'a raison je doit separe les ligne et les colonnes
je
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 31 janv. 2005 à 17:03
oki franchement la je suis bloquer et je m'en sort pas
pour moi le RC[ et bien il est ps bon du tout la
t'a raison je doit separe les ligne et les colonnes
je vien
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 31 janv. 2005 à 17:03
oki franchement la je suis bloquer et je m'en sort pas
pour moi le RC[ et bien il est ps bon du tout la
t'a raison je doit separe les ligne et les colonnes
je vien de
cs_guizmo59
Messages postés31Date d'inscriptionmardi 20 janvier 2004StatutMembreDernière intervention 9 mars 2006 31 janv. 2005 à 17:03
oki franchement la je suis bloquer et je m'en sort pas
pour moi le RC[ et bien il est ps bon du tout la
t'a raison je doit separe les ligne et les colonnes
je vien de voir