XL 2016 Les boucles

shanon7

XLDnaute Junior
Bonjour,

Je tente de faire ce petit exercice mais je bloque :

Ecrire une procédure qui permet de calculer la surface d’un rectangle tant que les valeurs de sa hauteur et de sa largeur situé dans les colonnes A et B sont connues (les cellules ne sont pas vides).

Voici ce que j'ai écrit :

Sub exo()
Dim longueur As double, largeur As double, aire As double, ligne As Integer, compteur As Integer
longueur = Cells(ligne, 1)
largeur = Cells(ligne, 2)
ligne = [D1]
For compteur = 1 To ligne
If Not IsEmpty(longueur) And Not IsEmpty(largeur) Then
aire = longueur * largeur
[D2] = aire
End If
Next
End Sub

Ce que j'ai essayé de faire est de dire que j'allais entrer une valeur <--> au n° de ligne que je voulais et l'entrer en D1. Donc par exemple écrire 2 en D1 pour que le programme comprenne qu'il faut tester les lignes 1 à 2 et voir si les cellules <--> à la longueur et à la largeur étaient vides. Ssi les 2 ne sont pas vides, il faut calculer l'aire et l'écrire par exemple en D2.

Ce programme ne marche pas et je vois bien que j'ai sûrement fait plein d'erreurs mais je ne vois pas où. Et surtout, je voulais faire comprendre au programme que si par exemple de A1 à B3 les cellules correspondantes sont toutes remplies, alors il faut calculer TOUTES les aires correspondant ( écrire le résultat de A1*B1 quelque part, celui de A2*B2 en dessous etc). Or je n'y parviens pas. Dans mon programme j'ai mis que l'aire serait à mettre en D2 mais à ce moment-là une seule aire ne pourra figurer alors que moi je veux avoir toutes les aires calculées.

Merci d'avance,

Shanon
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re Bonsoir Shanon,
Alors dans l'ordre :
1- Utilisez ici les balises </> pour mettre le code, c'est beaucoup plus lisible
2- Dans votre code vous utilisez la variable "ligne" deux fois .... avant de l'initialiser. :)
3- Pensez à indenter votre code c'est toujours plus lisible.
Donc cela pourrait donner ça :
VB:
Sub exo()
Dim longueur As Double, largeur As Double, aire As Double, ligne As Integer, compteur As Integer
ligne = [D1]   ' Initialisation de la ligne '
longueur = Cells(ligne, 1)
largeur = Cells(ligne, 2)
For compteur = 1 To ligne
    If Not IsEmpty(longueur) And Not IsEmpty(largeur) Then
        aire = longueur * largeur
        [D2] = aire
    End If
Next
End Sub
 

shanon7

XLDnaute Junior
Re Bonsoir Shanon,
Alors dans l'ordre :
1- Utilisez ici les balises </> pour mettre le code, c'est beaucoup plus lisible
2- Dans votre code vous utilisez la variable "ligne" deux fois .... avant de l'initialiser. :)
3- Pensez à indenter votre code c'est toujours plus lisible.
Donc cela pourrait donner ça :
VB:
Sub exo()
Dim longueur As Double, largeur As Double, aire As Double, ligne As Integer, compteur As Integer
ligne = [D1]   ' Initialisation de la ligne '
longueur = Cells(ligne, 1)
largeur = Cells(ligne, 2)
For compteur = 1 To ligne
    If Not IsEmpty(longueur) And Not IsEmpty(largeur) Then
        aire = longueur * largeur
        [D2] = aire
    End If
Next
End Sub
Bonsoir,

1- D'accord je prends note pour mes prochains posts ;)
2 -ah oui merci je n'avais pas tilté 😅

