Problème de calcul

Résolu/Fermé
JinRo Messages postés 22 Date d'inscription mercredi 29 mai 2013 Statut Membre Dernière intervention 15 décembre 2013 - 29 mai 2013 à 01:21
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 31 mai 2013 à 14:10
Bonjour,

Je suis débutant en vba (je commence tout juste).
Mon problème est que j'ai un fichier qui fonctionne avec un userform dont les données sont insérée par ligne en fonction de la dernière ligne vide. Les données vont de la cellules A à CK pour ce qui est des colonnes.

l'un de mes calculs est le suivant : =SOMME(AE2:AF2;AJ2:AK2;AO2:AP2;AT2:AU2;AY2:AZ2;BD2:BE2;BI2:BJ2;BN2:BO2;BS2:BT2;BX2:BY2;CC2:CD2;CH2:CI2)

Si je le reproduis avec la macro, j'obtiens ceci :

ActiveCell.FormulaR1C1 = _
"=SUM(RC[4]:RC[5],RC[9]:RC[10],RC[14]:RC[15],RC[19]:RC[20],RC[24]:RC[25],RC[29]:RC[30],RC[34]:RC[35],RC[39]:RC[40],RC[44]:RC[45],RC[49]:RC[50],RC[54]:RC[55],RC[59]:RC[60])"
Range("AA2").Select
Selection.AutoFill Destination:=Range("AA2:AA23"), Type:=xlFillDefault
Range("AA2:AA23").Select
End Sub

Mais si j'utilise cette macro elle va me remplir la colonne AA2 avec cette formule et ce même si les lignes sont vides. Et lorsque j'utilise mon usf la nouvelle donnée que je dois insérer sera insérer après la dernière cellule contenant la formule en AA2 et non fonction de la dernière ligne vide.

J'ai essayé de reprendre ce code que l'on m'a montré pour un autre fichier qui marche :

Sub calcul()
Dim i&, fin&, aa
With Feuil1
fin = .Range("A" & Rows.Count).End(xlUp).Row
If fin <= 2 Then Exit Sub
aa = .Range("A2:Z" & fin)
For i = 2 To UBound(aa)
If aa(i, 9) <> "" Then aa(i, 6) = "En cours"
If aa(i, 17) <> "" Then aa(i, 6) = "Terminé"
Next i
.Range("A2").Resize(UBound(aa), UBound(aa, 2)).FormulaLocal = aa
End With

End Sub

et je l'ai adapté comme ceci :

Sub Calcul()

Dim i&, fin&, aa

With Feuil1
fin = .Range("A" & Rows.Count).End(xlUp).Row
If fin <= 2 Then Exit Sub
aa = .Range("A2:CK" & fin)
For i = 2 To UBound(aa)
aa(i, 27) = FormulaIC1 = "=sum(cells(i,31) + cells(i,32)+ cells(i,33) + cells(i,36)"
Next i
.Range("A2").Resize(UBound(aa), UBound(aa, 2)).FormulaLocal = aa
End With
End Sub

Mais là rien ne se produit et je n'ai aucun message d'erreur de la part du débogueur. Aucune des données n'est additionnée en AA2 et suivant.

Comment puis-je coder ma formule de façon à ce que si ma ligne est vide il n'y ait pas de formule insérée dans la ligne vide mais que pour les autres lignes qui sont remplies. Mon calcul se face en AA2 et suivant. J'ai essayé plusieurs variantes à FormulaR1C1 mais j'ai du me tromper quelques part.

Si quelqu'un pouvait avoir l'amabilité de me renseigner, cela me permettrai d'avancer dans mon travail et ma formation en autodidacte. Par ailleurs je pourrais peut-être également reproduire d'autres formules bien plus complexe en vba.
A voir également:

5 réponses

f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 1 708
29 mai 2013 à 09:21
Bonjour,

pourquoi ecrire une formule?????

aa(i, 27) = Sum(Cells(i, 31) + Cells(i, 32) + Cells(i, 33) + Cells(i, 36))

A voir
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
29 mai 2013 à 09:41
Bonjour,

Toujours se méfier des macros faites pour un autre besoin !

aa est un tableau et comporte toutes les cellules avec leur valeur pouquoi va tu rechercher les cellules ?

une piste non testée:

Option Explicit

Sub Calcul()
Dim Ligne As Integer, Fin As Integer, T_aa()

With Feuil1
     Fin = .Range("A" & Rows.Count).End(xlUp).Row
     If Fin <= 2 Then GoTo vide
          T_aa = .Range("A2:CK" & Fin).Value
          For Ligne = 2 To UBound(T_aa)
               T_aa(Ligne, 27) = T_aa(Ligne, 31) + T_aa(Ligne, 32) + T_aa(Ligne, 33) + T_aa(Ligne, 36)
          Next
     .Range("A2:CK" & Fin) = T_aa
End With
Exit Sub
vide:
MsgBox "tableau vide !", vbCritical
End Sub

