Range VS Function..
Résolu/Fermé
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
-
17 juin 2013 à 11:49
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 20 juin 2013 à 10:08
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 20 juin 2013 à 10:08
A voir également:
- Range VS Function..
- Udp vs tcp - Guide
- Vba range avec variable ✓ - Forum VB / VBA
- Mo vs mb ✓ - Forum Matériel & Système
- Out of range ✓ - Forum Matériel & Système
- Naruto vs pain épisode netflix ✓ - Forum Cinéma / Télé
13 réponses
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
Modifié par Patrice33740 le 17/06/2013 à 14:03
Modifié par Patrice33740 le 17/06/2013 à 14:03
Sans le code complet (déclarations de variables compris) c'est difficile de répondre.
« Celle-ci fonctionne je crois. » : Je crois pas !
Ces lignes ne doivent probablement pas fonctionner :
Set plage = Plage_15
Set plage = Plage_20
« j'ai déclaré les variables en haut du module, puisque j'ai différentes procédures/fonctions » : A mon avis ce n'est pas une raison valable : ce qui est important c'est de définir les variables selon leur portée, limitée au strict nécessaire : procédure ou fonction, module, projet (classeur) ou projets (tous les classeurs). Voir :
https://support.microsoft.com/fr-fr/help/462333
Patrice
« Celle-ci fonctionne je crois. » : Je crois pas !
Ces lignes ne doivent probablement pas fonctionner :
Set plage = Plage_15
Set plage = Plage_20
« j'ai déclaré les variables en haut du module, puisque j'ai différentes procédures/fonctions » : A mon avis ce n'est pas une raison valable : ce qui est important c'est de définir les variables selon leur portée, limitée au strict nécessaire : procédure ou fonction, module, projet (classeur) ou projets (tous les classeurs). Voir :
https://support.microsoft.com/fr-fr/help/462333
Patrice
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
1
17 juin 2013 à 14:58
17 juin 2013 à 14:58
Bonjour, tout d'abord, merci pour votre réponse
Il y avait effectivement un soucis pour les plages (il me semblait que non, ayant fait des tests précédemment, mais...).
Pour la déclaration, j'ai mis les variables en private (pour être sûr qu'elles soient dans le module entier) mais je ne peux toujours pas faire: Range("plage_calcul").select sans erreur
Le principe du programme est le suivant: j'ai une feuille excel avec l'ensemble des tables de multiplications de 1 à 20. Je souhaite envoyer des inputbox avec des calculs. Au démarrage, on peut choisir une plage de calcul (10, 15 ou 20), c'est d'ailleurs là que se situent mes soucis comme: les variables "ligneMin" et "ligneMax" correspondent aux bornes de la plage (donc ligne des multiples de 1 jusqu'à la ligne des multiples de 10/15/20). La var ligneMax se trouvent être égal à 20... Ce qui n'est absolument pas logique (pour les multiples de 10, la ligne est 41).
Enfin, ce qui n'est actuellement pas encore dans le programme, je compte colorer les cases répondues en rouge/vert mais le soucis n'est pas là.
Voici le module (j'ai bien sûr rajouté les traits/tirets pour faciliter la lisibilité sur le site):
A noter que les différentes plages (Tables, Plage_10...) sont des plages présentes sur la feuille excel que je n'ai donc pas eu à définir dans VBA
Option Explicit
Private pallier As Byte
Private plage_calcul As Range
Private ligneMin, ligneMax
Private answer As Variant
Private multi As Double, txt_multi As String
Private cellquest As Range, cellrep As Range
Private quest As String
Private colonne As Double, ligne As Double
Private feuilMulti As Worksheet
---------------------------------------------------------------------
Sub calcul()
Dim nb_base As Double, nb_multi As Double
ActiveWorkbook.Sheets("Multiplications").Visible = True
Set feuilMulti = Sheets("Multiplications")
Range("Tables").Font.ColorIndex = 33 'réinitialise la couleur des tables en bleu
Call choix_pallier
Do
nb_base = calcul_nb(pallier) 'calcul le nb à partir du pallier
nb_multi = calcul_nb(pallier) 'idem
txt_multi = nb_base & " x " & nb_multi
ligne = 1
colonne = 1
Set cellquest = feuilMulti.Cells(ligne, colonne)
Do Until quest = txt_multi
For colonne = 1 To 15 Step 3
For ligne = 1 To ligneMax
Set cellquest = feuilMulti.Cells(ligne, colonne)
quest = cellquest.Value
Next ligne
Next colonne
Loop
answer = InputBox(quest)
Loop While answer <> "escape"
ActiveWorkbook.Sheets("Multiplications").Visible = True
ActiveWorkbook.Sheets("Multiplications").Activate
End Sub
--------------------------------------------------------------------------------
Sub choix_pallier()
pallier = InputBox("Choississez votre pallier: 10 / 15 / 20") 'pour choisir la table max
Do While pallier <> 10 And pallier <> 15 And pallier <> 20 'si erreur
MsgBox ("Entrée incorrecte")
pallier = InputBox("Choississez votre pallier: 10 / 15 / 20")
Loop
Set plage_calcul = plage(pallier) 'défini la plage de calcul
'Range("plage_calcul").Select
ligneMin = plage_calcul.End(xlUp).Row
ligneMax = plage_calcul.End(xlDown).Row
End Sub
--------------------------------------------------------------------------------
Function plage(nb As Byte) As Range
If nb = 10 Then
Set plage = Range("Plage_10")
ElseIf nb = 15 Then
Set plage = Range("Plage_15")
ElseIf nb = 20 Then
Set plage = Range("Plage_20")
End If
End Function
-------------------------------------------------------------------------------
Function calcul_nb(nb As Byte) As Double
If nb = 10 Then
calcul_nb = Int(1 + Rnd * 10)
ElseIf nb = 15 Then
calcul_nb = Int(1 + Rnd * 15)
ElseIf nb = 20 Then
calcul_nb = Int(1 + Rnd * 20)
End If
End Function
Merci d'avance
Il y avait effectivement un soucis pour les plages (il me semblait que non, ayant fait des tests précédemment, mais...).
Pour la déclaration, j'ai mis les variables en private (pour être sûr qu'elles soient dans le module entier) mais je ne peux toujours pas faire: Range("plage_calcul").select sans erreur
Le principe du programme est le suivant: j'ai une feuille excel avec l'ensemble des tables de multiplications de 1 à 20. Je souhaite envoyer des inputbox avec des calculs. Au démarrage, on peut choisir une plage de calcul (10, 15 ou 20), c'est d'ailleurs là que se situent mes soucis comme: les variables "ligneMin" et "ligneMax" correspondent aux bornes de la plage (donc ligne des multiples de 1 jusqu'à la ligne des multiples de 10/15/20). La var ligneMax se trouvent être égal à 20... Ce qui n'est absolument pas logique (pour les multiples de 10, la ligne est 41).
Enfin, ce qui n'est actuellement pas encore dans le programme, je compte colorer les cases répondues en rouge/vert mais le soucis n'est pas là.
Voici le module (j'ai bien sûr rajouté les traits/tirets pour faciliter la lisibilité sur le site):
A noter que les différentes plages (Tables, Plage_10...) sont des plages présentes sur la feuille excel que je n'ai donc pas eu à définir dans VBA
Option Explicit
Private pallier As Byte
Private plage_calcul As Range
Private ligneMin, ligneMax
Private answer As Variant
Private multi As Double, txt_multi As String
Private cellquest As Range, cellrep As Range
Private quest As String
Private colonne As Double, ligne As Double
Private feuilMulti As Worksheet
---------------------------------------------------------------------
Sub calcul()
Dim nb_base As Double, nb_multi As Double
ActiveWorkbook.Sheets("Multiplications").Visible = True
Set feuilMulti = Sheets("Multiplications")
Range("Tables").Font.ColorIndex = 33 'réinitialise la couleur des tables en bleu
Call choix_pallier
Do
nb_base = calcul_nb(pallier) 'calcul le nb à partir du pallier
nb_multi = calcul_nb(pallier) 'idem
txt_multi = nb_base & " x " & nb_multi
ligne = 1
colonne = 1
Set cellquest = feuilMulti.Cells(ligne, colonne)
Do Until quest = txt_multi
For colonne = 1 To 15 Step 3
For ligne = 1 To ligneMax
Set cellquest = feuilMulti.Cells(ligne, colonne)
quest = cellquest.Value
Next ligne
Next colonne
Loop
answer = InputBox(quest)
Loop While answer <> "escape"
ActiveWorkbook.Sheets("Multiplications").Visible = True
ActiveWorkbook.Sheets("Multiplications").Activate
End Sub
--------------------------------------------------------------------------------
Sub choix_pallier()
pallier = InputBox("Choississez votre pallier: 10 / 15 / 20") 'pour choisir la table max
Do While pallier <> 10 And pallier <> 15 And pallier <> 20 'si erreur
MsgBox ("Entrée incorrecte")
pallier = InputBox("Choississez votre pallier: 10 / 15 / 20")
Loop
Set plage_calcul = plage(pallier) 'défini la plage de calcul
'Range("plage_calcul").Select
ligneMin = plage_calcul.End(xlUp).Row
ligneMax = plage_calcul.End(xlDown).Row
End Sub
--------------------------------------------------------------------------------
Function plage(nb As Byte) As Range
If nb = 10 Then
Set plage = Range("Plage_10")
ElseIf nb = 15 Then
Set plage = Range("Plage_15")
ElseIf nb = 20 Then
Set plage = Range("Plage_20")
End If
End Function
-------------------------------------------------------------------------------
Function calcul_nb(nb As Byte) As Double
If nb = 10 Then
calcul_nb = Int(1 + Rnd * 10)
ElseIf nb = 15 Then
calcul_nb = Int(1 + Rnd * 15)
ElseIf nb = 20 Then
calcul_nb = Int(1 + Rnd * 20)
End If
End Function
Merci d'avance
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
Modifié par Patrice33740 le 17/06/2013 à 15:24
Modifié par Patrice33740 le 17/06/2013 à 15:24
C'est un problème de syntaxe :
Range("plage_calcul").select sélectionne la "plage nommée" (la plage dont le nom est) plage_calcul
et
plage_calcul.select sélectionne la plage correspondant à la variable (range) dont le nom est plage_calcul
Patrice
Range("plage_calcul").select sélectionne la "plage nommée" (la plage dont le nom est) plage_calcul
et
plage_calcul.select sélectionne la plage correspondant à la variable (range) dont le nom est plage_calcul
Patrice
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
1
17 juin 2013 à 21:09
17 juin 2013 à 21:09
Effectivement
Mais qu'en est-il des var ligneMin et Max? Je ne comprends pas
Mais qu'en est-il des var ligneMin et Max? Je ne comprends pas
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 juin 2013 à 22:48
17 juin 2013 à 22:48
ligneMin = plage_calcul.Row
ligneMax = ligneMin + plage_calcul.Rows - 1
ligneMax = ligneMin + plage_calcul.Rows - 1
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
Modifié par eriiic le 18/06/2013 à 12:17
Modifié par eriiic le 18/06/2013 à 12:17
Bonjour,
Ca vaut vraiment le coup de faire une fonction pour la plage ?
Set plage_calcul= Range("Plage_" & pallier) ne marche pas ?
Même remarque pour calcul_nb()
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Ca vaut vraiment le coup de faire une fonction pour la plage ?
Set plage_calcul= Range("Plage_" & pallier) ne marche pas ?
Même remarque pour calcul_nb()
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
1
18 juin 2013 à 12:42
18 juin 2013 à 12:42
Ah oui, effectivement Eric, ça allège grandement le programme. Je n'avais pas du tout pensé ainsi.
Et Patrice, il s'est avérait que mon soucis venait du fait qu'il y avait des sauts de lignes dans mon tableau (pour gagner en lisibilité) ce qui coupait les plages et faussait ma ligneMax
Néanmoins, les espaces maintenant retirés, j'ai encore un soucis...
Mais avant, je vais vous expliquer comment se présente ma feuille (ce sera plus simple à visualiser):
Il y a donc 20 tables en tout, toutes les 5 tables, je met les suivantes en dessous (plutôt que les mettre chacune à la suite ce qui rendrait la visualisation un peu embêtante)
Ainsi: la plage (A1:N20) regroupe les tables de 1 à 5, (A1:N40) celles de 1 à 10 et ainsi de suite.
Mon soucis est le suivant: quand bien même je définis les différentes plages (10: A1:N40; 15: A1:N60 et 25: A1:N80), lorsque je fais l'instruction suivante: "ligneMax = plage_calcul.end(xldown).row, je me retrouve toujours avec 80 alors que la plage est censée être Plage_10... donc ligneMax devrait rendre 40.
Encore une fois, merci beaucoup pour votre aide qui m'est précieuse.
Et Patrice, il s'est avérait que mon soucis venait du fait qu'il y avait des sauts de lignes dans mon tableau (pour gagner en lisibilité) ce qui coupait les plages et faussait ma ligneMax
Néanmoins, les espaces maintenant retirés, j'ai encore un soucis...
Mais avant, je vais vous expliquer comment se présente ma feuille (ce sera plus simple à visualiser):
Il y a donc 20 tables en tout, toutes les 5 tables, je met les suivantes en dessous (plutôt que les mettre chacune à la suite ce qui rendrait la visualisation un peu embêtante)
Ainsi: la plage (A1:N20) regroupe les tables de 1 à 5, (A1:N40) celles de 1 à 10 et ainsi de suite.
Mon soucis est le suivant: quand bien même je définis les différentes plages (10: A1:N40; 15: A1:N60 et 25: A1:N80), lorsque je fais l'instruction suivante: "ligneMax = plage_calcul.end(xldown).row, je me retrouve toujours avec 80 alors que la plage est censée être Plage_10... donc ligneMax devrait rendre 40.
Encore une fois, merci beaucoup pour votre aide qui m'est précieuse.
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
18 juin 2013 à 14:45
18 juin 2013 à 14:45
Sans le fichier cela devient difficile, mets ton fichier sur https://www.cjoint.com/ et colle le lien dans ton prochain post.
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
1
18 juin 2013 à 18:01
18 juin 2013 à 18:01
Le voilà: https://www.cjoint.com/?0Fsr7m3y9w2
Le module et la feuille en question sont "Multiplications". Les autres ne nous intéressent pas
Merci encore
Le module et la feuille en question sont "Multiplications". Les autres ne nous intéressent pas
Merci encore
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
18 juin 2013 à 23:48
18 juin 2013 à 23:48
Re,
Je voudrais comprendre ce que tu veux faire exactement.
D'après ce que je comprends :
* demander le résultats de multiplications tirées au hasard parmi celles dont la réponse n'est pas validée définitivement en vert.
* lorsque le résultat est correct :
- si la question n'a pas été posée ou si sa réponse était erronée, valider provisoirement cette réponse en vert clair ;
- si la réponse était déjà validée provisoirement, la valider définitivement (vert)
* sinon si le résultat est erroné, le mémoriser en rouge.
Il y a 3 niveaux de difficulté que j'ai du mal à cerner :
pallier 10 : multiplications de 1x1 à 10x10 ou peut-être à 10x20 mais c'est pas très logique
pallier 15 : multiplications de 1x1 à 15x15 ou peut-être à 15x20 ?
pallier 20 : multiplications de 1x1 à 20x20
Je ne sais pas quand est-ce qu'on s'arrête.
A la fin du test on affiche le résultat
Patrice
Je voudrais comprendre ce que tu veux faire exactement.
D'après ce que je comprends :
* demander le résultats de multiplications tirées au hasard parmi celles dont la réponse n'est pas validée définitivement en vert.
* lorsque le résultat est correct :
- si la question n'a pas été posée ou si sa réponse était erronée, valider provisoirement cette réponse en vert clair ;
- si la réponse était déjà validée provisoirement, la valider définitivement (vert)
* sinon si le résultat est erroné, le mémoriser en rouge.
Il y a 3 niveaux de difficulté que j'ai du mal à cerner :
pallier 10 : multiplications de 1x1 à 10x10 ou peut-être à 10x20 mais c'est pas très logique
pallier 15 : multiplications de 1x1 à 15x15 ou peut-être à 15x20 ?
pallier 20 : multiplications de 1x1 à 20x20
Je ne sais pas quand est-ce qu'on s'arrête.
A la fin du test on affiche le résultat
Patrice
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
1
19 juin 2013 à 01:17
19 juin 2013 à 01:17
C'est à peu près ça...
Dans l'idée, je souhaite m'entraîner au calcul mental. Donc en clair, il n'y a pas d'arrêt (sauf si on écrit "escape").
L'idée c'est qu'il y a 2 niveaux de vert: au deuxième niveau (définitif donc, vert foncé), ce calcul n'est plus proposé. Autrement, si c'est faux, le calcul devient rouge. Cela permet de ne pas avoir sans cesse les mêmes, mais de voir si on a bien la bonne réponse quand même
Pour la difficulté: ce sont les tables de 1 à 10, 1 à 15 et 1 à 20. Ce qui, je vous l'accorde, n'est pas du tout bien représenté dans la disposition de l'ensemble des tables. Mais le calcul dépend des plages, du coup même si la disposition laisse à désirer, ce que je souhaite établir est quand même là.
Et pour l'affichage du test à la fin, c'est juste un petit détail. Il s'avère que quand la réponse est fausse, le calcul est rouge ==> msgbox; donc si on écrit "escape" ==> msgbox. Mais ce n'est pas vraiment important
Dans l'idée, je souhaite m'entraîner au calcul mental. Donc en clair, il n'y a pas d'arrêt (sauf si on écrit "escape").
L'idée c'est qu'il y a 2 niveaux de vert: au deuxième niveau (définitif donc, vert foncé), ce calcul n'est plus proposé. Autrement, si c'est faux, le calcul devient rouge. Cela permet de ne pas avoir sans cesse les mêmes, mais de voir si on a bien la bonne réponse quand même
Pour la difficulté: ce sont les tables de 1 à 10, 1 à 15 et 1 à 20. Ce qui, je vous l'accorde, n'est pas du tout bien représenté dans la disposition de l'ensemble des tables. Mais le calcul dépend des plages, du coup même si la disposition laisse à désirer, ce que je souhaite établir est quand même là.
Et pour l'affichage du test à la fin, c'est juste un petit détail. Il s'avère que quand la réponse est fausse, le calcul est rouge ==> msgbox; donc si on écrit "escape" ==> msgbox. Mais ce n'est pas vraiment important
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
19 juin 2013 à 16:07
19 juin 2013 à 16:07
Regarde si cela convient :
https://www.cjoint.com/?CFtqfp7Eotd
Arrêt du test : bouton Annuler ou toutes les réponses bonnes (2 fois)
https://www.cjoint.com/?CFtqfp7Eotd
Arrêt du test : bouton Annuler ou toutes les réponses bonnes (2 fois)
Bobbyli
Messages postés
220
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
3 janvier 2016
1
20 juin 2013 à 10:03
20 juin 2013 à 10:03
Bonjour!
C'est très intéressant comme manière de procédé, il me faut du temps pour bien comprendre le procédé, mais au test, cela reprend convenablement ce que j'ai essayé de mettre en place
Je vous remercie encore une fois beaucoup pour la grande aide que vous m'avez apporté
Il ne me reste plus qu'à cliquer sur le bouton "Résolu"!
C'est très intéressant comme manière de procédé, il me faut du temps pour bien comprendre le procédé, mais au test, cela reprend convenablement ce que j'ai essayé de mettre en place
Je vous remercie encore une fois beaucoup pour la grande aide que vous m'avez apporté
Il ne me reste plus qu'à cliquer sur le bouton "Résolu"!
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
20 juin 2013 à 10:08
20 juin 2013 à 10:08
De rien, au plaisir de te relire sur le Forum