Et merci pour votre réponse, effectivement ce code est bien fonctionnel. En revanche, pouvez-vous m'indiquer svp s'il est possible/comment est-ce possible d'insérer les références relatives dans le code ? J m'explique : ici l'aire s'écrit en D2 (c'est ce que j'ai mis uniquement car je ne savais pas comment faire autrement, mais cela ne correspond pas au besoin exprimé dans l'exercice initial je pense) alors une seule aire ne pourra être saisie.

Comment faire pour que le programme fasse par exemple
A1 * B1 = x1
A2 * B2 = x2

Et écrive le contenu de x1 et x2 admettons respectivement en C1 et C2 ?

merci beaucoup !

Shanon
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Un exemple en PJ avec :
VB:
Sub CalculAire()
Dim DernLigne%, L%, S#
' On efface la colonne C ( dans le cas où des données auraient changé )
Range("C2:C1000").ClearContents
' On calcule la dernière ligne de la colonne A
DernLigne = Range("A65500").End(xlUp).Row
' On calcule les surfaces
For L = 2 To DernLigne
    ' On calcule la surface
    ' Par defaut une cellule vide pour VBA vaut 0
    S = Cells(L, "A") * Cells(L, "B")
    ' Si largeur ou longuer est absente on ne fait rien
    If S <> 0 Then
        ' On range la Surface calculée, et pour la frime on met l'unité
        Cells(L, "C") = Format(S, "0 cm²")
    End If
Next L
End Sub
 

Pièces jointes

  • Shanon.xlsm
    14.7 KB · Affichages: 10

shanon7

XLDnaute Junior
Un exemple en PJ avec :
VB:
Sub CalculAire()
Dim DernLigne%, L%, S#
' On efface la colonne C ( dans le cas où des données auraient changé )
Range("C2:C1000").ClearContents
' On calcule la dernière ligne de la colonne A
DernLigne = Range("A65500").End(xlUp).Row
' On calcule les surfaces
For L = 2 To DernLigne
    ' On calcule la surface
    ' Par defaut une cellule vide pour VBA vaut 0
    S = Cells(L, "A") * Cells(L, "B")
    ' Si largeur ou longuer est absente on ne fait rien
    If S <> 0 Then
        ' On range la Surface calculée, et pour la frime on met l'unité
        Cells(L, "C") = Format(S, "0 cm²")
    End If
Next L
End Sub
Bonjour !
J'ai réécrit le 1er code que j'avais effectué en utilisant la commande offset afin que chaque aire calculée apparaisse bien sur la ligne correspondante (et non pas que chaque nouvelle aire vienne écraser la précédente). Ce qui donne (dsl je n'arrive pas à insérer du code pour améliorer la lisibilité) :

Sub exo()
Dim longueur As Double, largeur As Double, aire As Double, ligne As Integer, compteur As Integer
ligne = [E2] + 1
longueur = Cells(ligne, 1)
largeur = Cells(ligne, 2)
For compteur = 1 To ligne
If Not IsEmpty(longueur) And Not IsEmpty(largeur) Then
aire = longueur * largeur
Cells(ligne - 1, 3).Offset(1, 0) = aire
End If
Next
End Sub


Cela fonctionne bien mais le code que vous avez posté est meilleur car il calcule toutes les aires en même temps sans que l'on ait besoin d'entrer un numéro de ligne à chaque fois :D

Bonne journée,

Shanon
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Shanon, le fil,

dans ton post #7, tu as écrit : « dsl je n'arrive pas à insérer du code pour améliorer la lisibilité » ; pour cela, clique sur l'icône « </> » du menu de la fenêtre de ton post en cours d'édition (c'est le 2ème icône à droite de celui que tu utilises pour mettre un smiley) ➯ fenêtre « Insérer du code » ; pour du code VBA, Langue doit être « VB », si c'est pas le cas, sélectionne-le dans la liste (il est en haut, juste sous « Langues communes ») ; mets ton code VBA dans le grand cadre bleu situé dessous (tu peux le taper s'il est court, ou faire un copier/coller) ; en bas, clique sur le bouton "Continuer" pour revenir à ton post ; tu peux aussi taper directement dans la fenêtre du post :

(CODE=vb]
'ici, ton code VBA
(/CODE]

mais en mettant un crochet gauche « [ » au lieu de la parenthèse gauche ; bien sûr, c'est plus rapide en utilisant l'icône « < / > » (il est là pour ça ! 😜).​

soan
 

shanon7

XLDnaute Junior
Bonjour Shanon, le fil,

dans ton post #7, tu as écrit : « dsl je n'arrive pas à insérer du code pour améliorer la lisibilité » ; pour cela, clique sur l'icône « </> » du menu de la fenêtre de ton post en cours d'édition (c'est le 2ème icône à droite de celui que tu utilises pour mettre un smiley) ➯ fenêtre « Insérer du code » ; pour du code VBA, Langue doit être « VB », si c'est pas le cas, sélectionne-le dans la liste (il est en haut, juste sous « Langues communes ») ; mets ton code VBA dans le grand cadre bleu situé dessous (tu peux le taper s'il est court, ou faire un copier/coller) ; en bas, clique sur le bouton "Continuer" pour revenir à ton post ; tu peux aussi taper directement dans la fenêtre du post :

(CODE=vb]
'ici, ton code VBA
(/CODE]

mais en mettant un crochet gauche « [ » au lieu de la parenthèse gauche ; bien sûr, c'est plus rapide en utilisant l'icône « < / > » (il est là pour ça ! 😜).​

soan
Bonjour,

Ah super je vous remercie!

Shanon
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Staple, le fil,

:eek: :eek: :eek: comment t'as fait pour que ça soit pas interprété comme des balises de code ? j'ai essayé d'faire pareil en mettant du gras et du violet ; ça marche pas ! ni avec ta balise de fin (/CODE=vb], ni avec ma balise de fin (/CODE] ! j'ai obtenu ceci :​

VB:
[/COLOR][/B]
Ici ligne code VBA
Ici ligne code VBA
Ici ligne code VBA
[B][COLOR=rgb(147, 101, 184)][/CODE=vb]

[CODE=vb][/COLOR][/B]
Ici ligne code VBA
Ici ligne code VBA
Ici ligne code VBA
[B][COLOR=rgb(147, 101, 184)]

:oops: t'es Gérard Majax ? 😅 Staple a fait un tour de magie ! 🤣

soan
 

soan

XLDnaute Barbatruc
Inactif
=>Staple

y'a p't'être un méta-caractère à mettre devant le [ pour qu'il soit pris littéralement, et pas interprété comme début de balise de code ? genre un accent circonflexe ? ou en doublant le crochet gauche ? ... non, j'viens d'essayer, ça marche pas ! ni l'accent circonflexe ^ ; ni le double-crochet [[

ah, ça y'est, j'ai trouvé ! c'est car ton javascript est désactivé ! ben si c'est ça, alors tant pis pour l'astuce ! j'préfère laisser mon javascript faire son job habituel ! 😄

soan
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

[aparté]
Non, aucune magie.
Simplement un esprit curieux qui depuis le temps qu'il est membre d'XLD a eu le temps de cliquer sur tous les liens* à disposition quand on arrive sur XLD.
(*): je parle des liens de l'interface Xenforo
[/aparté]
Comme on peut le voir ci-dessous ;)
Enrichi (BBcode):

Sub exo()
Dim longueur As Double, largeur As Double, aire As Double

Dim ligne As Long, compteur As Long

ligne = [E2] + 1
longueur = Cells(ligne, 1)
largeur = Cells(ligne, 2)
For compteur = 1 To ligne
If Not IsEmpty(longueur) And Not IsEmpty(largeur) Then
aire = longueur * largeur
Cells(ligne - 1, 3).Offset(1, 0) = aire
End If
Next
End Sub
Pour la question, j'ai changé les déclaration en Long
(au cas où il y aurait plus de 65536 lignes)
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 184
dernier inscrit
amiko