0
JinRo Messages postés 22 Date d'inscription mercredi 29 mai 2013 Statut Membre Dernière intervention 15 décembre 2013
31 mai 2013 à 08:45
Bonjour à tous deux et merci de vos réponses.
Navré mais je réponds aussi vite que possible. (Bcp de choses à faire et vraiment très peu de temps !)

Pour ta réponse f 894009, étrangement il ne se passe rien... mais j'ai très probablement omis quelque chose...

Quant à ta solution michel_m, je l'ai testé et étrangement en ayant
des cellules remplies, je n'ai aucune addition qui s'exécute mais toujours la MsgBox qui s'affiche...

Mais après avoir validé j'ai remarqué que mes cellules contenant des données à additionner avaient toutes l'indication que des chiffrent étaient stockées sous forme de texte. Alors ok, je ne sais pas comment déclaré mes textes box en une fois pour qu'elle indiquent des chiffres sous formes de chiffres. J'ai vu qu'il y avait plusieurs façon de le faire. Mais je ne sais pas vraiment comment bien les appliquer. Alors j'ai voulu testé en effaçant les données insérées via USF et je les ai insérées manuellement. Là le tableau est tjrs vide... Alors je ne comprends pas bien d'où vient le problème.

Est-ce qu'il pourrait venir du code de l'USF ?

Le voici histoire que vous puissiez voir exactement ce que j'ai fait :

Dans le Module1 :

Option Explicit
Public aa
Public mem&
Public mem1 As Boolean
Option Base 1

Sub Buton1()
II.Show 0
End Sub

Sub Calcul()
Dim Ligne As Integer, Fin As Integer, T_aa()
With Feuil1
Fin = .Range("A" & Rows.Count).End(xlUp).Row
If Fin <= 2 Then GoTo vide
T_aa = .Range("A2:CK" & Fin).Value
For Ligne = 2 To UBound(T_aa)
T_aa(Ligne, 27) = T_aa(Ligne, 31) + T_aa(Ligne, 32) + T_aa(Ligne, 33) + T_aa(Ligne, 36)
Next
.Range("A2:CK" & Fin) = T_aa
End With
Exit Sub
vide:
MsgBox "tableau vide !", vbCritical
End Sub

Le code de l'USF :

Option Explicit
Option Base 1

Private Sub Bt1_Click()
Dim i&, lig&
If C1 = "" Or T2 = "" Or T1 = "" Then MsgBox "Veuillez SVP remplir avant de Valider!!", , "Manque d'informations": Exit Sub
With Feuil1
lig = Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1
Feuil1.Cells(lig, 1) = T1: Feuil1.Cells(lig, 4) = T3: T1 = "": T3 = ""
Feuil1.Cells(lig, 3) = T2: Feuil1.Cells(lig, 5) = C2: T2 = "": C2 = ""
Feuil1.Cells(lig, 6) = C3: Feuil1.Cells(lig, 7) = T4: C3 = "": T4 = ""
Feuil1.Cells(lig, 8) = T5: Feuil1.Cells(lig, 9) = C4: T5 = "": C4 = ""
Feuil1.Cells(lig, 2) = C1: C1 = ""
For i = 6 To 85
Feuil1.Cells(lig, i + 4) = Controls("T" & i): Controls("T" & i) = ""
Next i
End With
End Sub

Private Sub Bt2_Click()

Dim i&, lig&
If C1.ListIndex = -1 Then MsgBox "Vous n'avez choisi aucun nom dans la liste", , "Modifications Impossible": Exit Sub
lig = C1.List(C1.ListIndex, 1)
With Feuil1
Feuil1.Cells(lig, 1) = T1: Feuil1.Cells(lig, 4) = T3: T1 = "": T3 = ""
Feuil1.Cells(lig, 3) = T2: Feuil1.Cells(lig, 5) = C2: T2 = "": C2 = ""
Feuil1.Cells(lig, 6) = C3: Feuil1.Cells(lig, 7) = T4: C3 = "": T4 = ""
Feuil1.Cells(lig, 8) = T5: Feuil1.Cells(lig, 9) = C4: T5 = "": C4 = ""
Feuil1.Cells(lig, 2) = C1: C1 = ""
For i = 6 To 85
Feuil1.Cells(lig, i + 4) = Controls("T" & i): Controls("T" & i) = ""
Next i
End With
End Sub

Private Sub Bt5_Click()
Unload Me
End Sub

Private Sub C1_Click()
Dim i&, lig&
If C1.ListIndex = -1 Then Exit Sub
lig = C1.List(C1.ListIndex, 1)
T1 = Feuil1.Cells(lig, 1): T2 = Feuil1.Cells(lig, 3)
T3 = Feuil1.Cells(lig, 4): C2 = Feuil1.Cells(lig, 5)
C3 = Feuil1.Cells(lig, 6): T4 = Feuil1.Cells(lig, 7)
T5 = Feuil1.Cells(lig, 8): C4 = Feuil1.Cells(lig, 9)
For i = 6 To 85
Controls("T" & i) = Feuil1.Cells(lig, i + 4)
Next i
End Sub


Private Sub UserForm_Initialize()
Dim i&, Fin&, bb, cc

With Feuil1
aa = .Range("A2:CK" & .Range("A" & Rows.Count).End(xlUp).Row)
For i = 1 To UBound(aa)
aa(i, 85) = i + 1
Next i
cc = .Range("B2:C" & .Range("A" & Rows.Count).End(xlUp).Row)
For i = 1 To UBound(cc)
cc(i, 2) = i + 1
Next i
C1.List = cc
End With
With Sheets("Base")
bb = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
C4.List = bb
bb = .Range("B2:B" & .Range("B" & Rows.Count).End(xlUp).Row)
C2.List = bb
bb = .Range("C2:C" & .Range("C" & Rows.Count).End(xlUp).Row)
C3.List = bb

End With
End Sub



Comme je l'ai déjà dit, je débute, je bouquine et je regarde pas mal d'autres fichier déjà créer pour essayer de comprendre et d'adapter ce que je vois. Je sais que ce n'est pas la meilleure façon de faire. Malheureusement pour le moment je ne peux pas réellement me former autrement. Par conséquent, je vous remercie de votre indulgence quant à mes erreurs de débutants et de compréhension ainsi que de votre patience.
0
f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 1 708
Modifié par f894009 le 31/05/2013 à 09:10
Bonjour,

C'est michel_m qui donne la bonne solution et moi a cote de mes pompes sur ce coup la
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
31 mai 2013 à 12:17
Bonjour

pourquoi aa dans les déclarations puisque tu utilises T_aa la déclaration que j'avais indiqué était T_aa(), les parenthèses ont leur importance

d'autre part, dans tout code, il est INDISPENSABLE de faciliter un max la maintenance et que le type des variables et de leurs propriétés et méthodes soient intuitivement reconnaissables

le i& sent son GWbasic des années 80 et i as integer est préférable à l'ésotérique "i&", bien que les variables à une lettre soient mal vues mais utilisées m^me par Microsoft

dans tes codes quès aco C, T ?
aa, bb, cc.... il ya des noms plus explicites par ex fin ou derlig....

quant à II.Show 0 j'avoue que je ne comprends pas II: userform ? 0: faut que je regarde un bouquin: hide ? ce n'est pas unload puisque tu l'utilises dans un autre code

tout cela semble être - à tort, certes-le boulot bâclé et inutilement ésotérique

enfin, un Textbox (les T;;?) renvoient du texte donc...

voilà, excuses moi d'être un peu sec, mais tu as la réaction du service maintenance: dans ton boulot c'est la plus importante et le jugement est durable...

Donc, clarifie tout ça et reviens si tu as toujours des problèmes, ça me fera plaisir de t'aider
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JinRo Messages postés 22 Date d'inscription mercredi 29 mai 2013 Statut Membre Dernière intervention 15 décembre 2013
31 mai 2013 à 12:48
Rebonjour Michel_m,

Pas de soucis sur ta façon de me répondre, je comprends bien ce que tu me dis. Malheureusement, comme je l'ai dit je me forme en autodidacte.

Le code que tu vois est le résultat d'une aide que j'ai eu par un informaticien.
Il avait dit que m'a façon de faire ressemblait trop à ce qu'il y avait dans les livres actuels et qu'il y avait trop d'information. Et m'a montré cette façon de faire qui me semblait assez simple et logique pour quelqu'un qui comme moi débute.

Excuse moi si j'ai planté les () et je vais essayer de répondre à certaines de tes intérogations.

aa, bb, cc font références à des plages de données spécifiques. Car visiblement faire des listes par codes vba n'est pas très sür... pour certaines choses... (Explications succinte que j'ai eu...) SVP me demande pas quoi.

Je sais que les textebox font références à du texte d'où ma question comment bien codé la chose pour que ça soit des chiffres pour les textbox qui doivent renvoyé uniquement des chiffres et pour que les autres renvoient du text. le format. #.## par exemple ou comment déclaré une variable qui va pour tout.

le II est le nom donné au USF.

Encore fois, désolé pour ce travail ésotrique baclé mais quand tu reçois de l'aide dans un domaine que tu ne connais pas tu n'es pas bon juge.

Là, j'essais de me former quelque peu en vba car ça m'intéresse vraiment et que j'ai des fichiers qui sont une horreur à utiliser de par le fait des nombreuses feuilles et autres d'où le fait que j'essais de créer quelque chose de plus fonctionnel et visuelle.

Je vais essayer de refaire quelque chose en repartant à zéro. Et si tu es d'accord j'essairai de te le ressoumettre pour correction.

Merci encore.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 302
31 mai 2013 à 14:10
OK, pas de problème
0